Frage

Ich lese viel über gute und schlechte Praktiken in der OOP-design.Es ist schön zu wissen, Ihr design ist schlecht oder gut.Aber wie kommt man vom schlechten zu gutem design?Ich habe split-interface (xaml) und codebehind aus dem main businesslogic.Klasse.Das Letzte-Klasse wächst groß.Ich habe versucht, dass man es in kleinere Klassen, aber ich bin nun fest.Irgendwelche Ideen auf, wie zu split große Klassen?Die main-Klasse hat 1 Liste von Daten von verschiedenen Arten.Ich bin die Berechnungen auf der insgesamt, aber auch für die einzelnen Arten.Ich habe Methoden zum durchführen dieser Berechnungen sind aufgerufen, die Ereignisse behandelt, die in der codebehind.Irgendwelche Ideen, wo von hier aus gehen?

Zusätzliche Info:

Wir sind schon über 6 Monate in dieses Projekt.Ich habe mit der Objekt-orientierten Sprachen Jahren (zuerst c++, java und jetzt c#), aber nie an einem großen Projekt wie diesem.Ich glaube, wir haben einige Irrwege in der Anfang, und ich denke, wir müssen diese zu korrigieren.Ich kann nicht geben Sie alle details zu diesem Projekt im moment.Ich werde um ein oder zwei Bücher über design.Wenn ich eine Trennung aller Klassen, wie kann ich Klebe Sie wieder zusammen?Vielleicht ist es sogar besser, weiterhin auf diese Weise zu der ersten Version und baute Teile nach, dass er für eine zweite Version?

War es hilfreich?

Lösung

Die main-Klasse hat 1 Liste von Daten verschiedene Arten.Ich mache Berechnungen, die auf den insgesamt, sondern auch auf die einzelnen Arten.Ich habe Methoden um diese Berechnungen auszuführen, die sind aufgerufen, die Ereignisse behandelt, die in der codebehind.Irgendwelche Ideen, wo zu gehen hier?

Wenn es gibt eine Menge von Berechnungen basierend auf den Inhalt der Liste, haben Sie überlegt Operationen in eine individuelle Liste Klasse?Das gleiche gilt für die Operationen auf bestimmte Typen, vielleicht könnten Sie sich in die Typen?

In Bezug auf die Durchführung ähnlichen, aber doch unterschiedlichen Operationen auf verschiedene Arten in Erwägung ziehen, die Staat Muster (sehen dies als ein Ersatz für switch-Anweisungen), die ermöglicht Sie zu behandeln die Einrichtungen in einer einheitlichen Art und Weise.

Eine Menge von OOP ist über das wegwerfen einer "top-down"/Mikromanagement Ansatz und unter Berücksichtigung eines "bottom up"/autarke Ansatz.Es lohnt sich zu erinnern, dass weder der Ansatz der "richtige" in der isolation.Erstellen von wartbaren code zu finden, eine sinnvolle balance erfordert eine Menge Gedanken und in der Regel entwickelt sich durch Erfahrung.

Andere Tipps

Praxis und Lesen.Wiederholen :)

Einige der empfohlenen Bücher:

  • Clean Code von Robert C Martin
  • GoF-Design-Patterns
  • Refactoring von Martin Fowler

Ich persönlich mochte auch Kopf Erste Design-Muster, aber der Stil ist vielleicht nicht für jedermann sein.Gibt es ein ähnliches Buch, genannt C# 3.0 Design Patterns (siehe ora.com).Es hat viel von dem gleichen Zeug, aber in einer eher traditionellen Weise.

Ich empfehle Kommissionierung bis Code Complete.Es ist ein tolles Buch, mit Tonnen von guten Beratung zu Fragen wie deine.

Um Ihnen eine schnelle Antwort zu Ihrer Frage, wie split große Klassen, hier ist eine gute Faustregel:machen Sie Ihre Klasse verantwortlich für eine Sache und eine Sache nur.Wenn Sie anfangen, so zu denken, können Sie schnell identifizieren kann code nicht gehört.Wenn etwas nicht gehören, Sie Faktor in eine neue Klasse, und verwenden Sie es von Ihrer ursprünglichen Klasse.

Edit:Nehmen, die denken, Sie nach unten zu "Verfahren" Ebene zu - machen Sie Ihre Methoden, die verantwortlich für eine Sache und eine Sache nur.Hilft, brechen groß (>50 line) Methoden sehr schnell in wiederverwendbare Stücke von code.

Ändern die Weg Sie denken über Objekte.Jedes Objekt sollte eine sehr spezielle Verantwortung.Wenn Sie eine Klasse mit dem Namen etwas generisches wie "MainBusinessLogic" Sie sind wahrscheinlich etwas falsch zu machen.

