La spaziatura è effettivamente equivalente al lungo odore del codice metodo?

3

C'è un odore di codice comune che coinvolge lunghi metodi con la risposta più comune, poiché i metodi dovrebbero essere veramente piccoli, a meno di 50 righe per parola (o 20). Capisco perché questo è perché migliora la leggibilità, riduce il codice ripetuto, ecc. Tuttavia, mi chiedevo se questo è a livello di istruzione o a livello di linea di file.

Ad esempio, diciamo che avevo un metodo che veniva chiamato e che aveva molti parametri passati (ignora l'odore LPL per questo esempio), troppo da estendersi per tutta la larghezza di una dimensione di finestra di modifica comune in un IDE.

method(A, B, C, D, ...);

EDIT Immagina i parametri contrassegnati come variabili digitate, le ellissi indicano ulteriori parametri.

Tuttavia, qualcuno potrebbe scrivere la chiamata al metodo in questo modo

method(
A,
B,
C,
...);

Ora questo si estende su più righe, ma secondo la mia opinione personale, è molto più facile leggere lo scorrimento verso il basso piuttosto che attraverso. Le azioni sul mouse sono anche diverse poiché lo scorrimento da un lato all'altro spesso richiede una selezione del mouse della barra di scorrimento (da sinistra a destra) (sono consapevole che un pulsante potrebbe essere programmato per fare questo e alcuni mouse hanno un joystick integrato, ma non è comune negli affari).

Trovo che questo sia rilevante per le query SQL. Ad esempio

SELECT 
 A.A
,A.B
,B.C
,B.D
FROM 
table A
LEFT JOIN
table B
ON
A.E = B.E
AND 
A.F = B.F
WHERE 
A.A IS NOT NULL
AND 
B.C > 50

Ora in questo scenario, quando sto testando, è molto facile commentare le clausole o cambiare gli operatori logici commentandoli invece di eseguire le eliminazioni se era tutto su una riga e dovevano ridigitare.

Credo che mi stavo chiedendo quale sia l'odore del metodo a lunga fila e se le sue lunghe righe in termini di molte affermazioni o lunghe linee in termini di righe per file?

    
posta Jake 22.03.2018 - 17:19
fonte

2 risposte

8

Is using spacing effectively equivalent to the long method code smell?

No.

Non lasciare mai che le preoccupazioni del numero di riga eliminino gli spazi bianchi. Se non altro, questo dimostra che il conteggio delle righe non è una metrica di buona qualità.

I metodi e le funzioni dovrebbero essere brevi. Molto corto. Se riesci a scomporli in qualcosa di più piccolo, vale la pena prendere in considerazione l'idea di farlo.

Ma il conteggio delle linee è davvero sciocco. Soprattutto nelle lingue che ignorano gli spazi bianchi. Posso definire un intero programma in una riga. Questo non lo rende buono.

Ora personalmente trovo questo esempio molto leggibile:

method(A, B, C, D);

Non trovo questo molto leggibile:

public String method(final String Alessandro , final String Bartholomew, final String Cleveland, final String Dashiell) { return ""; }

Anche se hanno lo stesso numero di parametri, questo è terribile. Vale la pena aggiungere spazi bianchi per renderlo leggibile.

public String method(
        final String Alessandro, 
        final String Bartholomew, 
        final String Cleveland, 
        final String Dashiell
) {
    return "";
}

Non abbreviare mai un nome a causa di considerazioni su larghezza o lunghezza. Usa il nome migliore che puoi e trova un modo migliore per disporre il tuo codice.

Tuttavia, trovo

method(
A,
B,
C,
...);

essere inutilmente sprecati di spazio Per lo meno usa qualche indentazione.

method(
    A,
    B,
    C
);

Con nomi così brevi e nessun altro ornamento questo sembra ancora sciocco. Ma almeno enfatizza la struttura. Se avessi una buona ragione per farlo non ti negherei lo spazio bianco, ma è fastidioso se non riesco a vedere il motivo.

SELECT 
 A.A
,A.B
,B.C
,B.D
FROM 
table A
LEFT JOIN
table B
ON
A.E = B.E
AND 
A.F = B.F
WHERE 
A.A IS NOT NULL
AND 
B.C > 50

Questo è semplicemente difficile da guardare. Tutto quello che hai fatto è consentire il tuo schema di commento. Questo non lo fa leggere molto meglio di

SELECT A.A, A.B, B.C, B.D FROM table A LEFT JOIN table B ON A.E = B.E AND A.F = B.F WHERE A.A IS NOT NULL AND B.C > 50

Hai ancora la flessibilità per altre considerazioni. Puoi aggiungere una separazione visiva tra parole chiave e parametri

SELECT 
     A.A
    ,A.B
    ,B.C
    ,B.D

FROM 
    table A

LEFT JOIN 
    table B

ON 
    A.E = B.E

AND 
    A.F = B.F

WHERE 
    A.A IS NOT NULL

AND 
    B.C > 50

Puoi enfatizzare la relazione tra le parole chiave

SELECT 
,A.A 
,A.B 
,B.C 
,B.D

    FROM 
    table A

    LEFT JOIN 
    table B 

        ON 
        A.E = B.E

        AND 
        A.F = B.F

    WHERE 
    A.A IS NOT NULL

        AND 
        B.C > 50

E potrebbe valere la pena ricordare che i commenti non devono occupare un'intera riga:

SELECT A.A, /*A.B,*/ B.C, B.D
    FROM table A
    LEFT JOIN table B 
        ON A.E = B.E
        AND A.F = B.F
    WHERE A.A IS NOT NULL
        AND B.C > 50

Lo spazio bianco è potente. Ha un grave impatto sulla leggibilità. Usalo con saggezza.

Il conteggio delle linee è la peggiore lezione da imparare dall'imparare che le funzioni dovrebbero essere brevi. Non dovrebbero essere brevi perché hai schiacciato tutti gli spazi bianchi e nomi descrittivi. Dovrebbero essere brevi perché hai dato a tutto ciò che ha una piccola funzione in cui vivere.

    
risposta data 22.03.2018 - 18:34
fonte
5

Il tuo esempio SQL è terribile. Rompe le cose in singole linee inutilmente, danneggiando la leggibilità senza fornire un vantaggio significativo.

Una soluzione migliore consiste nell'interrompere la linea sulle principali parole chiave e fornire indentazioni sensate, come questa:

SELECT A.A, A.B, B.C, B.D
  FROM table A
  LEFT JOIN table B 
    ON A.E = B.E
    AND A.F = B.F
  WHERE A.A IS NOT NULL
    AND B.C > 50

Che non danneggia affatto la tua capacità di commentare e testare.

Esistono modi migliori per rendere più leggibili le chiamate di metodo lunghe. Ad esempio:

var a = [long expression];
var b = [another long expression];
var c = ...

method(a, b, c, d, ...);
    
risposta data 22.03.2018 - 18:31
fonte

Leggi altre domande sui tag