Der beste Weg, um überwältigenden Code in überschaubare Teile zu zerlegen?


13

Ich werde immer wieder von großen Projekten überwältigt, sobald sie ein bestimmtes Maß an Komplexität erreichen. Sobald ich einen bestimmten Punkt in einem Projekt erreicht habe, schleiche ich langsam und finde mich dabei wieder, meine Schritte zurückzuverfolgen und alle Arten von Verwirrung auszuräumen.

Aufgrund meiner Schwäche bin ich wirklich gut im Refactoring geworden. Und ich versuche immer, meine Objekte in kleinere, handlichere zu zerlegen. Diese Schwäche hat wahrscheinlich auch dazu geführt, dass ich zu sehr darauf geachtet habe, die Dinge richtig zu gestalten.

Ich weiß, wenn ich meine Probleme in kleinere aufteilen kann, kann ich sie reibungslos lösen. Eine denkbare Strategie ist die testgetriebene Entwicklung. Was kann ich sonst noch tun?


2
"Ich versuche immer, meine Objekte in kleinere, handlichere Objekte zu zerlegen" und "Ich weiß, wenn ich meine Probleme in kleinere aufteilen kann, kann ich sie reibungslos lösen". Machen Sie Ihre Frage etwas rhetorisch.
Morgan Herlocker

2
Lesen Sie Refactoring (Fowler) und Design Patterns (GoF) . Diese Frage stellt sich wirklich die Frage: "Wie strukturiere ich Code?" und wenn du das fragst, hast du einen weiten Weg vor dir ; Verlassen Sie sich nicht auf einen einzigen Frage-und-Antwort-Thread, der Sie auf halbem Weg dorthin bringt.
Aaronaught

Antworten:


13

hör auf, über den Code nachzudenken

Denken Sie über Ebenen, Features, Module, Services und andere übergeordnete Abstraktionen nach

Sie werden überwältigt, weil Sie zu niedrig denken


9

Es ist einfach , den Komplex zu vereinfachen . Warte, denke, es ist umgekehrt.

Jeder hat damit zu kämpfen, es gibt keine einfache Lösung, die überaus effektiv ist.

Da Sie dies in Ihren Fragen nicht aufgeführt haben, wäre mein Vorschlag:

Konzentration auf den funktionalen Zusammenhalt durch:

Prinzip der Einzelverantwortung besagt, dass jedes Objekt eine Einzelverantwortung haben sollte und dass die Verantwortung vollständig von der Klasse eingekapselt werden sollte. Alle seine Dienste sollten eng mit dieser Verantwortung verbunden sein.

Wenn Sie es unter den Ergebnissen auf der ersten Seite googeln, finden Sie zwei großartige Ressourcen:

  • " Single Responsibility Principle " von Robert C. Martin (Feb / 2002): In diesem Prinzip wird die Notwendigkeit erörtert, Dinge, die sich aus unterschiedlichen Gründen ändern, in verschiedene Klassen einzuteilen.
  • " Curly's Law: Do One Thing " von Jeff Atwood (März 2007): Das Prinzip der Einzelverantwortung besagt, dass eine Klasse nur einen Grund haben sollte, sich zu ändern.

Was ist Zusammenhalt in der Informatik?

Kohäsion ist ein Maß dafür, wie eng die Verantwortlichkeiten eines einzelnen Moduls zusammenhängen oder konzentriert sind. Wenn bei der objektorientierten Programmierung die Methoden, die der angegebenen Klasse dienen, in vielerlei Hinsicht ähnlich sind, wird von einer hohen Kohäsion der Klasse gesprochen. In einem System mit hohem Zusammenhalt werden die Lesbarkeit des Codes und die Wahrscheinlichkeit der Wiederverwendung erhöht, während die Komplexität überschaubar bleibt.

Die Kohäsion wird verringert, wenn : - die in eine Klasse eingebetteten Funktionen, auf die über ihre Methoden zugegriffen wird, wenig gemeinsam haben. - Methoden führen viele verschiedene Aktivitäten aus, häufig unter Verwendung von grobkörnigen oder nicht verwandten Datensätzen.

