Code-Formatierung: Funktionen basierend auf der Aufrufhierarchie in einer Klassendatei anordnen?

10

Ein Vorschlag aus Bob Martins "Clean Code" lässt mich am Kopf kratzen. "Wenn eine Funktion einmal eine andere aufruft, sollten sie vertikal nahe beieinander liegen und der Anrufer sollte sich über dem Angerufenen befinden."

Bisher habe ich mich mehr oder weniger an die .Net-Richtlinien gehalten, die Klassenmitglieder nach Typ (Eigenschaften, Ctoren, Funktionen) und Sichtbarkeit (öffentlich / prot. / Privat) gruppieren. Der Tipp scheint zunächst ein Problem zu sein. Aber es könnte "einfach funktionieren". Ich persönlich bin auf Fälle gestoßen, in denen mir dieses Layout gefallen hat - einfacher zu analysieren, wenn Sie sich in der richtigen Anrufkette befinden.

Die Idee hinter dem Tipp scheint vernünftig, aber andere Szenarien wie "Lassen Sie mich die öffentliche Oberfläche dieser Klasse betrachten" könnten sich verschlechtern. Vielleicht setzt Onkel Bob auf die kleinen Klassen und die IDE-Unterstützung für die Anzeige von Typen ...

Hat jemand dies über einen längeren Zeitraum ausprobiert?

Update: Scheint, als wäre ein Code-Snippet in Ordnung

