Wie kann man herausfinden, was im objektorientierten Design zu tun ist?


12

Zunächst ein Disclaimer: Ich weiß nicht wirklich, ob diese Frage zu dieser Website passt, aber ich finde sie immer noch eine relevante Frage, nicht nur für mich, sondern auch für andere Anfänger. Wenn die Frage hier angepasst werden kann, weisen Sie bitte auf int-Kommentare hin. Wenn es nicht passt, lass es mich auch wissen und wenn möglich lass es mich wissen, wo dies besprochen werden kann, weil ich keine guten Foren dafür gefunden habe.

Ich habe 2009 gelernt zu programmieren, als ich PHP studierte. Später im Jahr 2012 wechselte ich zu C # und .NET. Auf jeden Fall ist das Codieren nicht das Problem, das Aufschreiben von Algorithmen ist nicht mein Problem. Mein eigentliches Problem besteht darin, zu wissen, was codiert werden muss, um eine Anforderung zu erfüllen, und wo es codiert werden muss.

Die meisten im Internet verfügbaren Kurse behandeln das Wie - wie man Code in einer bestimmten Sprache schreibt, wie man einige Sätze von APIs verwendet usw. Das ist hier nicht mein Punkt.

In diesen Jahren habe ich viel über eine Reihe von Dingen gelesen: objektorientierte Analyse und Design, Designmuster, domänenorientiertes Design und so weiter. Ich verstehe zum Beispiel die SOLID-Prinzipien, einige der Hauptideen von DDD wie die Notwendigkeit des Engagements von Domain-Experten, die Entwicklung einer allgegenwärtigen Sprache und so weiter. Ich würde sagen, ich habe zumindest einen vernünftigen theoretischen Hintergrund.

Aber wenn es ums Üben geht, fühle ich mich wie eine Katastrophe. Vor einiger Zeit musste ich die Entwicklung eines Finanzsystems fortsetzen, das bereits von jemand anderem entwickelt wurde. Es ist eine Art "altes System", das mit C # und WinForms entwickelt wurde. Es war das erste Mal, dass ich ein Projekt mit einer echten Domänenkomplexität, vielen Geschäftsregeln usw. auswählte.

Ich gebe zu, wenn ich die Anforderungen die meiste Zeit erhalte, denke ich: "Wie um alles in der Welt kann das gemacht werden?" - Ich habe keine Ahnung, wie ich überhaupt anfangen soll, an den Anforderungen zu arbeiten, um herauszufinden, was zu tun ist. Ich glaube, meine Hauptverwirrungen sind, was ich codieren muss, welche Klassen, Schnittstellen und wohin jede Logik geht, auf welcher Klasse jedes Ding sein muss. Das Problem ist, dass ich nicht weiß, wo ich anfangen soll.

Meistens habe ich nachdenklich einige Ideen, aber ich kann nie beurteilen, ob meine Idee richtig ist oder nicht.

Ich denke nicht, dass dies ein Mangel an Theorie ist, da ich, wie gesagt, über eine Reihe von Dingen zu Softwarearchitektur und Objektorientierung gelesen habe, die mir empfohlen wurden, aber es half nicht viel, zu identifizieren, was in der Praxis getan werden muss .

So wie kann ich lernen, wirklich tut objektorientiertes Design? Was ich lernen möchte, ist, dass gegebene Anforderungen wissen, wie man damit beginnt, in einem Prozess daran zu arbeiten, der dazu führt, herauszufinden, was zu tun ist und wo jeder Code hingehört. Wie kann ich auch beurteilen lernen, ob meine Idee richtig ist oder nicht?

Ich glaube, es wäre nicht möglich, dies hier als Antwort vollständig zu erklären. Ich suche jedoch nach Antworten, die dem Site-Stil entsprechen. Sie geben lediglich einen Überblick und verweisen auf einige Referenzen (Bücher, Online-Kurse usw.), die verwendet werden können, um die Ideen zu erweitern und diese Dinge wirklich zu lernen.


1. Verstehen Sie bereits alle grundlegenden Konzepte von C #, einschließlich der Unterschiede zwischen Überladen von Operatoren und Überschreiben von Operatoren, was eine abstrakte Klasse ist und wie sie sich von einer Schnittstelle, Kapselung, Polymorphismus usw. unterscheidet? Um OO in C # vollständig zu verstehen, ist es wichtig, diese Dinge zuerst zu kennen. Siehe c-sharpcorner.com/technologies/oop-ood .
Robert Harvey

