Che cos'è un argomento di output, come indicato nel Codice pulito di Martin?

14

A pagina 45 del Codice pulito di Robert C. Martin: Un manuale di abilità software agile, Martin scrive che gli argomenti di output dovrebbero essere evitati. Ho difficoltà a capire il significato di "argomento di output" e perché dovrebbero essere evitati.

L'esempio di Martin per un argomento di output appendFooter(s); chiama la funzione public void appendFooter(StringBuffer report) . Il suo miglioramento del codice è report.appendFooter();

Forse è dovuto alla mancanza di un contesto di codice, ma non vedo come utilizzare gli argomenti di output sia considerato una codifica scadente. Qualcuno potrebbe spiegare il concetto o dare un ulteriore esempio di codice per capire questo?

La seguente funzione potrebbe anche essere considerata un esempio di codice non pulito dal principio di cui sopra?

int[] numberArray = {3, 5, 7, 1};
sortArray(numberArray);

Se quanto sopra è una violazione del principio di Martin di non usare gli argomenti di output, sarebbe meglio avere un oggetto che ha una matrice come un campo e una funzione che può essere chiamata per ordinare l'array?

ObjectWithArrayField numberArray = new ObjectWithArrayField(3, 5, 7, 1);
numberArray.sort();
    
posta WP0987 16.06.2016 - 22:49
fonte

2 risposte

10

Bob Martin sta semplicemente parlando di leggibilità .

Il problema con l'esempio appendFooter è, se trovi la riga di codice appendFooter(s) da qualche parte in un programma, non è immediatamente ovvio se quella chiamata prende s come un input e lo appende da qualche parte, o se s è appena passato per prendere l'output di quella funzione. Per essere sicuro, è necessario controllare la documentazione della funzione. Una chiamata come report.appendFooter() , tuttavia, evita questo problema: è molto più ovvio ora cosa succede.

Tuttavia, Bob Martin non dice "non usare mai argomenti di output", dice "in generale, dovresti evitarlo, perché ti aiuterà a mantenere il tuo codice un po 'più pulito". Quindi questa non è una regola di culto del carico da braindead che si dovrebbe seguire ciecamente.

I metodi

Sort per matrici e raccolte standard sono leggermente diversi. Avere il metodo sort una funzione membro di ciascun tipo di dati array standard presenta alcuni inconvenienti dal punto di vista del progettista del linguaggio, ad esempio, un metodo come Array.sort consente di mantenerlo nella libreria standard, al di fuori di Java runtime. Ma se dovessi creare un tipo di raccolta individuale che deve essere ordinato a volte, aggiungere sort come funzione membro potrebbe essere davvero un'idea migliore rispetto a metterla in una classe separata.

    
risposta data 16.06.2016 - 23:18
fonte
10

Si tratta di utilizzare un meccanismo imprevisto per restituire un valore dalla funzione, che di solito è il risultato di fare troppo nella funzione o di avere responsabilità disallineate. Il modo migliore per comunicare il risultato di una funzione è di gran lunga il valore di ritorno. Spero che sia evidente. Nei linguaggi orientati agli oggetti, il secondo metodo migliore è quello di mutare l'oggetto.

Tra queste due opzioni, ci sono così tanti modi chiari e chiari per comunicare il risultato di una funzione che se mai ti trovi a voler cambiare gli argomenti come l'unico mezzo, qualcosa è andato storto nella tua architettura. Hai bisogno di riorganizzare le tue responsabilità di classe in modo che quello che fa il muting possegga i dati in primo luogo.

L'unica eccezione è per algoritmi molto generici. Ad esempio, un algoritmo di ordinamento potrebbe essere giustamente separato dai contenitori che ordina, se può essere applicato genericamente a qualsiasi tipo di contenitore utilizzando la sua interfaccia pubblica. Una funzione one-shot appendFooter non ha questa scusa.

    
risposta data 17.06.2016 - 00:11
fonte

Leggi altre domande sui tag