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.
quelle
Antworten:
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.
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.
quelle
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.
quelle