2
2. Ältere Anwendungen, die in Winforms geschrieben wurden, neigen dazu, sich in große Schlammkugeln zu verwandeln, es sei denn, sie sind ordnungsgemäß aufgebaut. Die Trennung der Anliegen wird von größter Bedeutung. Siehe winformsmvp.codeplex.com
Robert Harvey

1
Es gibt keinen wirklichen Prozess. Beim Design geht es hauptsächlich darum, zu wissen, wie man organisiert, was mit Erfahrung einhergeht. Die SOLID-Prinzipien sind ein guter Anfang, aber sie reichen nicht aus, und die Leute neigen dazu, sich in SOLID zu verlieren und zu vergessen, warum die Prinzipien existieren.
Robert Harvey

1
Fange klein an. Anforderungen sind Probleme. Ein Problem kann so groß sein wie "Wir möchten die nächste Stackexchange-Site entwickeln" oder so klein wie "Wir möchten, dass sich unsere nächste Stackexchange anmeldet". Machen Sie aus einem großen Problem viele, aber kleinere. Gönnen Sie sich insgesamt die Chance, die Dinge zuerst "falsch" zu machen und sich im Laufe der Zeit zu verbessern.
Laiv

1
Ich möchte gleichzeitig upvote und vtc dies ...
Svidgen

Antworten:


21

Wie kann ich also lernen, objektorientiertes Design zu machen? Was ich lernen möchte, ist, dass gegebene Anforderungen wissen, wie man anfängt, sie in einem Prozess zu bearbeiten, der dazu führt, herauszufinden, was zu tun ist und wo jeder Code hingehört. Wie kann ich auch beurteilen lernen, ob meine Idee richtig ist oder nicht?

Hören Sie zuallererst auf, objektorientiertes Design für richtig zu halten. Das ist so, als würde man Englisch als richtig ansehen.

Das objektorientierte Paradigma ist nicht korrekt. Es hat bestimmte Vor- und Nachteile. Es ist ein Ideal. Es ist nicht unsere einzige. Es ist besser als nichts, aber es ist sicherlich nicht alles.

Ich programmiere seit Jahrzehnten. Ich habe dieses Zeug fast so lange studiert, wie es Ideen gibt. Ich lerne immer noch, was es bedeutet. Die Experten lernen immer noch, was es bedeutet. Unser gesamtes Gebiet ist weniger als 100 Jahre alt.

Wenn Sie also einen Stapel Anforderungen nehmen und Code erstellen, der diese erfüllt, und sich dennoch so fühlen, als ob der von Ihnen geschriebene Code ein tragisches Durcheinander ist, sind Sie nicht allein. Arbeitscode ist einfach der erste Schritt zu großartigem Code. Code, der nicht nur funktioniert, sondern auch von anderen leicht gelesen und verstanden werden kann. Code, der schnell angepasst werden kann, wenn sich die Anforderungen ändern. Code, der Sie dazu bringt, sich zurückzulehnen und "Wow, das ist so einfach" zu sagen.

Das Problem ist, dass wir dafür nicht bezahlt werden. Wir machen das alles, weil wir Profis sind. Wir müssen das alles tun, wenn der Chef nicht hinschaut, weil es immer eine Frist gibt. Aber wir wollen in 5 Jahren wiederkommen und den Neulingen sagen: "Oh ja, das habe ich geschrieben. Funktioniert immer noch, oder? Cool."

Wie kommt man dort hin? Trainieren. Akzeptiere KEINE Designidee zum Glauben. Jemand wird nicht still sein, wie ereignisgesteuertes Design dieses Design vereinfachen wird? Nicht sicher, ob sie Recht haben? Bauen Sie zu Hause Ihr eigenes Spielzeugprojekt, das das Beobachtermuster verwendet. Leg dich damit an. Versuche Dinge zu finden, bei denen es NICHT hilft.

Lesen. Frage. Prüfung. Wiederholen.

Wenn du zu dem Punkt kommst, dass du das 80% deines Lebens getan hast, bist du genauso verwirrt wie ich.

Ich gebe zu, wenn ich die Anforderungen die meiste Zeit erhalte, denke ich: "Wie um alles in der Welt kann das gemacht werden?" - Ich habe keine Ahnung, wie ich überhaupt anfangen soll, an den Anforderungen zu arbeiten, um herauszufinden, was zu tun ist. Ich glaube, meine Hauptverwirrungen sind, was ich codieren muss, welche Klassen, Schnittstellen und wohin jede Logik geht, auf welcher Klasse jedes Ding sein muss. Das Problem ist, dass ich nicht weiß, wo ich anfangen soll.

