Le contexte
Dans Clean Code , page 35, il est écrit
Cela implique que les blocs contenus dans les instructions if, les autres déclarations, les instructions while, etc., doivent comporter une ligne. Probablement cette ligne devrait être un appel de fonction. Non seulement cela garde la fonction englobante réduite, mais cela ajoute également une valeur documentaire car la fonction appelée dans le bloc peut avoir un nom joliment descriptif.
Je suis tout à fait d’accord, cela a beaucoup de sens.
Plus tard, à la page 40, il est dit à propos des arguments de la fonction
Le nombre idéal d'arguments pour une fonction est zéro (niladique). Vient ensuite l'un (monadique), suivi de près par deux (dyadique). Trois arguments (triadiques) doivent être évités autant que possible. Plus de trois (polyadiques) nécessitent une justification très spéciale - et ne devraient donc pas être utilisés de toute façon. Les arguments sont difficiles. Ils prennent beaucoup de pouvoir conceptuel.
Je suis tout à fait d’accord, cela a beaucoup de sens.
Problème
Cependant, assez souvent, je crée une liste à partir d'une autre liste et je vais devoir vivre avec l'un des deux maux.
Soit j'utilise deux lignes dans le bloc , une pour créer la chose, une pour l'ajouter au résultat:
public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
List<Flurp> flurps = new List<Flurp>();
foreach (BadaBoom badaBoom in badaBooms)
{
Flurp flurp = CreateFlurp(badaBoom);
flurps.Add(flurp);
}
return flurps;
}
Ou j'ajoute un argument à la fonction pour la liste où la chose sera ajoutée, ce qui la rend "pire d'un argument".
public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
List<Flurp> flurps = new List<Flurp>();
foreach (BadaBoom badaBoom in badaBooms)
{
CreateFlurpInList(badaBoom, flurps);
}
return flurps;
}
Question
Y a-t-il des (dés) avantages que je ne vois pas qui en rendent un préférable en général? Ou existe-t-il de tels avantages dans certaines situations? dans ce cas, que dois-je rechercher pour prendre une décision?
f(g(x))
est contre votre guide de style, eh bien, je ne peux pas réparer votre guide de style. Je veux dire, vous ne vous divisez pas non plus sqrt(x*x + y*y)
en quatre lignes, n'est-ce pas ? Et cela fait trois (!) Sous-expressions imbriquées sur deux (!) Niveaux de nidification intérieurs (halètement!). Votre objectif doit être la lisibilité , pas les déclarations d'opérateur unique. Si vous voulez le plus tard, eh bien, j'ai le langage parfait pour vous: Assembler.
mov
instructions x86 et une seule jmp toStart
à la fin. Quelqu'un a en fait créé un compilateur qui fait exactement cela: D
rlwimi
instruction sur le PPC. (C’est l’acronyme de Rotate Left Word Immediate Mask Insert). Cette commande ne prenait pas moins de cinq opérandes (deux registres et trois valeurs immédiates) et elle effectuait les opérations suivantes: Le contenu du registre était pivoté par un décalage immédiat, un masque créé avec une seule séquence de 1 bits contrôlée par les deux autres opérandes immédiats, et les bits correspondant à 1 bit dans ce masque de l'autre opérande de registre ont été remplacés par les bits correspondants du registre pivoté. Instruction très cool :-)
flurps.Add(CreateFlurp(badaBoom));
?