Existe-t-il un nombre optimal de lignes de code par fonction? [fermé]

18

Les fonctions ne sont pas seulement utilisées pour minimiser la duplication de code - elles sont également utilisées pour diviser une fonction longue en plus petites pour augmenter la lisibilité, ainsi que pour rendre le code auto-commenté. Pourtant, ce gain n'est pas directement inversement proportionnel au nombre de LOC par fonction ou méthode; sinon, nous aurions des tonnes de fonctions, qui ne contiennent qu'une ou deux lignes de code.

Cela m'amène à me demander: existe-t-il un nombre optimal de LOC par fonction? Si c'est le cas, qu'est-ce que c'est et est-ce qu'il s'écarte entre les langues?

gablin
la source
6
Voir Code Complete Vol 2 de Mitch McConnell Chapter 7 Section 4 pour un bon moment.
Peter Turner
2
@Peter - Je pense que tu veux dire "Steve McConnell"
JohnFx
Ouais, drôle j'écrirais ça en regardant le livre ... Was Mitch McConnell Pres. Le chef de cabinet de Bush?
Peter Turner
3
Le nombre varie presque certainement selon la langue: je serais surpris de voir une clause Prolog à 6 lignes, tout en étant parfaitement OK avec une méthode Delphi à 20 lignes. Ma réponse ci-dessous est pour Smalltalk, qui utilise l'environnement pour encourager les méthodes courtes.
Frank Shearar
1
@Peter Turner: Hm ... S1 à S15 et I1 à I11. On dirait qu'il confond les variables temporaires avec les registres. ^^
gablin

Réponses:

33

Au lieu du nombre de lignes, le critère que j'utiliserais est que chaque fonction ne fasse qu'une seule chose et le fait bien.

grokus
la source
Oui, si nous avons une unité de travail, je ne veux pas avoir à me déplacer entre 50 fonctions pour avoir une idée de ce qui se passe. Si vous répartissez vos fonctions de manière appropriée en utilisant cette métrique, elles devraient presque naturellement être de taille raisonnable.
ChaosPandion
2
@ChaosPandion: mais votre unité d'oeuvre peut être probablement exprimée comme une séquence d'étapes plus élémentaires. Si vous passez en revue la fonction, vous passerez en revue la séquence des étapes, pas le code de chaque étape.
Wizard79
2
@Lorenzo - Si tel est le cas, chaque étape devient l'unité de travail. La fonction parent devient un aperçu de haut niveau des unités de travail.
ChaosPandion
1
Oui, c'est vraiment vrai. Hm, permettez-moi de reformuler la question: Y a
gablin
@gablin, difficile à dire et aussi les LOC dépendent de la langue, mais si vous adhérez à ce principe, vous vous retrouvez généralement dans une fourchette raisonnable, disons 1 ~ 50.
grokus
21

Une ancienne règle empirique est qu'une fonction doit être entièrement visible à l'écran, sans avoir besoin de faire défiler.

L'idée de base est que, si vous ne pouvez pas regarder la fonction entière à la fois, la fonction est trop complexe et vous devez la diviser en morceaux plus basiques.

Bien que cette règle soit très pratique et utile, la règle formelle est que vous ne devez conserver qu'une seule étape logique dans une fonction. Une fonction ne fait qu'un travail élémentaire, si vous pouvez diviser le travail en plusieurs morceaux élémentaires, la fonction doit être divisée.

Wizard79
la source
21
Cette mesure devient progressivement plus inutile à mesure que la taille / résolution moyenne du moniteur augmente.
Adam Lear
2
Notre prof de programmation vient de dire cet exemple l'autre soir :)
cdnicoll
2
@Anna: eh bien, mon moniteur est en haute résolution mais aussi le nombre de barres d'outils / palettes / panneau a augmenté. Et puis, maintenant je peux utiliser une police de pas de 14 pt! :)
Wizard79
4
La taille 24 x 80 d'un terminal n'a pas tendance à changer.
alternative
1
un non-sens, le point de la règle est "pouvez-vous tout voir sans faire défiler". Avec un grand moniteur, vous pouvez avoir plus dans votre fonction sans violer cette règle, cela ne signifie pas que les grands moniteurs ne sont autorisés qu'à afficher les petites fonctions (bien qu'avec toutes les barres d'outils et les fenêtres de propriétés de votre IDE, cela reste probablement vrai: - ))
gbjbaanb
15

Il n'y en a pas.

Les écrans deviennent plus grands, les tailles de police plus petites. Les règles de base ne fonctionnent pas si bien lorsque les gens ont des pouces de tailles différentes.