Nachteile einer geringen Kohäsion (oder einer „schwachen Kohäsion“) sind: - Erhöhte Schwierigkeit beim Verstehen von Modulen. - Erhöhte Schwierigkeit bei der Wartung eines Systems, da sich logische Änderungen in der Domäne auf mehrere Module auswirken und Änderungen in einem Modul Änderungen in verwandten Modulen erfordern. - Die Schwierigkeit, ein Modul wiederzuverwenden, wurde erhöht, da die meisten Anwendungen nicht die zufälligen Operationen eines Moduls benötigen.

Wenn Sie Fragen haben, lassen Sie es mich wissen.


1

Zerlegen Sie Features in das kleinstmögliche Element. Zum Beispiel ein einzelnes Feld in einem Formular. Wählen Sie das riskanteste oder das mit der höchsten Priorität und fahren Sie fort, als wäre es eine einfache Fehlerbehebung, kein großes Projekt. Es ist wahr, dass Sie später einige Umgestaltungen vornehmen müssen, aber zumindest werden Sie Fortschritte machen.


1

Aus meiner Erfahrung haben Sie Ihre eigene Frage mit dem Kommentar zu TDD beantwortet. Für mich war es oft dasselbe wie für Sie. Der frühe, schnelle Erfolg wurde schnell zu einer Sackgasse, sobald das System eine bestimmte Größe erreicht hatte. Bei TDD hat es geholfen, weil Sie jeden Teil des Systems als kleine Brocken angehen konnten und wussten, dass der Rest des Systems so weiterarbeiten würde oder sollte, wie Sie es verlassen haben. Ich denke auch, mit TDD hilft es sicherzustellen, dass Ihr System klar in kleinere Blöcke aufgeteilt ist, die unabhängig testbar sind.


0

Einige Leute sind gut darin, modulare, leicht verständliche Programme zu entwerfen, aber der Mehrheit der Programmierer fehlt diese Möglichkeit mehr oder weniger. Ich kenne kein Buch, keine Prozedur oder Übung, die einen der ersten Programmierertypen in den zweiten verwandeln kann, außer möglicherweise für viel Erfahrung. Aber da bin ich mir nicht mal sicher.

Das Fazit ist, dass die meisten Programmierer Schwierigkeiten haben werden, sich über das Mittelmaß zu erheben, einige wenige werden es schaffen, in Ordnung zu sein (wo ich mich und vielleicht 50% der professionellen Programmierer in der IB-Branche positionieren würde), und ein sehr kleine Minderheit wird ausgezeichnet sein. Ich sollte sagen, dass ich in meiner langen Karriere noch nie einen dieser hervorragenden getroffen habe :-)


2
Ich sehe, woher du kommst und ein Teil von mir stimmt dir zu, aber ich kann nicht anders, als das ein bisschen defätistisch zu finden. Ja, es gibt keine magische Pille, die einen schlechten Programmierer in einen guten verwandelt, aber durch Erfahrung, gezieltes Lernen und ehrliche Bewertung der geleisteten Verbesserungen geschieht dies. Wie schnell und wo sich das Plateau befindet, hängt von der Person ab, aber ich denke, dass es viel um Motivation geht.

1
+1 @Der Mund einer Kuh: Stimmen Sie zu, und Peter Norvig , Google-Forschungsdirektor, der ein "ausgezeichneter" Programmierer ist: Bringen Sie sich in zehn Jahren das Programmieren bei
Fehler

1
@blunders - ein guter Artikel. Es ist das schmutzige kleine Geheimnis, das uns die Marketing-Männer nicht verraten wollen (außer natürlich Sega). Üben, üben, üben. Es funktioniert angeblich auch für Japaner alljapaneseallthetime.com/blog

Ich hatte einen Kollegen, der zu dem Schluss kam, dass einige Entwickler "Design Blind" sind und keine großen, ordentlich verwaltbaren Systeme entwerfen können. Wenn Sie blind sind, hilft Ihnen nichts. Das GOF Design Patterns-Buch könnte einem Programmierer helfen, der noch nie gutes Design gesehen, aber viel Code geschrieben hat.
Tim Williscroft

0

Ich denke, viele Leute versuchen, Lösungen zu überdenken. Sie verfolgen den "Adam & Eve" -Ansatz, wenn ein etwas praktischerer Ansatz die Dinge erheblich vereinfachen würde.

Spezialisierte Klassen sind nicht böse, sie sind die natürliche Folge von Sound-Software-Design.