class SomeType()
{
  /// fields, ctors, et. all
  public void Method1()   { // calls HelperMethod1 and HelperMethod2 }
  private void HelperMethod1 { // calls HelperMethod3 }
  private void HelperMethod3 {}
  private void HelperMethod2 {}

  public void Method2 () { // and so on... }

}
Gishu
quelle
2
Der grässliche "Onkel Bob" ist nicht gerade der schärfste Bleistift in der Schachtel.
Neil Butterworth
1
Die Idee ist nur "gib mir das große Bild vor den kleinsten Details". Nach Bedarf anpassen.
Ryan Culpepper
2
Die Eagles müssen kurz davor sein, wieder zusammenzukommen, weil ich Neils Kommentar zustimme. Ich bin mit PASCAL aufgewachsen und habe "die kleinen Dinge an die erste Stelle gesetzt", weil die PASCAL-Compiler alle Dinge definieren mussten, bevor sie referenziert wurden, und FORWARD-Erklärungen im Allgemeinen verpönt waren.
John R. Strohm
@Neil - Ich versuche, den Wert des Ratschlags zu beurteilen .. unabhängig von der Quelle. @ John - und der Tipp ist das Gegenteil von Vorwärtsdeklarationen. Sie stellen den Anrufer an die erste Stelle. Die Angerufenen werden direkt unter den Anrufern deklariert.
Gishu
@ryanc - Der Auftakt zu diesem Absatz betont, dass "eng verwandte / zusammenhängende" Konzepte vertikal nahe beieinander liegen sollten [Verhindert das Scrollen, wenn Sie versuchen, etwas herauszufinden]. Die aufgerufenen Funktionen sind in der Reihenfolge der Anrufe unter dem Anrufer angeordnet. Siehe hinzugefügtes Code-Snippet
Gishu

Antworten:

2

Ich mag hier auf die Nerven gehen, aber ich frage mich, ob das von Ihnen verwendete Werkzeug einen Einfluss darauf hat. Ich beziehe mich auf die Entscheidung zwischen Texteditor und IDE, die Entwickler treffen müssen.

In einer IDE haben Sie viel mehr Funktionen zum Anzeigen von Quelldateien. In der Regel können Sie eine Liste der Methoden alphabetisch nach Sichtbarkeit sortieren oder sogar den Typ in einer Seitenleiste zurückgeben. Sie können auch zu einer Methode springen, wenn Sie eine Verwendung dafür haben. Sie können auch Aufrufbäume für Methoden und Drilldowns generieren. In der Regel verfügen Sie auch über einen leistungsstarken Befehl find, der reguläre Ausdrücke unterstützt. In dieser Situation spielt die Reihenfolge der von Ihnen erstellten Methoden keine Rolle, da Sie andere Ansichten als den verfügbaren Quellcode haben.

In einem Texteditor verfügen Sie normalerweise nicht über diese Funktionen. Die nächstgelegene Funktion ist wahrscheinlich ein starkes Suchen / Ersetzen. Hier sollten Sie der Struktur Ihrer Datei mehr Aufmerksamkeit schenken, da die Navigation möglicherweise schwieriger ist. Sie möchten den Zeitaufwand für das Scrollen in der Datei minimieren, um das Gesuchte zu finden, und eine konsistente und logische Reihenfolge der Methoden kann hilfreich sein.

Thomas Owens
quelle
+1 für die IDE;
Je
1

Der Punkt ist, dass angerufene Dinge weniger interessant sind als angerufene Dinge. Je mehr eine Methode andere Methoden aufruft, desto wahrscheinlicher ist es, dass diese Methode Teil der externen API des Objekts ist (im Gegensatz zu einem Implementierungsdetail). Das bedeutet, dass die externe API der Klasse - öffentliche Methoden, wenn Ihre Sprache dieses Konzept unterstützt - natürlich ganz oben in der Datei stehen möchte, um das Auffinden dieser Methoden zu erleichtern. Umgekehrt "wollen" Hilfsfunktionen und dergleichen am Ende der Datei stehen.

(Ich erkläre das Konzept und bewerte seine Wirksamkeit nicht.)

Frank Shearar
quelle
Ja, aber das würde bedeuten, dass alle öffentlichen Funktionen als eine Gruppe an den Anfang der Datei verschoben werden sollten. Normale Annäherung. Der vorgeschlagene Ansatz ist anders (oder zumindest wie ich ihn gelesen habe). Siehe Update in Frage
Gishu
Ja, Ihre öffentlichen Funktionen sollten nach oben schweben. Natürlich haben einige Sprachen überhaupt keine Sichtbarkeitsmodifikatoren ...
Frank Shearar
1

Wenn Sie mit längerem Zeitraum mehr als ein paar Tage meinen? Dann Nein.
Vor ein paar Jahren fing ich an, dies mit einem neuen Code zu tun, und machte mich langsam wahnsinnig, bis ich aufhörte.

Meine persönliche Präferenz für das Auslegen von Klassen ist

class MyClass
{
    // static fields
    // fields
    // constructors
    // properties
    // methods
} 

Aber das ist nicht religiös, Eigenschaften und Methoden können miteinander vermischt werden. Sichtbarkeit kommt nicht ins Spiel (ich gruppiere nicht nach öffentlich / geschützt / privat)

Wir haben einen Mann hier im Büro, der eine strenge Struktur für alles in einer Klassendatei beibehält, wobei alles in Hauptgruppen und Untergruppen zusammengefasst ist, die alle gut in Regionen verschachtelt sind. . . Ich muss zugeben, dass ich denke, dass Regionen das Werk Satans sind, sie treiben mich um die verdammte Wendung.

Jedes Mal, wenn ich eine seiner Klassen eröffne, sterbe ich innerlich ein wenig :(

Binärer Sorgen
quelle
Ich befürworte keine großen Klassen mit Regionen, die hinzugefügt werden, um den Geruch zu maskieren. Nicht versuchen, religiös zu werden, sondern ein einheitliches Layout innerhalb eines Projekts zu haben, beschleunigt die Dinge - zu wissen, wo man suchen muss. Gruppieren Sie die Sichtbarkeit als zusätzlichen Vorteil der Nähe der öffentlichen API, damit Sie Ihren spezifischen Einstiegspunkt finden und von dort aus einen Drilldown durchführen können ...
Gishu
Und Konstrukteure? Die gehen unter "Methoden"?
Cody Gray
@Cody Gray: Entschuldigung, vergaß ctors!
Binary Worrier
@Gishu: Ich finde, dass moderne Visualisierungs- und Navigationswerkzeuge die Notwendigkeit strenger Dateilayouts beseitigt haben. Ist es wichtig, wo eine Methode implementiert ist, wenn ich mit der rechten Maustaste auf die Verwendung und "Gehe zur Definition" klicken kann?
Binary Worrier