Soyez concis. Si votre fonction fait plusieurs choses, c'est probablement une bonne idée de la diviser en plus petites.

Josh K
la source
Le moins que vous puissiez faire est de me dire pourquoi vous pensez que ma réponse n'est pas utile.
Josh K
7
Je pense que quelqu'un a été offensé par votre utilisation de la balise h1 .
ChaosPandion
@Chaos: C'est la réponse essentielle.
Josh K
6
J'étais peut-être un peu trop subtil, mais mon intention était de laisser entendre qu'il n'y avait aucune raison valable de voter contre votre réponse. Celui qui a fait l'acte avait une raison personnelle aléatoire de le faire. Ils peuvent simplement penser que Josh est un nom horrible.
ChaosPandion
6

Smalltalk a une façon légèrement inhabituelle de réduire la taille des méthodes. Lorsque vous écrivez du code, vous l'écrivez dans un widget appelé navigateur. Un navigateur a deux parties principales, divisées horizontalement. Votre code va dans la moitié inférieure.

Par défaut, un navigateur n'est pas très gros. Vous pouvez insérer 5 ou 6 lignes avant de devoir commencer le défilement. Le défilement, bien sûr, est légèrement irritant.

Ainsi, dans Smalltalk, l'environnement "vous encourage" à écrire des méthodes courtes, d'au plus environ 6 lignes de longueur. (C'est généralement beaucoup; Smalltalk est un langage assez laconique.)

Frank Shearar
la source
2

Le nombre idéal de lignes de code dans une méthode est variable. Fondamentalement, vous voulez seulement écrire juste assez de code pour faire ce qui doit être fait dans le contexte de la définition de la fonction. Je pense à cela comme une sorte de principe de responsabilité unique , appliqué uniquement à une méthode plutôt qu'à une classe.

Lorsqu'une méthode a beaucoup de logique et un certain nombre d'étapes à effectuer, il est logique de diviser la méthode en plusieurs étapes distinctes. Chacune de ces étapes serait extraite dans de nouvelles méthodes selon les besoins.

"Sinon, nous aurions des tonnes de fonctions, qui ne contiennent qu'une ou deux lignes de code."

Moins chaque méthode est efficace, plus elle est facile à définir et plus simple à comprendre et à gérer. Il n'y a rien de mal à avoir des centaines de méthodes si vous en avez besoin. En outre, conformément au SRP que j'ai mentionné plus tôt, il devient plus facile d'extraire de nouvelles classes lorsque les méthodes ont été divisées en morceaux plus petits et plus faciles à gérer.

S.Robins
la source
1

La réponse est bien sûr 42 .

Important à noter: aucune fonction ne peut jamais violer le SRP , ou vous devez faire face à l' inquisition spanisch .

Quelques conseils pour réduire le nombre de lignes:

  • Y a-t-il des commentaires marquant des sections individuelles? Ces sections devraient être des fonctions.
  • Existe-t-il des chaînes if-else ou des instructions switch en dehors d'une usine / constructeur? Votre conception peut nécessiter de meilleurs modèles de conception pour vous aider à partager les responsabilités.
  • Vos fonctions sont-elles faciles à tester? Rendez vos fonctions faciles à tester, elles s'effondreront.
  • Est-ce complexe et tout simplement pas de terre en sigth (1000 monstres en ligne)? Faites de la refactorisation de ferraille - c'est de la refactorisation et ne l'enregistrez pas dans l'espoir de vous renseigner sur les responsabilités des codes.
Johannes
la source
1
Nᴏʙᴏᴅʏ attend l'espagnol ... ah bougre, je suis un peu en retard ici.
leftaroundabout
0

Voici quelques indices:

  • Si vous avez du mal à écrire le commentaire expliquant le but et l'utilisation de la fonction, c'est trop long.

  • Si vous êtes tenté d'écrire un commentaire expliquant l'activité d'une section de code dans la fonction, alors la fonction est trop longue.

  • Si vous collez du code d'une autre fonction, elles sont toutes les deux trop longues (extrayez ce code en tant que fonction distincte).

  • Si vous avez besoin d'une convention de codage pour séparer les membres de données de classe des variables locales, la fonction est trop longue et la classe a trop de membres.

  • Si vous devez prendre des notes pendant la lecture d'une fonction, c'est trop long.

Avoir des «tonnes» de fonctions, chacune d'une ou deux lignes seulement, n'est pas nécessairement une mauvaise chose. J'ai trouvé que ces petites fonctions étaient réutilisées beaucoup plus que ce à quoi je m'attendais initialement.

Kevin Cline
la source