--
Sie haben diese Nachricht erhalten, weil Sie der Google Groups-Gruppe Clean Code Developer beigetreten sind.
Um Ihr Abonnement für diese Gruppe zu beenden und keine E-Mails mehr von dieser Gruppe zu erhalten, senden Sie eine Email an clean-code-devel...@googlegroups.com.
Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an clean-code...@googlegroups.com.
Gruppe besuchen: http://groups.google.com/group/clean-code-developer?hl=de
Weitere Optionen: https://groups.google.com/groups/opt_out
Allerdings finde ich die Aufteilung in Business (nur der Name könnte natürlich noch besser sein) und Data schon sinnvoll, schon um eine logische Trennung der Aufgaben zu erreichen.
@Ralf, es ging mir nicht so um das fachliche Problem, sonder mehr um die Struktur von dem Programm. Realistische Obergrenze ist nicht genau definiert. Ich habe es so verstanden, dass man einfach den kürzesten direkten Weg nimmt und dafür die Kosten berechnet. Hintergrund ist, dass dadurch der Backtracking Algorithmus deutlich schneller zu der optimalen Lösung kommt, weil die Obergrenze einen frühzeitigen Abbruch ermöglicht.
Ein weiterer Grund für die Verwendung der Schichtenarchitektur ist, dass ich anhand dieses sehr einfachen Beispiels die Schichtenarchitektur üben und besser verstehen möchte.
Mir fallen da gerade z.B. noch zwei konkrete Fragen ein:1. IDataReadAccess z.B. ist ein Interface, was im Data Layer liegt. Rein logisch gehört es aber zum Business Layer. Dies kann man mit dem DIP begründen: Details sind abhängig von der Abstraktion und nicht umgekehrt. (2. Teil der Definition).Aber im Business Layer darf es nicht liegen, denn sonst müsse Data ja Business referenzieren. Ist meine Lösung hinsichtlich dessen so trotzdem richtig?
2. Die Klasse Area ist im Root Namespace, da sie sowohl Data als auch Business kennen müssen. Alternativ könnte man Area in Data legen. Aber das finde ich nicht schön, denn es handelt sich dabei um eine Klasse, die ich eindeutig der Business Logik zuordnen würde. Man könnte als weitere Alternative die von Data nur einen String zurückgeben lassen und das Parsen dann im Business machen. Aber diese Aufgabe gehört nicht zu Business mE, denn es kann Business doch egal sein, in welchem Format die Daten geliefert werden, Business möchte einfach nur die Objekte bekommen, mit denen es seine Logik direkt durchführen kann.
Diese beiden Probleme klingen vielleicht nicht so besonders relevant. Sind sie aber meines Erachtens. In meinem Job haben wir eine sehr komplexe Applikation, die auch in Schichten aufgeteilt ist. Wenn man da keine klaren Vorstellungen hat, wie solche kleinen Dinge verwaltet werden, scheitert man an dem Großen Ganzen erst recht. Solche kleinen Fragen kommen ständig auf und es ist total wichtig, dass dies klar geregelt ist. Und ich möchte gerne diese Dinge lernen und mein Urteilsvermögen verbessern.
Eine Architekturentscheidung ist immer etwas, was man im späteren Projektverlauf nur noch schwer, d.h. mit erheblichem Aufwand zurücknehmen kann, wenn sich dann herausstellen sollte, das die Entscheidung falsch war.
Daher müssen Architekturentscheidungen auch immer gut begründet sein, sie müssen die von den Stakeholdern geforderten Qualitätsziele unterstützen. Einfach nur Schichten machen, nur weil es gerade in Mode ist, oder weil einige dieses Architekturmuster für eine Art Naturgesetz halten und (häufig auch in Ermangelung an Kenntnis anderer Architekturmuster) nichts anderes zulassen, ist immer hochproblematisch.
Wie Ralf es schon erläutert hat: Schichtenarchitekturen (Layer, n-Tier, ...) fassen bestimmte Aspekte oder Belange eines Softwaresystems möglichst kohäsiv (d.h. zusammenhängend) in einer Schicht zusammen. So sind z.B. in einer solchen Architektur häufig alle GUI-Aspekte (Bedienelemente, Anzeigen, Ein-/Ausgabe) auf einer Schicht, meistens Präsentationsschicht genannt, zusammengefasst. Wie schon gesagt: das Ganze erfüllt aber keinen Selbstzweck. Mit diesem Ansatz sollen Qualitätsziele wie beispielsweise Portabilität oder Verteilung unterstützt werden. Bei einem verteilten System kann die Präsentationsschicht auf einem anderen Rechnerknoten laufen als die anderen Schichten (Fachlogik- und Datenhaltungsschicht, um mal ein Beispiel zu nennen). Auch wird manchmal das Ziel genannt, das man später einmal ganze Schichten austauschen möchte. Möglich, das so etwas ab und zu mal vorkommt, aber tatsächlich habe ich das in freier Wildbahn bislang noch nicht erlebt. Daher ist das häufig YAGNI.
Ich sehe in Deiner Aufgabenstellung keinerlei Anforderungen oder Rahmenbedingungen, die eine Schichtenarchitektur begründen können. Genau genommen finde ich gar keine Qualitätsziele darin. Daher würde ich da auch sehr KISS herangehen.
Viele Grüße,Stephan
Um Ihr Abonnement für diese Gruppe zu beenden und keine E-Mails mehr von dieser Gruppe zu erhalten, senden Sie eine Email an clean-code-developer+unsub...@googlegroups.com.
3. Programmkonzeption unter Berücksichtigung der funktionalen Trennung nach dem 3 -Schichten-Model
- Klassen, Methoden und Datenstrukturen in Form von UML
- Sequenzdiagramme für die wesentlichen Abläufe
- Detail. Beschreibung der Methoden in Form von Nassi-Schneidermanndiagrammen
- Definition der Schnittstellen
Insofern kann man sagen, dass das 3 Schichten Modell eine Anforderung ist, auch wenn es so nicht direkt in der Aufgabenstellung steht.
Ich möchte mich bestmöglich auf die Prüfung vorbereiten. Dabei möchte ich, und das ist eher ein Anspruch an mich selbst, so gut es irgend geht den CCD Prinzipien folgen. Dies wird sicherlich kaum bewertet, jedoch denke ich, dass clean code doch zumindest positiv auffallen sollte, da er nicht zuletzt leichter zu lesen ist.
Das Beispiel aus Ralfs letzten Post kommt mir sehr bekannt vor und ich merke, dass es tatsächlich Probleme mit der n-Tier Architektur gibt.
Trotzdem werde ich gezwungen sein sie zu benutzen und möchte dies wenigstens so gut es geht umsetzen.Für die Prüfungen einen anderen Weg zu gehen halte ich für zu riskant. Also, wenn ihr bzgl. meiner Programmstruktur und meiner Fragen dazu noch Antworten habt, würde ich mich sehr freuen.
es gibt je eine klasse für PL, BL, DL.und dann gibt es noch eine klasse, die das ganze zusammensteckt.
alle klassen tun wirklich nur das.oder alle projekte, in denen die klassen sind, tun wirklich nur das.du hast - wenn ich mich recht erinnere - irgendwelche ausgaben aber verstreut gehabt.
Warum je eine Klasse und nicht z.B. je ein Namespace?
alle klassen tun wirklich nur das.oder alle projekte, in denen die klassen sind, tun wirklich nur das.du hast - wenn ich mich recht erinnere - irgendwelche ausgaben aber verstreut gehabt.Ursprünglich hatte ich es so:Die Klassen aus dem BL benachrichtigen ihre Obeserver, wenn eine Nachricht ausgegeben werden soll. PL beoabchtet den BL und ist für die Ausgabe zuständig. Ist das nicht ok?
--
Sie haben diese Nachricht erhalten, weil Sie der Google Groups-Gruppe Clean Code Developer beigetreten sind.
Um Ihr Abonnement für diese Gruppe zu beenden und keine E-Mails mehr von dieser Gruppe zu erhalten, senden Sie eine Email an clean-code-devel...@googlegroups.com.
--
Sie erhalten diese Nachricht, weil Sie in Google Groups ein Thema der Gruppe "Clean Code Developer" abonniert haben.
Um Ihr Abonnement für dieses Thema zu beenden, rufen Sie die URL https://groups.google.com/d/topic/clean-code-developer/i_Oo8fyuoUw/unsubscribe?hl=de auf.
Um Ihr Abonnement für diese Gruppe und alle ihre Themen zu beenden, senden Sie eine E-Mail an clean-code-devel...@googlegroups.com.
Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an clean-code...@googlegroups.com.
Gruppe besuchen: http://groups.google.com/group/clean-code-developer?hl=de
Weitere Optionen: https://groups.google.com/groups/opt_out
Um Ihr Abonnement für diese Gruppe zu beenden und keine E-Mails mehr von dieser Gruppe zu erhalten, senden Sie eine Email an clean-code-developer+unsub...@googlegroups.com.
Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an clean-code...@googlegroups.com.
Gruppe besuchen: http://groups.google.com/group/clean-code-developer?hl=de
Weitere Optionen: https://groups.google.com/groups/opt_out
--
Sie erhalten diese Nachricht, weil Sie in Google Groups ein Thema der Gruppe "Clean Code Developer" abonniert haben.
Um Ihr Abonnement für dieses Thema zu beenden, rufen Sie die URL https://groups.google.com/d/topic/clean-code-developer/i_Oo8fyuoUw/unsubscribe?hl=de auf.
Um Ihr Abonnement für diese Gruppe und alle ihre Themen zu beenden, senden Sie eine E-Mail an clean-code-developer+unsub...@googlegroups.com.
Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an clean-code...@googlegroups.com.
Gruppe besuchen: http://groups.google.com/group/clean-code-developer?hl=de
Weitere Optionen: https://groups.google.com/groups/opt_out
--
Leif Battermann | Kuenstr. 9 | 50733 Köln | Mobil: 01573 8151460
--
Sie haben diese Nachricht erhalten, weil Sie der Google Groups-Gruppe Clean Code Developer beigetreten sind.
Um Ihr Abonnement für diese Gruppe zu beenden und keine E-Mails mehr von dieser Gruppe zu erhalten, senden Sie eine Email an clean-code-developer+unsub...@googlegroups.com.
Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an clean-code...@googlegroups.com.
Gruppe besuchen: http://groups.google.com/group/clean-code-developer?hl=de
Weitere Optionen: https://groups.google.com/groups/opt_out
--
Sie haben diese Nachricht erhalten, weil Sie der Google Groups-Gruppe Clean Code Developer beigetreten sind.
Um Ihr Abonnement für diese Gruppe zu beenden und keine E-Mails mehr von dieser Gruppe zu erhalten, senden Sie eine Email an clean-code-developer+unsub...@googlegroups.com.
OOP und FD sind orthogonal.Mit FD findest du zuerst Funktionseinheiten, die etwas tun. Die bringst du in eine passende Reihenfolge, um ein Ergebnis zu erzielen.Erst in einem zweiten Schritt überlegst du dir, wie du darüber eine Abstraktionsschicht einziehst. Wenn du mit einer OOP-Sprache arbeitest, musst du das tun (Klassen in C#). In anderen Sprachen ist das nicht mal nötig (z.B. F#).Wie Funktionseinheiten zu Klassen aggregiert werden sollten, ergibt sich aus Mustern und gefühlter Kohäsion.Die drei von dir erwähnten Funktionseinheiten gehören für mich jedenfalls nicht in eine Klasse. Das sind drei Aspekte:1. Zugriff auf Kommandozeile2. Zugriff auf Dateisystem3. Parsen von Daten1 und 2 benutzen ganz unterschiedliche APIs für den Ressourcenzugriff.
3 steht am Übergang zwischen Ressourcen und Domäne. Das ist eine typische Map-Funktionalität. Die könnte sogar in die Datenstruktur verpackt werden.class Area {public static Area Parse(string textualRepresentation) {...}public override string ToString() {...}...}
class Area {public static Area Parse(string textualRepresentation) {...}public override string ToString() {...}...}Also ich habe jetzt extra alle Logik aus Area und AreaPath herausgenommen und sie als reine DTOs konzipiert.So kann ich ein Area Objekt durch die FUs durchreichen. Wenn ich das richtig verstanden habe, dann sollte man keine Objekte durchreichen, die Logik enthalten, sondern dann stattdessen diese als Ressourcen verwenden, oder?
--
Sie erhalten diese Nachricht, weil Sie in Google Groups ein Thema der Gruppe "Clean Code Developer" abonniert haben.
Um Ihr Abonnement für dieses Thema zu beenden, rufen Sie die URL https://groups.google.com/d/topic/clean-code-developer/i_Oo8fyuoUw/unsubscribe?hl=de auf.
Um Ihr Abonnement für diese Gruppe und alle ihre Themen zu beenden, senden Sie eine E-Mail an clean-code-devel...@googlegroups.com.
Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an clean-code...@googlegroups.com.
Gruppe besuchen: http://groups.google.com/group/clean-code-developer?hl=de
Weitere Optionen: https://groups.google.com/groups/opt_out
Dann verlagere ich das Serialisieren in die Datenklassen. Ebenso kann ich ja einfach wieder die anderen Funktionen, die vorher in den Datenklassen gekapselt waren (wie z.B. ctors, Rückgabe der Kosten eines Feldes und hinzufügen eines Zuges zu AreaPath etc.) und die ich rausgezogen habe, wieder hineinbringen...
--
Sie erhalten diese Nachricht, weil Sie in Google Groups ein Thema der Gruppe "Clean Code Developer" abonniert haben.
Um Ihr Abonnement für dieses Thema zu beenden, rufen Sie die URL https://groups.google.com/d/topic/clean-code-developer/i_Oo8fyuoUw/unsubscribe?hl=de auf.
Um Ihr Abonnement für diese Gruppe und alle ihre Themen zu beenden, senden Sie eine E-Mail an clean-code-devel...@googlegroups.com.
Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an clean-code...@googlegroups.com.
Gruppe besuchen: http://groups.google.com/group/clean-code-developer?hl=de
Weitere Optionen: https://groups.google.com/groups/opt_out
Das präziseste, was ich bieten kann ist der Code. (Siehe oben repos: https://github.com/battermann/GroPro3.git)Ich denke, dass die Implementierung von GroPro3 dem, was du beschreibst sehr nahe ist.
die wichtigste frage ist: merkst du einen (positiven) unterschied, nun da du es so gemacht hast, gegenüber früher?