Großartiger Ort zu starten:Lesen Sie David West Objekt Denken.

Dies ist nur ein Nachtrag zu einigen feinen Buch hier Anregungen.

Je besser ich bekommen OO, desto mehr scheine ich zu reduzieren die Größe des Objekts.Es ist nicht wie ich bin, für kleine Größe oder irgendetwas, aber es scheint passiert zu sein.

Halten Sie kleine, einzelne Verantwortung, einfach zu bedienen und verstehen-alle wichtigen.Jeder Gegenstand sollte so nah an die Kugel-Beweis als möglich überprüfen Sie Ihre Parameter und niemals zulassen, dass Ihr Objekt in einem ungültigen Zustand.Definieren Sie alle gültigen Staaten deutlich in der Dokumentation.

Jedes mal, wenn Sie eine Klasse erstellen, die eine Prüfung für die Klasse.Es prüft nicht nur Ihr code, aber zwingt Sie dazu, verbrauchen Ihre eigenen design.Immer denken Sie an Ihre Klasse aus, dass "Blick von Außen".Achten Sie darauf, nicht zu viel verlangt von der person, die mit Ihrer Klasse, und alles, was Sie fordern von ihm dokumentiert werden sollte, in die Schnittstelle.Oft habe ich nur werfen eine schnelle main in einer Klasse, wenn es ist keine Test-framework zur Verfügung-es fügt ein Beispiel dafür, wie Sie Ihren code direkt in der gleichen Datei.

In der Codierung, fast meine ganze Zeit damit verbracht, herauszufinden, was jemand anderes hat.Wenn ich war in der Lage, nur aus code mit bekannten oder gut dokumentierte APIs, mein job wäre trivial und Zeitpläne deutlich kürzer.

Design-first kann hart sein.Betrachten Codierung Fähigkeit, wie ähnlich wie im Sport Fähigkeit.Die meisten von uns spielen in unsere Einfahrten, ein paar spielen, die auf lokalen Sport-teams.Gutes zu tun up-front-design auf ein kompliziertes Projekt ist die Aufgabe eines national-league-Spieler, Sie sind eins zu einer million.Akzeptieren Sie dies und planen Sie ändern--Iterationen sind dein Freund.(By the way, die meisten von uns DENKEN, wir sind auf der staatlichen Ebene leicht.Wir sind nicht).

Zusätzlich zu Brian ' s Empfehlung Clean Code von Robert C Martin, möchten Sie vielleicht zu Lesen, auf "Onkel Bobs" SOLIDE Prinzipien der objektorientierten Design.

Hört man ihn sprechen über die SOLID-Prinzipien auf Hanselminutes Podcast 145 und clean code .NET Rocks!Show #388.Es ist auch mehr mit ihm auf .NET Rocks!Show #410, aber was er spricht, ist nicht wirklich in Bezug auf Ihre Frage, die ich nur enthalten Fall, dass Sie genossen die ersten beiden.

Die drei podcasts, die ich bevorzugte die Hanselminutes.

Refactoring von Martin Fowler ist ein exzellentes Buch über das ändern der Gestaltung Ihrer software, ohne Sie zu zerbrechen.

Design Patterns funktioniert ähnlich wie algorithims, sondern erzählt, wie Sie um Objekte zu kombinieren, um verschiedene nützliche Aufgaben.

Schließlich Martin Fowler hat eine Vielzahl von nützlichen design-Muster für Anwendungen.Zum Beispiel Passive View

Michael Feathers ' s "Sie arbeiten Effektiv mit Legacy Code" soll sehr gut sein, aber ich werde gestehen, dass ich noch nicht Lesen es selbst.

Gleiche gilt für "Refactoring zu Mustern."

Ich fand, dass die Arbeit an einer komplexen 'Zuordnung', ohne Hilfe und dann zu sehen, wie jemand anderes es Tat, es war eine große Erfahrung für mich.

Eine Zuordnung in allem war die Schaffung einer bank-wie Programm, wo wir hatten zu verfolgen, Transaktionen und in der Lage sein zu berechnen, Zinsen und Dinge wie, dass.Es war wirklich mein erstes OOP-Programm und eine wirklich tolle, weil seine Komplexität.Es wird zu unübersichtlich (für Anfänger) zu tun, es in einem linearen Stil, ohne Fehler zu machen.

Ich kann nur sagen, was für mich funktioniert, und ich habe noch nicht wirklich gefunden, jemand, der auf die gleiche Weise funktioniert, also bin ich mir nicht sicher, ob es Ihnen helfen, sehr viel.

Grundsätzlich ist mein Ansatz ist es, so wenig Unterricht wie möglich, aber auch nicht weniger.