Das habe ich auch immer so empfunden. Dann entdeckte ich die Freude am Refactoring. Seien Sie bereit, Designs während des Codierens anzupassen. Der Versuch, alles vorher auf Papier herauszuarbeiten, ist der schwierige Weg. Schreiben Sie Code, der sich als falsch erweisen lässt, beweisen Sie ihn als falsch und beheben Sie ihn.


2
Das ist eine großartige Antwort. Ich programmiere seit 15 Jahren und füge hinzu, dass der gesamte Bereich des Software-Engineerings (mein Beruf) "verschwommen" ist - es ist eine Mischung aus Kunst und Funktion, und je nach Entwickler ist es mehr als der andere. Ich kann mir eine Idee für eine Architektur auf Papier einfallen lassen, aber ich kann die Details des OO-Designs erst herausfinden, wenn ich in den Schmutz gerate, herumspiele und finde, was funktioniert und was nicht.
Jropella

Danke für die Antwort! Ihr Punkt ist also: Sobald wir mindestens eine Lösung zur Implementierung einer Anforderung haben und diese funktioniert, implementieren wir sie. Wenn wir dann sehen, wie sie sich auf den anderen Code und die anderen Anforderungen auswirkt, überarbeiten wir sie, um sie zu verbessern. Aber es gibt immer noch Situationen, in denen ich einige Anforderungen habe und keine Ahnung habe, wie ich anfangen soll. Haben Sie in diesen Fällen einen Rat, wie Sie überhaupt anfangen sollen? Manchmal denke ich, das Beste wäre, die Anforderungen und die möglichen Implementierungen zu besprechen, aber ich arbeite alleine. Gibt es ein Forum, in dem solche Diskussionen willkommen sind?
user1620696

2
Hören Sie zunächst auf, alleine zu arbeiten. Es ist sogar besser, einen ahnungslosen Neuling zu haben, der Sie bremst, um Dinge zu erklären. Zweitens lernen Sie, eine Anforderung in Teile zu zerlegen. Machen Sie so lange weiter, bis Sie etwas Beherrschbares haben, auf das Sie Traktion bringen können. Schreiben Sie einen Proof-of-Concept-Code in einer völlig anderen Umgebung, wenn dies erforderlich ist. Tun Sie einfach etwas, das Ihr Verständnis für das Notwendige zum Ausdruck bringt. Testen Sie dann diesen Ausdruck. Sie haben, wie ich finde, schlechte Annahmen getroffen. Das ist gut. Sei bereit, sie zu ändern.
candied_orange

1

Bei der Softwareentwicklung kommt es darauf an, funktionierende Software pünktlich und im Rahmen des Budgets bereitzustellen und dabei alle Akzeptanzkriterien zu erfüllen. Vorausgesetzt, Sie haben das geschafft, ist die wahrgenommene Qualität des Codes oder seiner Struktur ein zweitrangiges Anliegen.

Das Problem ist natürlich, dass das Schreiben von neuem Greenfield-Code in der Regel viel billiger und einfacher ist als das Verwalten von altem Code. Denken Sie also daran, dass Ihr eigentliches Problem die Wartbarkeit ist, anstatt zu sehr auf Codequalität oder -architektur angewiesen zu sein.

Normalerweise wird Code als wartbar angesehen, wenn die Kosten, die Zeit und die Risiken, die mit der Änderung dieses Codes verbunden sind, verhältnismäßig gering sind, so dass das Beheben von Fehlern oder das Implementieren von Änderungen an Anforderungen immer noch kostengünstig ist und Sie durch die Implementierung dieser Änderungen keine "Todesspirale" aufrechterhalten "der Code-Entropie.

Umgekehrt gilt Code als nicht wartbar, wenn Sie ihn nicht sicher ändern oder umgestalten können, ohne das ernsthafte Risiko einzugehen, dass etwas kaputt geht oder zu viel Zeit / Geld aufgewendet wird, um sicherzustellen, dass nichts kaputt geht Im Vergleich zu den Vorteilen von Änderungen überproportional hoch (dh Ihr Arbeitgeber oder Kunde verliert kein Geld, wenn Sie neue Funktionen hinzufügen, Fehler beheben usw.)

Denken Sie daran, dass selbst das teuflischste Spaghetti-Durcheinander möglicherweise gewartet werden kann , wenn Sie genügend Vorräte in der Nähe haben, um sich vor Veränderungen zu schützen (obwohl solche Fälle selten sind). Das Problem bei einem Spaghetti-Durcheinander besteht darin, dass der Schutz vor Änderungen recht teuer und ineffizient ist - insbesondere, wenn Sie dies nachträglich tun.