Meiner Meinung nach verstehen viele Programmierer dies nicht, und es gibt kein Buch, von dem ich weiß, dass es dies völlig klar macht.

Eine andere Sache, die sicherlich hilft, ist TDD, mit der Sie verstehen, wie Sie die Klasse in der Praxis einsetzen werden, und in vielen Fällen den Tag retten können, da sie frühzeitig mögliche Probleme / Einschränkungen aufzeigt.

Zuletzt ist eine andere SEHR wichtige Sache, nach der ich suchen würde, wenn ich Sie war, Entwurfsmuster. Designmuster sind, wie Leute, die schlauer sind als Sie oder ich, Programmierprobleme lösen. Die Idee hinter Mustern, raten Sie mal, ist, dass sie nicht als Kochbücher verwendet werden sollen, sondern als Rezepte, die Sie nur zuschlagen, sondern in erster Linie durchdacht sind und Ihre Anwendungsdomäne verstehen.

Eine kluge Verwendung von Mustern reduziert die Menge der zu verwaltenden Details erheblich.

Eine gute Entwurfsmusterbibliothek, die genau auf Ihre Bedürfnisse zugeschnitten ist, ist von unschätzbarem Wert. Sehen wir uns ein sehr einfaches Beispiel an, um die Dinge in einen Kontext zu bringen:

Stellen Sie sich vor, Sie haben ein Formular, in dem sich andere Formulare aktualisieren müssen, wenn eine Schaltfläche gedrückt wird. Dies ist ein typisches "Beobachter" -Muster. Sie haben ein Subjekt und mehrere Beobachter, die sich beim Subjekt registrieren. Warum müssen Sie eine Schnittstelle implementieren? Sie können einfach die Methoden hinzufügen oder, noch besser, eine Benutzeroberfläche für die Beobachter und eine allgemeine Liste für das Thema verwenden. Jetzt haben Sie das Beste aus beiden Welten: Unabhängigkeit für die Beobachter und keine launischen Dinge zu diesem Thema.

Hoffe es macht Sinn für dich!

Andrea


Übrigens, um es klar zu machen: Ich befürworte keine wilden Klassen, die wie Gremlins aufwachsen, sondern eher einen kleinen praktischen Sinn :)
Andrea Raimondi

0

Das Problem der Entwicklungsgeschwindigkeit und Lesbarkeit kann auftreten, wenn wir die Notwendigkeit der Abstraktion übersehen. In einigen der großen Codebasen, mit denen ich gearbeitet habe, war der häufigste Feind die zigfache Anzahl spezialisierter Klassen mit sehr ähnlichen Funktionen, die den Code zum Aufblähen bringen. Wenn wir einen Schritt zurücktreten und die Anforderungen als Ganzes und nicht als Teil der Anwendung verstehen, kommen uns viele Abstraktionen in den Sinn.

Einige einfache Schritte, die mir geholfen haben

  • Verwenden Sie einen Ähnlichkeitsanalysator (wie Simian), um doppelte Codeblöcke in der Codebasis zu finden. Viel doppelter Code bedeutet weniger Abstraktion.
  • Überwachen Sie die Größe von Klassen und Methoden. Große Klassen und Methoden bedeuten, dass nur wenige Dienste oder Controller zu Göttern werden.
  • Machen Sie Unit- / Integrationstests obligatorisch, geben Sie das Vertrauen in die Umgestaltung und fungieren Sie auch als Spezifikation.
  • 14-tägiger Rückblick mit dem Unternehmen, um zu verstehen, ob die verwendeten technischen / geschäftlichen / Domain-Begriffe in den Klassennamen wiedergegeben sind. Dies hilft beim Verstehen und Abrufen von Namen für erstklassige Sammlungen, anstatt sie als einfache Mengen und Listen darzustellen. Einige Abstraktionen, an die wir nie gedacht haben, tauchen auch auf, wenn wir uns mit den Geschäftsleuten zusammensetzen.

Das ist auch die Sache, für die ich eintrete. Was ich denke ist, dass es ein Gleichgewicht zwischen Abstraktion und Spezialisierung geben muss: Zu viel Spezialisierung ist so schlecht wie zu viel Abstraktion.
Andrea Raimondi
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.