Erste, die einzige Zeit, die Sie brauchen, um Daten zu speichern ist, wenn Sie empfangen es an der Zeit Ein und müssen es zu einem späteren Zeitpunkt B.Wenn Sie es bekommen und es auf Arbeit zur gleichen Zeit, es kann sein, dass es keine Notwendigkeit gibt, es zu lagern.

Zweitens, was tun Sie mit ihm?Wenn du gehst zu werden, Durchlaufen Sie in bestimmten vereinfachten Weise, die Sie können denken, es als eine Anleitung, und das Programm arbeitet er als Dolmetscher einer Anweisung set.In diesem Fall möchten Sie möglicherweise tatsächlich entwerfen Sie ein byte-code-Befehlssatz, mit einem Dolmetscher, und die Kodierung von Informationen in dieser Anleitung.

Dritten, wie oft die Informationen ändern?Wenn Sie einige der Daten ändern sich nur sehr selten, Sie können möglicherweise verwenden Sie die partielle Auswertung (d.h.code generation).Das heißt, Sie nehmen die sich selten ändern und verwenden Sie zum generieren von ad-hoc-Programm, das tut, was Ihre gesamte Programm würde mit dieser information tun, aber sehr viel schneller.Der code-generator ist einfach zu schreiben, weil Sie sich nur mit einem Teil der Eingabe, der Teil, der langsam ändert.

Der Großteil der Daten-Struktur, die ich dieser Tage ist die Unterstützung UI.Dies ist eindeutig nicht halten Objekte, die der Benutzer kümmert, und im Idealfall sollten Sie nicht haben zu kümmern, entweder.Also baute ich eine DSL für UIs, verbirgt sich alles, hoo-haw.

Bleiben Sie Weg von events und Benachrichtigungen, wenn Sie möglicherweise können, weil Sie eben an den Punkten, die in der Zeit und stellen daher inkrementelle änderungen im Staat.Haben Sie sich mächtig sorgen um Ihre möglicherweise gelöscht, dupliziert oder misordered.Oft werden Sie verwendet, auf der Theorie, dass ein einfaches polling Stil wäre "weniger effizient", wenn in der Tat ist oft das Gegenteil passiert.

Also, wenn ich sehe Leute, die alle eingewickelt in die Technologie von Klassen und so weiter, ist es in der Regel, weil Sie eine zu große Menge an Daten-Struktur.

Nur meine downvote-Köder...

Ich empfehle Feather ' s Arbeiten Effektiv mit Legacy Code, verfügbar und durchsuchbar auf Safari, über Refactoring.Es ist voll von nützlichen und einfühlsam Kapiteln wie Ich habe nicht Viel Zeit, und ich Habe Es zu Ändern und Meine Anwendung Hat Keine Struktur.

Perspektiven zu betrachten:

  1. Die Automatisierung von design-Qualität testen - suchen Sie nach tools, die Metriken, die auf die gestalterische Qualität, wie ein cross-check, um Ihre design-Entscheidungen.
  2. Code Testbarkeit - tun Sie alle Ihre refactorings helfen oder behindern test-driven development, schreiben von unit-tests schreiben oder funktionale tests?Wie schwer wird es sein, zu testen, die große Teile der Architektur wieder integriert?
  3. Rechtfertigung - wie Sie verteidigen diese Entscheidungen, die beide von einem zynischen CYA management-und, noch wichtiger, so dass Ihr team glauben, dass im re-design.Können Sie einfach und einheitlich erklären warum eine änderung gemacht wurde und wird, die Erklärung leicht zu finden, in 6 Monaten?

Die persönlichen Vorlieben im design, vor allem refactoring:

  1. Klassen für Konzepte - wenn Sie Zweifel haben, ob es einen einzelnen klaren Konzept, sollte es, eingewickelt in eine Klasse und nicht als stillschweigend als Verhalten in einem oder Methoden.
  2. Viele kommunizieren kleinen Dinge mit Verantwortung einfacher sind zu denken und Audits.Wenn Sie Zweifel darüber, wie ein design-Karten in der realen Welt, gehen Sie zurück zu den alten Verantwortung-Driven-Design Ansatz des Schreibens nach der Verantwortung der jeweiligen Klasse.Wenn Sie dieses harte finden, Ihre Konzepte von dem, was jede Klasse hat möglicherweise verwirrt, oder sind Sie zu viel zu tun.
  3. Keine Angst, durch die Dinge werden groß, wenn Sie sind regelmäßig.Manchmal, z.B.:viele event-Handler auf GUIs, werden Sie berechtigterweise Klassen mit weit mehr Methoden oder Eigenschaften, die als Metriken empfehlen.

Versuchen Sie schreiben von testbarem code, dies allein hat mich gezwungen auf Forschung und Umsetzung von verbesserten OOP practices/design-Konzepte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top