2010-02-08 3 views
21

When is a function too long? ist eine Teilmenge dieser Frage, denke ich.Wann ist eine Klasse zu lang?

Was sind ein paar gute Metriken für die Feststellung, dass eine Klasse zu lang ist?

Ich bestätige eine Reihe von Richtlinien zur Code-Akzeptanz für ein Projekt mit externen Auftragnehmern und erkannte, dass ich dies in der Vergangenheit nicht behandelt habe, aber dies in Zukunft abdecken sollte.

+0

welche Sprache?Ich denke die Antwort unterscheidet sich zum Beispiel für Java gegenüber Scala. Im letzteren Fall sind Klassen typischerweise (und sollten!) Kürzer. –

+0

Werfen Sie einen Blick auf diese Frage - http://Stackoverflow.com/questions/849557/in-c-how-many-lines-before-a-class-should-be-consider-to-be- reflektored/ –

+0

Close verwandte Frage: http://stackoverflow.com/questions/1086851/good-practice-class-line-count/1086865#1086865 – sleske

Antwort

61

Wenn es mehr als eine Verantwortung hat.

Lassen Sie mich zitieren Robert C. Martin Clean Code hier:

Die erste Regel der Klassen ist, dass sie klein sein sollte. Die zweite Regel von Klassen ist, dass sie kleiner sein sollten. ... Mit Funktionen haben wir die Größe gemessen, indem wir physikalische Linien gezählt haben. Bei Klassen verwenden wir ein anderes Maß. Wir zählen Verantwortung. [Kapitel 10, Seite 136]

+3

+1 Top-Antwort Herr. – Matt

+0

Dies ist offensichtlich nicht wahr. Haben Sie schon einmal CRC-Karten (class, responsibility, collaborator) verwendet - eines der klassischen Werkzeuge, die im OO-Design verwendet werden? Jede Karte hat eine einzelne Klasse und eine Liste mit VERTRAULICHEN Verantwortlichkeiten. –

+0

@Neil, ich würde behaupten, dass OO-Design-Methoden aus den 80er Jahren nicht die große Erfahrung, die seit damals gewonnen wurde, enthalten. Dennoch scheint das Konzept dieser Karten nützlich zu sein, also danke, dass du sie erwähnt hast! – Thorsten79

2

Eine Klasse sollte nur eine Verantwortlichkeit haben. Das ist ein besseres Maß als seine Länge. Wenn Sie also Ihren Code entwerfen, sollte jede Einheit Ihres Designs (ein Typ oder eine Klasse) nur für eine Sache verantwortlich sein (was auch immer "eine Sache" in Ihrem Fall ist). Wenn Sie es so einfach wie möglich halten, werden Sie nicht in Unordnung geraten.

1

Wenn Sie denken, dass es jetzt schwieriger für Sie geworden ist, es zu verwalten und Sie stecken bleiben.

+0

Ich versuche, einen Standard zu entwickeln, dem andere folgen können. Ich habe ein paar Klassen über 3000 Zeilen, und während ich ihnen erklären möchte, dass dies eine schlechte Idee ist, versuche ich Regeln aufzustellen, um zu verhindern, dass ich in Zukunft als Backstop agieren muss. –

1

Wenn ich das verwendete Designmuster ignoriere, würde ich den Verantwortungsbereich der Klasse berücksichtigen. Wenn der Umfang zu groß ist, sollte er in spezifische Verantwortlichkeiten aufgeteilt, abstrahiert oder generischer gemacht werden.

Ich würde nicht wirklich die Anzahl der Zeilen als aussagekräftige Metrik nehmen.

+0

Keine Angst vor "Codezeilen" als Metrik, nur um aussagekräftigere Metriken zu finden. –

10

Nicht mehr als 17 Zeilen. Nicht mehr und nicht weniger. Also, wenn unter 17 Zeilen Wagenrücklauf ist, wird es den Trick machen. Wenn es mehr als 17 ist, müssen Sie andere Funktionen innerhalb der Funktion aufrufen.

Zum Beispiel:

public function myFunction() { 
... 
line 17: myFunctionPart2(); 
} 

public function myFunctionPart2() { 
... 
line 17: myFunctionPart3(); 
} 

Und so weiter.

Seine hübsche Standardprogrammierungspraxis.

+1

Er fragte nach Klassen ... nicht nach Funktionen. 17 Zeilen in einer Klasse wären weniger als winzig. –

+5

Oh, für Klassen ist das Limit 19 Zeilen. – wowcat

+6

+1, weil das lustig ist. – Steven

15

Klasse Fan-out-Komplexität: Die Anzahl der anderen Klassen, auf die sich eine Klasse bezieht. Es wurde auch gezeigt, dass das Quadrat davon die Wartungsmenge angibt, die in funktionalen Programmen (zumindest auf Dateibasis) benötigt wird.

Zyklomatische Komplexität: Überprüft die zyklomatische Komplexität auf ein spezifiziertes Limit. Die Komplexität wird anhand der Anzahl von if, while, do, for,?:, Catch, switch, case-Anweisungen und Operatoren & & und || gemessen (plus eins) im Hauptteil eines Konstruktors, einer Methode, eines statischen Initialisierers oder eines Instanzinitialisierers. Es ist ein Maß für die minimale Anzahl von möglichen Pfaden durch die Quelle und daher die Anzahl der erforderlichen Tests. Im Allgemeinen gilt 1-4 als gut, 5-7 als gut, 8-10 als re-factoring und 11+ als Re-Faktor.

+0

Zurück zu diesen Jahren später; Die zyklomatische Komplexität ist eine gute Annäherung erster Ordnung, testet aber nur jede einzelne Methode und ist oft ein Ablenkungsmanöver; Es misst die Schwierigkeit des Codes, aber was Sie eigentlich wissen möchten, ist, wie viel Mühe * es gab, da zu sein. (Das Schreiben von komplexem Code ist in Ordnung, wenn der Grund dafür komplex ist; das Schreiben von Code mittlerer Komplexität ist schlecht, wenn er einfach trivial sein könnte!) –