{"id":1147,"date":"2016-08-23T16:15:06","date_gmt":"2016-08-23T14:15:06","guid":{"rendered":"http:\/\/invidit.de\/blog\/?p=1147"},"modified":"2016-08-09T16:13:40","modified_gmt":"2016-08-09T14:13:40","slug":"auf-die-andere-seite","status":"publish","type":"post","link":"https:\/\/invidit.de\/blog\/auf-die-andere-seite\/","title":{"rendered":"Auf die andere Seite"},"content":{"rendered":"<p>Hallo Spa\u00df-Coder.<\/p>\n<p>Das n\u00e4chste <em>Entwurfsmuster <\/em>in unserer Reihe ist erneut aus der Kategorie der <em>Strukturmuster.<\/em> Wir besch\u00e4ftigen uns diesmal mit der<strong> Br\u00fccke <\/strong>(engl. Bridge). Auch dieses Muster stammt aus der Sammlung der Gang of Four.<\/p>\n<p>&nbsp;<\/p>\n<h1>Wie funktioniert die Br\u00fccke?<\/h1>\n<p>Wir haben uns durch das Prinzip &#8222;Program to the interface&#8220; bereits daran gew\u00f6hnt, dass wir unsere Implementierung \u00fcber Schnittstellen abstrahieren um die Wiederverwendbarkeit zu gew\u00e4hrleisten. Die Br\u00fccke dient nun dazu, nicht nur die Implementierung zu variieren, sondern dies auch f\u00fcr die Abstraktion, also die Schnittstelle, zu erm\u00f6glichen.<\/p>\n<p>Dazu werden sowohl die Abstraktionsschicht, als auch die Implementierungsschicht noch einmal abstrahiert und anschlie\u00dfend \u00fcber eine 1:1 Verbindung dieser Abstraktionen wieder miteinander verbunden.<\/p>\n<p>&nbsp;<\/p>\n<h1>Ein Beispiel<\/h1>\n<p>Nehmen wir einmal an, wir m\u00f6chten Daten aus einem externen System an unsere Anwendung anbinden. Das externe System tauscht mit uns Daten \u00fcber eine REST-Schnittstelle in Form von JSON aus. Leider \u00e4ndert der Hersteller des anderen Systems die Schnittstelle in regelm\u00e4\u00dfigen Abst\u00e4nden, um sie um Funktionen zu erweitern. Unsere Anwendung soll aber nun abw\u00e4rtskompatibel mit allen Schnittstellen zurecht kommen und wir m\u00f6chten unsere internen Abl\u00e4ufe nicht anpassen m\u00fcssen, wenn die Schnittstelle um eine Funktion erweitert wird, die wir gar nicht verwenden m\u00f6chten.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/invidit.de\/blog\/wp-content\/uploads\/2016\/07\/BridgePatternExampleUML.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1192\" src=\"http:\/\/invidit.de\/blog\/wp-content\/uploads\/2016\/07\/BridgePatternExampleUML.png\" alt=\"BridgePatternExampleUML\" width=\"762\" height=\"421\" srcset=\"https:\/\/invidit.de\/blog\/wp-content\/uploads\/2016\/07\/BridgePatternExampleUML.png 762w, https:\/\/invidit.de\/blog\/wp-content\/uploads\/2016\/07\/BridgePatternExampleUML-300x166.png 300w\" sizes=\"(max-width: 762px) 100vw, 762px\" \/><\/a><\/p>\n<p>&#8222;Extern&#8220; spricht nun in den jeweiligen Implementierungen (V2 oder V3) mit der externen Anwendung. M\u00f6chten wir hingegen unsere Schnittstelle \u00e4ndern, passen wir &#8222;Daten&#8220; an. Durch die Entkopplung hat dies keinen Einfluss auf die externe Anwendung.<\/p>\n<p>Wichtig zum Verst\u00e4ndnis ist, dass alle hier verwendeten Klassen in unserer Hoheit liegen. Die tats\u00e4chliche externe Anwendung wird in den Implementierungen verwendet (hier: ExternV2 und ExternV3).<\/p>\n<p>&nbsp;<\/p>\n<p>F\u00fcr alle, die noch ein wenig tiefer graben m\u00f6chten haben wir auch wieder Beispielcode. Zu finden ist er wie immer in unserem GitHub-Repository<sup>[1]<\/sup> und basiert auf dem im Artikel <a href=\"http:\/\/invidit.de\/blog\/das-eckige-muss-in-das-runde-aber-das-passt-doch-gar-nicht\/\">Das Eckige muss in das Runde &#8230; aber das passt doch gar nicht!<\/a> aufgef\u00fchrtem Beispiel einer Finanzverwaltung um Ein- und Ausgaben zu dokumentieren und auswerten zu k\u00f6nnen.<\/p>\n<p>&nbsp;<\/p>\n<h1>Wann ist die Br\u00fccke sinnvoll anzuwenden?<\/h1>\n<p>Immer dann, wenn wir bei der Implementierung bereits absehen k\u00f6nnen, dass sich die Abstraktionsschicht voraussichtlich ebenfalls \u00e4ndern wird, ist es sinnvoll, die Br\u00fccke zu verwenden. Tats\u00e4chlich k\u00f6nnen wir die Br\u00fccke auch recht leicht noch nachtr\u00e4glich hinzuf\u00fcgen, wenn wir zun\u00e4chst nur die Implementierung abstrahiert haben.<\/p>\n<p>&nbsp;<\/p>\n<h1>Zusammenfassung<\/h1>\n<p>Wir hoffen, das wir euch eine Br\u00fccke bauen konnten, die euch vielleicht in Zukunft sicheren und trockenen Fu\u00dfes auf die andere Seite einer Schnittstelle bringen wird.<\/p>\n<p>Mit Hilfe der Br\u00fccke k\u00f6nnen wir flexibler auf Situationen reagieren, in denen sich sowohl die Implementierung, als auch die Abstraktion \u00e4ndert. Dies ist insbesondere dann von Vorteil, wenn wir externe Schnittstellen anbinden m\u00fcssen, auf die wir nicht unbedingt Einfluss haben.<\/p>\n<p>Die Implementierung der Br\u00fccke f\u00fchrt zu einer h\u00f6heren Komplexit\u00e4t des Codes. Wir sollten das Muster also nicht auf gut Gl\u00fcck einfach immer verwenden, sondern uns gut \u00fcberlegen, ob wir den Vorteil auch wirklich ausnutzen k\u00f6nnen.<\/p>\n<p>Habt ihr die Br\u00fccke schon einmal in diesem oder einem anderen Kontext verwendet? Lasst und teilhaben an euren Erfahrungen.<\/p>\n<p>&nbsp;<\/p>\n<p>Eure Spa\u00df-Coder<\/p>\n<p>&nbsp;<\/p>\n<p>Dieser Artikel basiert neben unseren Erfahrungen auf den Ausf\u00fchrungen aus:<\/p>\n<ul>\n<li><a href=\"https:\/\/de.wikipedia.org\/wiki\/Br%C3%BCcke_%28Entwurfsmuster%29\">https:\/\/de.wikipedia.org\/wiki\/Br%C3%BCcke_%28Entwurfsmuster%29<\/a><\/li>\n<li><a href=\"http:\/\/www.tutorialspoint.com\/design_pattern\/bridge_pattern.htm\">http:\/\/www.tutorialspoint.com\/design_pattern\/bridge_pattern.htm<\/a><\/li>\n<li>Freeman, Eric &amp; Freeman, Elisabeth &#8211; Entwurfsmuster von Kopf bis Fu\u00df &#8211; O&#8217;Reilly, 2006.<\/li>\n<\/ul>\n<p>Code-Beispiele auf Github:<\/p>\n<ul>\n<li><sup>[1]<\/sup> https:\/\/github.com\/invidit\/CodeQuality.git<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Hallo Spa\u00df-Coder. Das n\u00e4chste Entwurfsmuster in unserer Reihe ist erneut aus der Kategorie der Strukturmuster. Wir besch\u00e4ftigen uns diesmal mit der Br\u00fccke (engl. Bridge). Auch dieses Muster stammt aus der Sammlung der Gang of Four. &nbsp; Wie funktioniert die Br\u00fccke? Wir haben uns durch das Prinzip &#8222;Program to the interface&#8220; bereits daran gew\u00f6hnt, dass wir [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1140,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[90],"tags":[150,149,130],"_links":{"self":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/1147"}],"collection":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/comments?post=1147"}],"version-history":[{"count":8,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/1147\/revisions"}],"predecessor-version":[{"id":1212,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/1147\/revisions\/1212"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/media\/1140"}],"wp:attachment":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/media?parent=1147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/categories?post=1147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/tags?post=1147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}