Formatage du code: disposer des fonctions basées sur la hiérarchie des appels dans un fichier de classe?

10

Une suggestion du "code propre" de Bob Martin m'a fait me gratter la tête. "Si une fois une fonction en appelle une autre, elles devraient être verticalement proches et l'appelant devrait être au-dessus de l'appelé"

Jusqu'à présent, j'ai été plus ou moins fidèle aux directives .Net, qui regroupent les membres de la classe par type (propriétés, ctors, fonctions) et visibilité (public / prot. / Private). L'astuce semble être un problème au début .. mais cela "pourrait bien fonctionner". Personnellement, j'ai rencontré des cas où j'ai aimé cette mise en page - plus facile à explorer lorsque vous êtes dans la bonne chaîne d'appels.

L'idée derrière l'astuce semble bonne, mais d'autres scénarios comme «laissez-moi regarder l'interface publique de cette classe» pourraient empirer. Peut-être que l'oncle Bob mise sur les petites classes et le support IDE pour les types de visualisation ...

Quelqu'un a-t-il essayé cela pendant une longue période?

Mise à jour: il semble qu'un extrait de code soit en règle

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
la source
2
Le terrible "oncle Bob" n'est pas exactement le crayon le plus tranchant de la boîte.
Neil Butterworth
1
L'idée est simplement de "me donner une vue d'ensemble avant les détails les plus infimes". Adaptez au besoin.
Ryan Culpepper
2
Les Eagles doivent se rapprocher de nouveau, car je suis d'accord avec le commentaire de Neil. J'ai grandi avec PASCAL et "j'ai mis les petites choses en premier" parce que les compilateurs PASCAL exigeaient tous que les choses soient définies avant qu'elles soient référencées, et les déclarations FORWARD étaient généralement mal vues.
John R. Strohm
@Neil - J'essaie de juger du mérite des conseils .. quelle que soit la source. @ John - et le pourboire est l'opposé des déclarations avancées .. vous placez l'appelant en premier .. les appelés sont déclarés juste en dessous des appelants.
Gishu
@ryanc - le prélude à ce paragraphe souligne que les concepts "étroitement liés / cohésifs" doivent être rapprochés verticalement [Empêche le défilement lorsque vous essayez de comprendre quelque chose]. Les fonctions appelées sont présentées sous l'appelant dans l'ordre des appels. Voir l'extrait de code ajouté
Gishu

Réponses:

2

Je vais peut-être sortir sur une branche ici, mais je me demande si l'outil que vous utilisez a un impact là-dessus. Je fais référence à l'éditeur de texte par rapport à la décision IDE que les développeurs doivent prendre.

Dans un IDE, vous avez beaucoup plus de fonctionnalités pour afficher les fichiers source. En règle générale, vous pouvez obtenir une liste des méthodes triées par ordre alphabétique, par visibilité, ou même renvoyer le type dans une barre latérale. Vous pouvez également passer à une méthode si vous en avez l'usage. Vous pouvez également générer des arborescences d'appels pour les méthodes et effectuer un zoom avant. Vous disposez également généralement d'une puissante commande find qui peut prendre en charge les expressions régulières. Dans cette situation, l'ordre des méthodes que vous créez n'a pas vraiment d'importance car vous avez des vues autres que le code source disponible.

Dans un éditeur de texte, vous n'avez généralement pas ces fonctionnalités - le plus proche que vous aurez est probablement une recherche / remplacement fort. Ici, vous allez vouloir prêter plus d'attention à la structure de votre fichier car il pourrait être plus difficile de naviguer. Vous voulez minimiser le temps passé à faire défiler le fichier pour trouver ce que vous recherchez, et un ordre cohérent et logique de méthodes peut vous aider.

Thomas Owens
la source
+1 pour l'IDE; meilleur est l'IDE, moins on doit s'inquiéter de telles choses
user281377
1

Le fait est que les choses appelées sont moins intéressantes que les choses appelées. Plus une méthode appelle d'autres méthodes, plus il est probable que cette méthode fasse partie de l'API externe de l'objet (par opposition à être un détail d'implémentation). Cela signifie que l'API externe de la classe - les méthodes publiques, si votre langue prend en charge ce concept - "voudra" naturellement être en haut du fichier, ce qui facilitera la recherche de ces méthodes. Inversement, les fonctions d'assistance et autres "voudront" être au bas du fichier.

(J'explique le concept, pas pour évaluer son efficacité.)

Frank Shearar
la source
Oui, mais cela impliquerait que toutes les fonctions publiques devraient flotter en haut du fichier comme un seul groupe. Approche conventionnelle. L'approche proposée est différente (ou du moins comment je la lis) .. voir la mise à jour en question
Gishu
Oui en effet, vos fonctions publiques devraient flotter vers le haut. Bien sûr, certaines langues n'ont pas du tout de modificateurs de visibilité ...
Frank Shearar
1

Si par période prolongée, vous entendez plus de quelques jours? Puis non.
Il y a quelques années, j'ai commencé à faire ça sur un nouveau code, et je me suis lentement rendu fou, jusqu'à ce que je m'arrête.

Ma préférence personnelle pour l'organisation des cours est

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

Mais ce n'est pas religieux, les propriétés et les méthodes peuvent se mélanger. La visibilité n'entre pas en jeu (je ne regroupe pas par public / protégé / privé)

Nous avons un gars ici au bureau qui maintient une structure stricte sur tout dans un fichier de classe, tout étant regroupé en groupes principaux et sous-groupes, tous joliment imbriqués dans des régions. . . Je dois admettre que je pense que les régions sont l'œuvre de Satan, elles me poussent à contourner le virage.

Chaque fois que j'ouvre une de ses classes, je meurs un peu à l'intérieur :(

Binaire Worrier
la source
Je ne préconise pas de grandes classes avec des régions ajoutées pour masquer l'odeur. Ne pas essayer de devenir religieux .. mais avoir une mise en page cohérente dans un projet accélère les choses - savoir où chercher. Regrouper la visibilité bu comme l'avantage supplémentaire de rapprocher l'API publique afin que vous puissiez trouver votre point d'entrée spécifique et explorer à partir de là ...
Gishu
Et les constructeurs? Celles-ci vont sous "méthodes"?
Cody Gray
@Cody Gray: Excuses, ctors oubliés!
Binary Worrier
@ Gishu: Je trouve que les outils de visualisation et de navigation modernes ont supprimé le besoin de dispositions de fichiers strictes. Est-il important de savoir où une méthode est implémentée lorsque je peux cliquer avec le bouton droit sur l'utilisation et "Aller à la définition"?
Binary Worrier