[Playlisten] [Impressum und Datenschutzerklärung]

08A.1 Das Visitor-Pattern am Beispiel


CC-BY-NC-SA 3.0

Tempo:

Anklickbares Transkript:

ich wollte was zuPendants erzählendas ist ein großes Kapitel in der professionellenobjektorientiertenProgrammierungEntwurfsmusterIdeenwie man etwas bauen kann stammt aus der Architekturwie baue ich ein Torbogenoder wie baue ich irgendeine FensternischewelcheSachen zu beachten wie kann man das mustergültiglösenPatternmusterEntwurfsmusterähm es kann ja in den alten wieder schon welche vor die üblichen haben vorich wollt mal eins zeigen dasbisschen komplexer aussieht dessen Idee kriegenwas man damit veranstalten kann mit solchen Pendants Visitorwäre das Patternder Besucherdie Idee istdass sich eine Sammlung an Klassen habeichsozusagenbesuchen lassen willaneine andere Klasse genauer gesagt eine Instanz einer anderen Klasse soll bei allen Instanzen von diesen Klassen vorbeigehendürfenundquasi Haustürgeschäfteabschließen dürfen an unserer Seite darauf nicht aus dem Beispiel klarererste Idee ist ich möchte diese Klassenalle um eine gemeinsameFunktion erweiternich möchte diese Funktion aber nicht in den Klassen reinschreibenzum Beispielbei diese Klasseneingekauft sind und ich nichtan den Code rankommedas ich also gar nichts ändern kannoder zum Beispiel weil ich nicht den Code dieser Klassemitirgendwelchen Murks vor wurschteln will sondern sauber halten willer Bestellungen einsammelnoder irgendwelche speziellenDateiformateexportierendannZinseszinsdrauf rechnen was auch immer das wenn alle solche Funktionenandie man vielleicht auslagernkannin so einen Besucher und der Besucher geht dann bei allen möglichen Objekten vorbeiund tut daswas eben tut die ScherenschleifenoderHaus zu Haus sondernZinsen abziehenoder Zinsen drauf rechnenÜberweisung tätigen und Ähnlichesfüralle diese hierdas ist der Gedanke jemand geht vorbeian?? meine neueDatei mit Clusterneswar diese Dominiksbesseres einfälltund zwar was ich gerne hätte was besucht werden sollsollenBilanzpostenseingeklicktenBilanzpostennach ?? möchte ichirgendwelche Rechnungen damit durchführen verschiedene Rechnungen indem ich jeden einzelnen Bilanzpostenbesuchen lassenPunkt Kosten??und damit das nicht ganz soabstrakt wirdmit zweiechten Klassen einmal GebäudeundFahrzeugbeide sollen von BilanzpostenErbenhat und sich derBuchhaltunges relativ egal dass man Fahrzeug fahren kann und dass man im Gebäude arbeiten ganz ?? erst mal geht's darum was kostet es und wie schwierig Bits abgeschriebendann geht es bei den Bilanzpostenhabenda gibt es zum BeispielBilanzposteneinen Wertnehmen ?? Euro mit dezimal Komma dann als Gleitkomma Zahlund es gibt leichte Abschreibungsdauer?? Times bin sinnvollerweisesowas wäredann für mich einen eine Karikatur eines BilanzpostenPunkt Dauerähmund nun möchte ichzum Beispielmalalle Werte addieren ein Besucherder alle Gebäude und alle Fahrzeuge durchgehtund alle Werte addiertoder ein Besucher der ?? alle Gebäude und Fahrzeuge durchgehtunddann die Abschreibungsdauerum ein Jahrverkürzt oder den Wert analog zur Abschreibungsdauerändert und Ähnlichesanwie würde ich das anfangen alle durchgehenund das müsste schon irgendwasverlangen ich möchte alle durchgehenalle Gebäude alle Fahrzeugeum sich vorne anfangendas erste was ich bräuchte behinderter dass meine Liste von solchenBilanzposten?? ich mach das mal auf die kurze Art indem ich hier mal ein Knöpfchenrein setzedannangenommen ich hätte so eine Listevon BilanzpostenLiedern irgendwie gefüllt wärewie auch immer??nahm somit dem Ding noch gebenwenn das VermögendesGrenzpostensowasangenommenich hätte so eine Liste dann möchte ich jetzt diese Liste durchgehenPunkt vor Pietschpietschanjedes Ding dreizehn in dieser Liste vermögenunter möchte ich da denBesucher vor vorbei schicken soll einen Besucher gebendem ich jetzt hierdie Liste zum Fraß vorwerfen den Eintrag sollte ich sagen den Eintrag in der Liste zum Fraß vorwerfennormalerweisewürde man jetzt sowas haben der Eintrag in der Listeund nun soll was passierenund das ist jetzt etwas was ichanders machen will ich möchte das jemand vorbei geht sozusagenbei diesem Eintragich möchtesagen okaydu bitte lässt dichbesuchenexakt heißt das dann gerne die Funktion hierich nenn es auf Deutsch nehme an nicht mal detaillierter wenn ich selbstso eine Methode hätte ich da gerne drinnehme einen Besucher an ihr kommt der Besucherund der Besucher macht dann irgendwas so soll das nachher aussehen ich gehe die Liste durchund jeder in der Liste soll meinen Besucher empfangen und hier stimmt der Besucher drinder Visit ??das heißt ich bräuchte nochwird eine Klasse für den Besitzernennen tatsächlich malVisitorderjenige der hierdurch die Bilanzpostendurchgehen kannPunktso soll also Aussehensechs ?? soll hier einenVisitorempfangen dürfenamwas bedeutet dasfür meine Klassen hier Bilanzpostenund so weiterdas müsste ich jetzt hier ändernsolltevirtuelle Funktionenstehen verzogene abstrakteman muss sie tatsächlich sogar mal abstraktsich als halbnacktenBilanzpostenbraucht ja keiner Ausrufezeichenmal abstrakt?? seinen Kunden auch hilfreichwerdener und damit natürlich per Spam Blick Apps trägtConceptund der soll einen BesitzerZille einen Besitzer empfangen dürfen willunteralsoich sage Apps trägtund schreibe das Sinn was ist falschja also zwei Sachen in sie sagen selbst wechseln ordentlich keine Schweifklammer dahin ich sage nicht wie's funktioniert sondern hinten werden Semikolon hinund dir fehlt noch der Rückgabewertsoll nichts zurückgeben so sehr das aus und dann muss ich natürlich jetzt hiernoch was machen als Folgegenau abstrakte mit Methode erzwingt das die KlasseAbstract wird eine rein virtuelle Methodeals sie dann auch gerne erzwingt das die Klasse abstrakt wird ich kann nicht davon distanzierenvon den Bilanzpostenweilnicht klar ist wie diese Methode funktioniertund die Kindklassenhaben jetzt das Erbedas zu implementierenKomma bereitsTextebei demeinen hierdas mit den Exceptions sammeln zwischen auch gelerntan das steht jetzt drinnen wenn tatsächlichjemand diese Methode aufruftdass das Programm abgebrochen wirdund ich nicht glaube diese Methode wird schon waswichtiges tunund analoge unten zur Mitkopie und Pestanalogihr unten reinam Fahrzeugso die sollen den Besucherannehmenjetzt kommt der spannende Punkt auf leichte Folter spannen Punkt erzähle noch mal die die Gesamtschaubisher?? ich möchte das Gesamtvermögeneine Liste von Bilanzpostendurchgehendass manche mit dem for-each-Schleifefür jeden BilanzpostenRuf ElektrofischRezept aufRezept soll den Besuchermit Kriegen jeder Ferne Bilanzpostensoll den Besucher empfangendas ist der Job von den Exceptionswas heißt aber den Besucher zu empfangenwarenda müssen wir jetzt hierjetzt wird's spannend hier sagen okay der Besuchermöge michdarum ankommt der Besucher der möge michbesuchendas sieht heftig ausich sag jetzt rückwärtswenn jemand vorbeikommtund das Gebäudebesucht das passt ja lustigerweiseals Bild wenn jemand vorbeikommt und das Gebäude besuchtsein ich jetzt darin okaybesuchemichalso umgekehrt ruf ich jetzt bei dem Besucher eine Methode aufund sage dem wer ich bindie Methode gibt's natürlich noch nicht die bauenkann ?? auf Einschlag bauen lassenzu Fuß und analog hier bei demFahrzeugwenn jemand vorbeikommt zum Fahrzeug und das Fahrzeug besuchtnach das Fahrzeugokaydu besuche miches ruft eine Methode im Besucher auf das es jetzt der Trickwas ich eben gesagt habe ich möchte meine Klassen nicht mit irgendwas für grunzenan der Cote oder ich möcht ich kann sogar das nicht Wohnzimmer sie gar nicht mir gehören sondern jemand anders als geschrieben undversiegeltdannvielmehr geht jemand bei allen meinen Instanzen vorbei besucht mich und was ich dann mache ist das ichdarin Methodenaufrufedie Methoden sind nicht in den Klassen verstecktmein Klassen versteckt die besucht werden sollen die Methoden sind hier im Besucherversteckder Besucherweißwie ermeine Bilanzpostenbesuchtdas ist der großeBrocken das maganIsotope sind natürlichmit I immer noch und hierunddas muss natürlich dem Besucher auch vorsehen ich hätte gerne eine öffentliche Methode besitzen Besucheröffentlich soll sie seinPunkt ?? öffentlich seine Eltern hassen ?? sind im großen Faber Microsoft ins öffentliches so soll öffentlich sein Visitdie Soll sind sie an der Anwendung nichts zurückgeben freutsie kriecht irgendwasundtut dann irgendwaswas wir diese Methode Visit kriegenbeim Visitordass es jetzt die spannenden Fragen was wird sie da eigentlich kriegensich das anguckenwenn sich das angucken was wir diese Methode kriegenrichtig ein Bilanzpostendas ist das erste was man vermuten würde wir bauen so eine Klassevisitorsmit einer Methodefür Sitzund erwarten hiereinen Bilanzposten?? Wieso und tun dann was mit dem Bilanzpostenund jetzt kommt der Trickwenn ich hier nicht allgemein Bilanzpostenmachesondern wenn ich hier einmalWassergebäudeund Fahrzeug wenn ich einmal Gebäude Machegebäudegehenund dasselbe noch mal machemitFahrzeug Fdann wird's spannendwann ist es die roten Kringellinien wegwas es jetzt der Effektbin ich damit erreicht habedas ich hier die Methode zweimal habenicht Visit vonBilanzposten?? im allgemeinen sondern jetzt speziell Besitz von GebäudeVisit von Fahrzeugdass sie oben überlegen was passiert jetzt dadurch?? er merkt selbst ja welche Funktion er aussuchen soll wenn hier oben der Besucherbei dem Gebäude vorbeigehtsagt das Gebäude okay ich lade dich einund ruft Besitzer wisset auf den ist dies aber ein Gebäudeund verlangten hierin der Variante?? beim Fahrzeug ist der Besucherdann ist dies ein Fahrzeugund wir landenbeider Variantedes Sonne ganz schräge Anwendung für dieses überladendas ist ?? überladenMethoden mit dem selben Namenaber anderenParameternder Reihenfolgean der Anzahldanndas verwende ich ich benutze dieses überladen dass es mehrere Varianten von dem Visit geben kannund mir automatisch die richtige Variante auszusehenalso was in der ?? in deneigentlichenKlassenin öffentlichen Klassen passiert es ganz billig die ursprünglichen Klassen sagen nurwenn jemand vorbeikommtdann rufe ich dessen Visitmethodeaufmitmir selbstsage dem Besucher mich?? und der Besitzerder es so raffiniert dass er weiß wen er besucht wenn ein Gebäudebesuchtdann machte das leicht anders als in ein Fahrzeug gesuchtso kann das funktionierennundas hatte jetzt total abstraktes würde man wahrscheinlichabstrakt lassen muss man sagt der Besitzer als solcher ist ein abstrakterWeltklassebesitzerund hier für dich keineImplementierunggeben und das Erbstück machendurch Website noch davor schreibenich einfach ?? das jetzt typischerweiseda hatte ich Pawlik erstreckendabei poppigstecktso sieht das aus ein Besucherweiß also was er mit Gebäuden und Fahrzeugen anstellen kannwas auch immer damit anstelltso spielen die zusammenes gibt einmal die normalen Klassen jetzt hier meine Bilanzpostenvon erst postulierten Klassen diebesucht werdendazu haben die nur diese einzelne Funktionseckselbst diese Erbenund scheinbar immer dasselbe machenaber nicht ganz dasselbe machen derdas des es einmal ein Gebäude und einmal einenFahrzeugals ich benutze überladendas überladen um hier diese Unterscheidung zu machenKomma tatsächlich meinen konkreten Besitzereckenzum Beispiel sowas machen wie Abschreibungzu berechnenKomma Abschreibung funktioniertes jetzt meine Lein Vorstellung von AbschreibungähmAbschreibungmöchte ich als Besucher habenimmer der die Abschreibungenvornimmt oder ausrechnet wie viel Beträge davon sein könntendannalso das als Ableitung von Visit ??und jetzt muss ich sagendas muss ich sagen was sie tutanund zwar fürGebäudeund für Fahrzeugevielleichtgetrenntsowasvorstellendass ich den Bilanzpostenohne Möglichkeit geben sich an den Wert dran kommen kann damit das ganze einfacherhier noch ??Punkt AT?? Party und damit möchte ich den Wert holen und setzen könnennun GerdTurnwertPunkt SolarPunktZ wärewird gleich Valuewird gleichso sehr das ausein bisschen mehr hier um das ?? was arbeiten kann mit dem Wertklein geschriebenwird groß geschriebenbin und sicher zum drauf zuzugreifenund das göttliche so anfangen und sagen okay was es mit Abschreibung beimer beim Gebäude der Berechtigte jetzt alsobereitsein Gebäudewie man es beim Gebäude da könnte ich sagengeben PunktWertist großgeschriebenPunktamGebäude geradehabe ich was auchwas ich falsch gemacht was fehlt hierhatgleichKommaeben fünf zum Beispielso könnte das aus in das wir jetzt ein spezieller Besucher als ich habe einmaldie normalen Klassen mit denen ich die ganz normale Arbeit mache und wenn jetzt ein Besucher der irgendwasDurchbesuchenveranstaltenkann hier geht der vorbei der Besucherundzieht überall was vom Wert ab und je nach dem was er da gerade siehtsie der was anderes vom Wertdas würde dannwenn ich hierin der??hier irgendwo will das stattfindenwas müsste ich jetzt hier tunund das gesamte Vermögen durchzugehenund automatisch was von dem Wert abzuziehen was müssen wir alles noch dazu schreibendass er jetzt wirklichdiese Abschreibung durchführtKommazu dem zurückanguckenwas die Abschreibung so tutwas der ??visitors im allgemeinen tutähm was die Klassen hier zu tun mit dem Ex selbst?? müsste ich das formulieren dass er tatsächlich jetzt durch alle durchgeht und abschreibtdie Abschreibung durchganz einfach sie bauen eine neue Abschreibung hierdannhier Abschreibungsschreibungab von mir aus ist gleich nurAbschreibung damit habe ich einen neuenBesitzer den ich bei allen vorbei schicken kann und den schreibe ich da rein so sieht das dann ausich sollte das endlich mal in die Liste was reinschreibenund zu zeigen das auch wirklich was passiertsetzt man ihr Vermögen Punkträteinmal ein neues Gebäude seinneues Gebäudesound ich setzen das Vermögen auch normalen Fahrzeugscheindafür sehen können waspassiertundhiersetz ich mal weg Punktalso mein Vermögen besteht jetzt aus einem Gebäude einem Fahrzeugich habe mein Visit ?? hier vorbereitetnamens AB und gehe jetzt das gesamte Vermögen durch Stück für Stückder soll jetzt jeweilsdie Abschreibung durchuns das analte Nummer eins ein Gebäudetoll das war das erste hier eingebautesKinder hier reingucken muss an was passiert was macht jetzt exzellent für das Gebäude das Gebäude begrüßt sozusagenden Besitzerich mal reindas Gebäude begrüßt den Visitor hier ist unser VisitorSchritt weiterund dann sagt esbitte lieber Besitzer besuche miches wird also Visit aufgerufenvon derAbschreibungwisset von der Abschreibung wird aufgerufenmit dem Gebäudenächste Schritt in die Tiefe wenn ich das jetzt angucke was dieses Widget im einzelnen macht der hierin der Abschreibung wisset man Gebäude aufgerufen genau was ich will hier ist mein Gebäude das gerade besucht wird und dann wird es hier ausrechnen was passiertmit der Abschreibung für dieses eine Gebäudezurückspringenund daraus wieder zurückspringenso das war Nummer eins hat das Gebäude besuchtund?? Nummer zweidas war das Fahrzeugwas passiert hier ergeht hier reinhauenlandet beim Fahrzeugund dass es hier ebendiese Standardlösungfür alle alle sagenwenn sie der Besuch auf besucht sagen alleBesucher besuche mich bisschenkomisch auf den ersten Blick was macht dann genau das richtigeerund sagt das Fahrzeug dem Besucherhierbei ihr das Fahrzeug sagt dem Besucherist es ein Fahrzeugbesuchen michdann nämlich untenahabei dem suche ?? das Fahrzeug und das rechnet anders als es vorgerechnethaben??noch mal an der Stelleder sind von dem ganzen ich habe meine Klassen erweitertund Senat Abschreibungsfunktionaber die habe ich nicht die Klassen eingebautsondern die stetsgetrenntvon allemein Grund kann sein das ich meine Klassen gar nicht ändern kann oder ändern will dass er sich verschmutzen will das wäre ein guter Grund dafür das so zu machenwerdendie ?? noch andere gute Gründe sowas auf diese Weise auszulagernmansich es ist übersichtlicherman kann quer durch alle KlassenfunktionalitätzusammenbauenKomma sondernmodische Geschichte aspektorientierteProgrammierung das geht in die Richtung aspektorientierteProgrammierungist ein Aspekt hier der Aspekt Abschreibungenoder der Aspektetwas Drucken der Aspekt etwas zu speichernall das was ich quer durch die Klassen zusammenhier steht wie ich Abschreibungen bei Gebäuden machen Abschreibung bei Fahrzeugen mache quer durch alle Klassenan was es oft viel übersichtlicherals wenn sie diese Einzelfunktionenverstecken ständig irgendwelcheUmsatzsteuerrechnungenvor jeder Klasse steckt nach England publizierte Steuerberechnungtrennensie habe überhaupt keinen Überblick mehrüber die einzelnen Steuerberechnungendes stecken Steuer brechen hier beim Gebäude drinnen und dann eine andere Datei war die Klasse viel größer wird steckt die Steuerberechnungfür Fahrzeuge drin?? man verliert total den Überblickhiermit hat man Jonesdieselbe Funktionquer durch alle Klassenan eine Stelle zu bringendas ein ganz wichtiger Grund für diesesPattern Namensbesitzerdannich zeichne noch mal wie die ?? das Klassendiagrammaussieht also das was man typischerweisebei solchen Patterns auf maltobwohles einem gar nicht so viel sagtwie ist das ganze gebautschön und gutaber eigentlich geht's um den Gedanken dahinterwie die Sachen zusammen spielen also ich hab hiermeine Originalklassemit etwas veranstaltenwillgeerbt von einer abstraktenKlasse Beistrich abstrakten ?? immer das machen willer ?? und parallel dazu existiert dieser Besitzerdas ist die Struktur die Mandat und dieser visitors eben in der Lage alle diese Elemente hier zu besuchen und mit den was zu machen dem Visit habe ich jeweils eine Funktiongebündeltjeder von meinen Besitzernist das was ich sonst als Funktioneine Funktion in allen Klassen hier verstreut hätteamals ob man davon noch einbauendas wäre noch eine andereSache die man hier machen könnte für alle Gebäude und Fahrzeugehierder Besitzeres relativ billig das ist eine reine Funktionssammlungfür jedeeiner Ableitungmeiner Originalklassehabe ich in eigene VisitmethodeFeierabend der Visite und merkt sich sonst nichts ?? Sammlung und FunktionKomma folgendesich möchte einfachwas haben wir Bilanzsumme alle Werte auf summieren?? Claus sollte vorschreiben von CesarHaaseinen Besitzer dereinfach alles Aufsummenwerdenes wieder abgeleitet von Visit ??amich muss wiederdiese beidenabstrakten MethodenimplementierenbereitsFahrzeugrichtig besuchenund ich möchtedasGebäude besuchen und jetztalle Werte auf summierenkann ich das nun tunalle Werte auf summierenauf jeden Fall hätte ich mit den Exceptions hierwas müsste ich tunichwürde hier einfach sagen das hier ist dieSumme das kann Instanzvariablesein anders als gerade vorgeschlagen mit staticans tätig für heißen static double dass diese Summean die Klasse Bilanzsumme gebunden ist das es nur eine einzige Summe gibtes heute hier nicht unbedingt für nötig ich baue ja nachher eine Instanz von diesem Besucher namens Bilanzsummedie seine Stunts von Bilanzsumme hat diese variable Summediese Instanz vorgemerkt hat die Variable Summe und diese beiden Methoden greifen oft zuwäre also gar nicht nötig dass sie statisch istfür dich also nichtextra statisch machen wollenund wir sind und so weiter jene Dörfer durch und sagen okay die Summeist eben das was das Fahrzeug gerade wert istdrauf addiertund hier ist die Summe das was dasGebäude gerade wert ist Komma verliertso sehr das aus das es mit schlichter als eben vor allem sind sie jetzt habe ich diese beiden Varianten hierfür gewollt und Fahrzeug und sie machen das selber dass diese Trennung hier ist gleich nicht so sinnvoll weil sie beide dasselbe machenaber trotzdem habe ich immer noch geschafftmeine Methoden von den ursprünglichen Klassen zu trennen ?? ich forsche mich in den ursprünglichen Klassenraumschon ganz nettamSohn des Komma jetzt netterweise genauso aufrufendas ist das Schöne an diesen Geschichtenich sage jetzt einfach okay ich hätte gerne noch neue Bilanzsummeeinen passendenPS sehr schönsehr treffendanund jetzt gehe ich alle durchnetterweise sieht das genauso aus wie es vorher ausgesehen hat das schöne bei diesen Konzeptenes Teams hatten das auch schonan denselben Code schreibenpraktisch denselben Codes passiert was völlig anderesdas Konzept ist dasselbe hier dasselbe Konzept wie mach ich die Bilanzsummeich besuche allejetzt aber mit dem anderen Besucherder nicht scheren schleift sondern die ganzen Werte Aufsummenund die March Vorinstanzgebautund er somit jetzt die Werte aufsie genauso aus wie vor das Abschreibungen ausrechnendannnur mit meinen Besuchernmeines Klassendiagramm gucken in vollerGänzehabenso sieht das dann typischerweisewenn sie solche Bestandsbüchergucken oder Wikipedia gucken unter Design PatternSoftware Design Patternwill sie dannziemlich exakt solche Diagramme noch bisschen aus buchstabiert welche Methoden jeweils da sein müssenwenn sie aufklappen welche Methoden jeweils da sein müssen am?? finde ich eher unklarum zu verdeutlichen worum es jeweils geht was der Sinn des Ganzenund man sieht nicht so genau wie die miteinander zusammen spielenalso wichtig ist den Text zu lesen von diesenSoftware Design Patternwas ist eigentlich gedachtdahinter?? Visitor als einenschon eher abgedrehtesBeispielum die Frage diesem Fall die Frage zu lösenwie man an Klassen etwas dranstrickenkann ohne die Klassen selbst zu ändernoder auch wie man Funktionen zusammenfassenkannquer durch alle Klassendas ist endlich diesen Versand für den Besitzer hiereher das geht natürlich allgemein für jedes Gebäude und für jedes Fahrzeug wenn sie hiernoch ?? zweites Gebäude erzeugenzweites Gebäude dazu nehmenwas da passiertamso ist Hammer daserste Gebäude von denendagegen war reindas Gebäude sagtBesucher besuchen michund er ruftdie Methode für Gebäude auffertigund jetzt gehen warzurück zur zurück ?? darausjetzt kommt daszweite Gebäudeund das zweite Gebäude alte Miss wieder Gebäude dagegen war reindas zweite Gebäude sagtBesucher besuchen michund wir dann natürlich wieder in dieser Methode beim Besucher sie haben eine Methode beim Besucher die alle Gebäude abhacktund eine Methode beim Besucher die alle Fahrzeuge abgehakt