Ich bin kürzlich auf eine Situation in unserer Codebasis gestoßen, in der ein anderes Team eine 'Gott-Klasse' erstellt hat, die ungefähr 800 Methoden enthält, die als Teilklasse auf 135 Dateien aufgeteilt sind.
Ich habe das andere Team danach gefragt. Obwohl ich aus dem Bauch herausgeholt habe, bestehen sie darauf, dass es sich um ein gutes Design handelt, eine gängige Praxis ist und dass es die Modularität und die einfache Implementierung fördert, da neue Entwickler die Funktionalität fast ohne Wissen über den Rest weiterentwickeln können vom System.
Ist dies tatsächlich eine gängige Praxis oder in irgendeiner Weise eine gute Idee? Ich bin geneigt, sofort Maßnahmen zu ergreifen, um dieses Biest zu Fall zu bringen (oder zumindest zu verhindern, dass es weiter wächst), aber ich bin bereit zu glauben, dass ich falsch liege.
Antworten:
Dies ist in keiner Weise eine gute Idee.
Teilklassen helfen dem Formulardesigner. Die Verwendung aus einem anderen Grund (und möglicherweise für den beabsichtigten Zweck, aber das ist eine andere Sache) ist eine schlechte Idee, da dies zu aufgeblähten Klassen führt, die schwer zu lesen und zu verstehen sind.
Betrachten Sie es so: Wenn eine Gottklasse mit 800 Methoden in einer Datei, in der Sie wissen, wo sich alles befindet, eine schlechte Sache ist - und ich denke, jeder würde dem zustimmen -, wie kann dann eine Gottklasse mit 800 Methoden funktionieren Auf 135 Dateien verteilt, wo man nicht weiß, wo alles möglicherweise eine gute Sache ist?
quelle
partial
es auch ohne generierten Code nützlich sein kann. Vielleicht, wenn Sie so etwas wie eine verschachtelte Klasse haben?Die Frage war also:
Zu den derzeit verfügbaren Antworten gehört ein klares Nein . Es gibt also einige andere Dinge, die ich daran ändern könnte, wie z. Sogar der Verfahrenscode kann modular aufgebaut werden und alles einbeziehen. Mit Ausnahme der Küchenspüle erreichen Sie keine Modularität. Was eine in Teilklassen aufgeteilte Riesenklasse tut, summiert sich zu einem großen Durcheinander.
Diese Frage ist jedoch ein roter Faden für den wirklich kritischen Teil, der übersehen wurde. Da das OP auch folgendes zu der Situation zu sagen hat:
HALTE DEINE PFERDE!
Dies hier ist etwas, das mein bildlich gesprochenes Monokel in meine bildliche Tasse Tee fallen lassen würde.
Ich war in ähnlichen Situationen und lass mich dir sagen: FALLE NICHT dem Drang nach. Natürlich können Sie den Nuke Hammer of Justice im Team ablegen, aber bevor Sie dies tun, müssen Sie sich mit dem folgenden Rätsel auseinandersetzen:
Was passiert , wenn Sie das Team sagen , dass ihr Code saugt und aus sod ?
(... oder so ähnlich, aber weniger offensiv, es spielt keine Rolle, denn sie werden beleidigt, egal was Sie tun, wenn Sie sich dazu entschließen, mit aller Kraft gegen sie vorzugehen.)
Wie ist die aktuelle Situation mit der Codebasis? Funktioniert es? Dann werden Sie große Probleme damit haben, ihren Kunden zu erklären, dass ihr Code im Wesentlichen scheiße ist . Egal aus welchen Gründen: Solange es funktioniert, kümmern sich die meisten Kunden nicht darum, wie der Code organisiert ist.
Versetzen Sie sich auch in ihre Lage, was würden sie tun? Lassen Sie mich Sie mit dem folgenden sehr möglichen Ergebnis amüsieren:
Sehen Sie, was einflussreiches Teammitglied # 4 dort getan hat? Er ging zur Geschäftsführung und reduzierte Ihr Karma in der Firma. Er könnte amerikanisch-italienisch sein und jedem sagen, er solle sich keine Sorgen machen, aber dann wäre ich rassistisch.
Es ist auch eine schlechte Idee, das beleidigende Team in eine Ecke zu schieben und zuzugeben, dass es so lange falsch gemacht hat. Sie verlieren Respekt und etwas büropolitisches Karma.
Auch wenn Sie es geschafft haben, ein paar Leute dazu zu bringen, sich zu melden, um dem Team eine Lektion zu erteilen, denken Sie daran, dass Sie dies ziemlich klugen Leuten antun, die anscheinend einige Dinge erledigen. Sobald der Code umgeschrieben / überarbeitet / behandelt / was auch immer behandelt wird, treten Probleme auf, die Sie als Feuerstarter zur Rechenschaft ziehen .
In solchen Situationen kontrovers zu sein, ist meistens ein Verlust / Verlust-Spiel, da es das Risiko birgt, ein Teufelskreis von Schuldzuweisungen zu werden. Dies ist ein suboptimales Ergebnis für diese Situation. Selbst wenn Sie gewinnen, werden Sie plötzlich über das Durcheinander gebracht, das jemand anderes angerichtet hat.
Es gibt andere (viel ausgereifte) Wege
Ich war einmal in einer ähnlichen Situation, aber dann nahm ich einen Pfeil in das Knie. Nach einer Weile mit dem plötzlichen Karrierewechsel im Hinterkopf bekam ich ein Buch Driving Technical Change von Terrence Ryan . Es werden verschiedene Muster von Skeptikern aufgelistet, die Leute handeln nicht nach guten Ideen. Sie sind alle höchstwahrscheinlich im Fall des OP anwendbar:
Das Buch geht weiter mit einer Liste von Strategien und so weiter, aber im Falle des OP ist es eine Frage der Überzeugung. Sich mit Fakten über das Anti-Pattern zu messen, ist nicht genug.
Wenn es in Ihrem Interesse ist, die Codequalität zu verbessern, geben Sie dem betreffenden Team zumindest die Möglichkeit, sein eigenes Durcheinander zu wiederholen und zu korrigieren . Persönlich würde ich versuchen, sie zu beeinflussen, indem ich ihnen zuhöre und ihnen wichtige Fragen stelle. Lassen Sie sie ihre Geschichte erzählen:
... und so weiter. Geben Sie ihnen kleine Vorschläge, damit sie vorankommen können. Es braucht Zeit und braucht ein bisschen büropolitisches Ellbogenfett, aber Geduld und harte Arbeit sind eine Tugend, oder?
quelle
Auf der Seite MSDN Partial Classes and Methods werden zwei Situationen für die Verwendung von Teilklassen vorgeschlagen:
1. Aufteilen einer riesigen Klasse in mehrere separate Dateien.
2. Um einen Ort zu haben, an dem automatisch generierter Quellcode abgelegt werden kann.
2 wird häufig von Visual Studio verwendet (z. B. für Aspx-Dateien und für Winforms). Dies ist eine sinnvolle Verwendung von Teilklassen.
1 ist das, was dein Team tut. Ich würde sagen, dass die Verwendung von Teilklassen eine absolut vernünftige Methode ist, um Modularität zu erreichen, wenn Sie über Riesenklassen verfügen, aber Riesenklassen selbst sind unvernünftig. Mit anderen Worten, eine Riesenklasse ist eine schlechte Idee, aber wenn Sie eine Riesenklasse haben wollen, sind Teilklassen eine gute Idee.
Wenn Sie eine Klasse auf intelligente Weise in separate Dateien für verschiedene Benutzer aufteilen können, können Sie sie stattdessen nicht einfach in separate Klassen aufteilen?
quelle
Letztendlich machen sie also eine normale prozedurale Entwicklung ohne OOP. Sie haben einen globalen Namespace mit allen Methoden, Variablen und so weiter.
Entweder sie überreden, dass sie es falsch machen, oder verdammt noch mal raus.
quelle
Eine Utility-Klasse enthält Methoden, die nicht sinnvoll mit anderen Methoden kombiniert werden können, um eine Klasse zu erstellen. Wenn Sie über 800 Methoden haben, die in 135 Dateien aufgeteilt sind, hat es wahrscheinlich jemand geschafft, einige gängige Methoden zu finden ...
Nur weil Sie eine Utility-Klasse haben, heißt das nicht, dass Sie keine andere Utility-Klasse haben können.
Selbst wenn Sie über 800 meist nicht verwandte Methoden verfügen, ist die Lösung keine große Klasse und enthält nicht viele Dateien. Die Lösung ist ein Namespace, einige Subnamespaces und viele kleine Klassen. Dies ist etwas mehr Arbeit (Sie müssen einen Namen für die Klasse sowie die Methode ausarbeiten). Aber es wird Ihnen das Leben erleichtern, wenn Sie dieses Chaos beseitigen müssen, und in der Zwischenzeit wird es die Verwendung von Intellisense vereinfachen (dh es wird einfacher, herauszufinden, wo eine Methode es verwenden soll).
Und nein, das ist nicht üblich (mehr die Anzahl der Dateien als die Anzahl der freien Funktionen).
quelle
Das mag ich überhaupt nicht. Möglicherweise machten die Teilklassen jedoch für die Entwickler während der Entwicklung Sinn, da sie die gleichzeitige Entwicklung dieser großen Anzahl von Methoden ermöglichten, insbesondere, wenn zwischen ihnen keine großen Abhängigkeiten bestehen.
Eine andere Möglichkeit besteht darin, dass diese Teilklassen erstellt wurden, um eine automatisch generierte Kernklasse zu ändern. In diesem Fall sollte man sie nicht berühren, da sonst der benutzerdefinierte Code beim erneuten Generieren ausgepeitscht wird.
Ich bin mir nicht sicher, ob jemand dies ohne etwas Studium mühelos durchhalten kann. Wenn Sie es jetzt töten, wird die Anzahl der Methoden nicht sinken. Die Anzahl der Methoden und die Komplexität sind für mich das eigentliche Problem. Wenn die Methoden wirklich zu der Klasse gehören, wird das Vorhandensein einer großen Datei Ihr Leben nicht einfacher machen, insbesondere bei der Wartung. Tatsächlich ist es möglicherweise fehleranfälliger, diesen gesamten Code für dumme Fehler wie die Suche mit Platzhaltern bereitzustellen und ersetzen.
Seien Sie also vorsichtig und begründen Sie die Tötungsentscheidung. Überlegen Sie auch, welche Tests erforderlich sind.
quelle
Aus Sicht des praktischen Designs ist es vollkommen in Ordnung, wenn man annimmt, dass die 135 Dateien Methoden ähnlich wie bei herkömmlichen Klassen gruppieren. Es sind nur durchschnittlich 6 Methoden pro Datei. Es ist definitiv nicht die beliebteste oder traditionellste Art, ein Projekt zu entwerfen. Der Versuch, es zu ändern, wird nur eine Reihe von Problemen und einen schlechten Willen ohne wirklichen Nutzen hervorrufen. Wenn Sie das Projekt an die OO-Standards anpassen, entstehen so viele Probleme, wie es löst. Es ist eine völlig andere Sache, wenn die mehreren Dateien tatsächlich keine sinnvollen Trennungen liefern.
quelle
Abgesehen von den bereits erwähnten Antworten können Teilklassen in einem mehrschichtigen Entwurf nützlich sein, in dem Sie Funktionen organisieren möchten, die Ihre Klassenhierarchie in separate schichtenspezifische Dateien aufteilen. Dies ermöglicht die Verwendung des Lösungs-Explorers zum Navigieren durch die Funktionen pro Ebene (nach Dateiorganisation) und der Klassenansicht zum Navigieren durch die Funktionen pro Klasse. Ich würde es vorziehen, eine Sprache zu verwenden, die Mixins und / oder Merkmale unterstützt, aber Teilklassen sind eine sinnvolle Alternative, wenn sie sparsam verwendet werden, und sollten keinen Ersatz für ein gutes Design der Klassenhierarchie darstellen.
quelle