Die wahrscheinlich zuverlässigste Methode, um sicherzustellen, dass Sie wartbaren Code geschrieben haben, besteht darin, (wo dies vernünftigerweise möglich ist) gleichzeitig eine angemessene Reihe automatisierter Tests zu schreiben (und dabei alle anderen verfügbaren statischen Analysetools zu nutzen).

Sie müssen nicht unbedingt eine strenge Entwicklungsmethode wie TDD / BDD befolgen, um am Ende genügend automatisierte Tests zu erhalten, mit denen Sie eine Umgestaltung durchführen können. Sie brauchen nur genug , um den Code in Zukunft vor unbeabsichtigten Änderungen zu schützen.

Wenn Ihr Code von automatisierten Tests abgedeckt wird, können Sie sich in Bezug auf Design und Struktur entspannen, da Sie wissen, dass Sie von diesen Tests abgedeckt werden. Sie können zu einem späteren Zeitpunkt aggressiv umgestalten oder es sogar wegwerfen und von vorne beginnen.

Dies wirft die Frage auf, wie man leicht testbaren Code schreibt. Dies ist in der Regel das Hauptargument für die Einhaltung der SOLID-Grundsätze. Tatsächlich ist das Kennzeichen von Code, das den SOLID-Grundsätzen entspricht, dass es einfach und zeit- und kosteneffizient ist, Komponententests zu schreiben.

Natürlich haben Sie manchmal auch keine Zeit, Komponententests zu schreiben. Wenn Sie jedoch Ihren gesamten Code geschrieben haben und die Frage "Wie schreibe ich dafür automatisierte Tests?" (Auch wenn Sie diese Tests nicht implementiert haben), ist es Ihnen wahrscheinlich auch gelungen, ein Design zu finden, das einigermaßen wartbar ist.


1
Wir haben nie Zeit, automatisierte Tests zu schreiben, aber wir haben immer wieder Zeit, manuelle Tests durchzuführen ...
Nick Keighley

Ebenso haben wir nie Zeit, den Code beim ersten Mal "richtig" und "sauber" zu schreiben, aber es scheint endlose Zeit zu haben, ihn immer und immer wieder zu korrigieren, aufgrund der fehlgeleiteten, aber so vorherrschenden Denkweise in dieser Beitrag.
Eintauchen

@Dunk Ich glaube nicht, dass es realistisch ist, davon auszugehen, dass sich Code niemals ändern oder überarbeitet werden sollte. Bei Unit-Test-Praktiken und SOLID-Richtlinien geht es darum, Praktiken zu fördern, die zu einem Code führen, der einfach und kostengünstig zu ändern ist, wenn das Unvermeidliche eintritt - z Lösung und Änderungen der Anforderungen, oder sogar der ursprüngliche Code enthielt Fehler, weil Entwickler nur Menschen sind; oder vielleicht hat der Entwickler die Anforderungen missverstanden oder bisher unbekannte technische Einschränkungen entdeckt ...
Ben Cottrell

1
@BenCottrell - da stimme ich voll zu. Code muss immer überarbeitet werden. Dies führt jedoch dazu, dass sich die Leute die Zeit nehmen, "Upfront Design" zu machen und etwas "sauberen Code" als eine Art Fehler zu schreiben. Sie verwenden das Mantra "pünktlich" und "im Budget", um einen schlechten Code / Design zu rechtfertigen. Sie können alle "Praktiken" verwenden, die Sie möchten, aber es wird Ihnen keinen "Code kaufen, der einfach und billig zu ändern ist", ohne zunächst ein gutes Design und einen relativ "sauberen Code" zu haben. Ein gutes Design und ein "sauberer Code" haben das Nebenprodukt, dass das Zeit- und Budgetziel tatsächlich erreicht wird.
Dunk

@Dunk Das hört sich so an, als ob Sie sagen, dass sich viele Entwickler einfach nicht um die Codequalität kümmern, was meiner Meinung nach normalerweise nicht der Fall ist. In der Realität gibt es meines Erachtens zwei größere Probleme: Erstens können sich Schätzungen leicht als falsch herausstellen, obwohl Entwickler möglicherweise eine Schätzung für das Budget und die Frist vorlegen. Zweitens haben die Projektbeteiligten das letzte Wort über Zeit und Kosten, was bedeutet, dass Risiken, Budgets und Fristen die technischen Bedenken außer Kraft setzen. Angesichts der Wahl zwischen "definitiv zu spät / zu viel Budget" oder "potenziell schlechtem Code" stelle ich fest, dass sich die Stakeholder häufig für Letzteres entscheiden.
Ben Cottrell
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.