Vale la pena estrarre metodi privati per il codice che viene chiamato solo una volta in una classe, o lasciando il codice nel metodo genitore (forse) con un commento che dice che cosa fa?Dovresti rifattorizzare il codice in metodi privati se non vengono chiamati più di una volta?
risposta
Vale sempre la pena estrarre metodi se chiarisce l'intento del codice.
Ciò è particolarmente vero per i metodi molto lunghi. Sebbene i commenti vadano bene, non vengono delineati (almeno non in modo molto solido) dove il processo spiega e dove inizia quello successivo. A volte le astrazioni comuni diventano solo più ovvie dopo il hai estratto il metodo.
Se si eseguono test unitari automatizzati (non necessariamente TDD), sarà anche molto, molto più facile testare unitamente più blocchi di metodi, anche se potrebbe essere necessario rendere pubblici i propri metodi, a seconda del quadro di test che usi.
Il punto è che non puoi sbagliare con i metodi più piccoli, soprattutto se hanno nomi descrittivi.
Sono molto d'accordo. Ho sempre un refactoring in questo modo e il grado in cui aggiunge la leggibilità al codice è tremendo. L'astrazione è molto utile anche fino al livello di un metodo breve (ad esempio 1 riga). Refactoring in questo modo rende enormemente più facile vedere il flusso del tuo metodo originale e cambiare la progettazione o l'implementazione del metodo principale o di qualsiasi suo componente. – Wedge
Ho pensato a questa risposta. Penso che dovresti cambiare "non puoi sbagliare con i metodi più piccoli, specialmente se hanno nomi descrittivi". a "Puoi sbagliare solo se i metodi NON hanno un nome descrittivo" – mcintyre321
Naturalmente! Più piccoli sono i tuoi metodi, più facile mantenere il tuo software.
Cosa c'è che non va con le 1-liners? Se questo è il livello di incapsulamento di cui hai bisogno, allora è quello. Credere che un metodo a 1 linea non sia "abbastanza carnoso" per essere un "metodo reale" è intellettualmente limitante. Inizia a cercare i metodi a 1 riga che possono essere estratti e che sarebbero utili, probabilmente troverai più di quanto penseresti. – Wedge
Sì, hai assolutamente ragione, non avrei dovuto dire "(Beh, le battute non sarebbero troppo utili ovviamente.)" In un modo così definitivo ... Non so come scriverlo meglio allora l'hai già fatto, quindi credo che rimuoverò quella frase. :-) Grazie! – Arjan
C'è un enorme vantaggio in questo. Si tratta di nascondere le informazioni e chiarire le intenzioni.
In Refactoring to Code hanno chiamato questo metodo di composizione in cui si interrompe un metodo di grandi dimensioni in molti metodi più piccoli. Questo fa due cose.
Prima riduce la quantità di informazioni che è necessario preoccuparsi quando si lavora sul metodo genitore.
In secondo luogo, il nome del metodo deve indicare la sua intenzione che rende il codice più leggibile.
Inoltre, rende molto, molto più semplice, i problemi relativi all'ambito variabile. Scansionare 100 righe di codice per scoprire dove vengono utilizzate le variabili è una perdita di tempo non banale rispetto all'esame di un metodo che è meno di una dozzina di righe. – Wedge
Sì, lo è.
- Come detto sopra: In generale si chiarirà l'intento del codice.
- Anche se viene utilizzato solo una volta ora, sarà più facile riutilizzare il codice in futuro.
Un altro punto: Per semplici metodi di supporto, si potrebbe desiderare di farli statico (in modo tale che essi non dipendono o alterare lo stato del loro esempio), allora si può renderli pubblici per ancora più facile riutilizzo.
Per me dipende dall'ampiezza del codice e dalla relazione con il metodo padre. Se è molto codice (diciamo più di 5-10 righe di codice, o più del 50% della quantità totale di codice nel metodo genitore), lo estraggo in un metodo privato, per la struttura del codice e la leggibilità. Altrimenti lo lascerei nel metodo genitore con un commento descrittivo.
Penso che la manutenibilità e la leggibilità possano essere ridotte se nel codice ci sono troppi metodi molto piccoli. Mi sforzo per un buon equilibrio. Ma ogni volta che dubito; Lo estro come metodo privato.
Solo una stima stupida, ma direi che la maggior parte dei metodi privati viene chiamata solo in un paio di posti nella classe media. Tuttavia, come accennato in precedenza, rende il codice molto più leggibile e più facile da testare/mantenere se si rompono tutte le funzionalità in blocchi logici.Il refactoring è una buona abitudine
Si dovrebbe refactoring privato in base al design della tua API & metodi/proprietà che si desidera esporre quando si utilizza altrove. Non dovresti considerare il suo utilizzo per decidere se renderlo privato o pubblico.
- 1. UITextViewDelegate metodi non vengono chiamati (UITextView all'interno di UITableViewCell)
- 2. I metodi WebView non vengono chiamati in Android
- 3. SKProductsRichiedi i metodi dei delegati non vengono mai chiamati
- 4. AngularJS: i metodi personalizzati $ resource non vengono chiamati
- 5. Perché non dovresti usare metodi statici per tutti i metodi privati?
- 6. metodi delegato UISplitViewController non chiamati
- 7. Come determinare quali metodi vengono chiamati in un metodo?
- 8. UIModalPresentationCurrentContext - Metodi di rotazione non chiamati
- 9. Metodi pubblici e privilegiati in javascript: perché vengono chiamati così?
- 10. Quali metodi Android vengono chiamati quando la batteria muore?
- 11. Gli script non vengono chiamati
- 12. base.Method() con più livelli di ereditarietà che non vengono chiamati?
- 13. I percorsi di backbone non vengono chiamati
- 14. Metodi di RecyclerView Adapter non chiamati
- 15. Garantire metodi non deriso non sono chiamati in Mockito
- 16. JVM e metodi privati
- 17. I delegati di Starscream non vengono chiamati
- 18. Metodi privati su metodi pubblici
- 19. metodi privati in Ruby
- 20. La sottoclasse UITableViewController implementa il protocollo UIDataSourceModelAssociation ma i suoi metodi non vengono mai chiamati
- 21. Metodi privati in una classe Mootools
- 22. Come affermare che determinati metodi vengono chiamati con il framework minitest di Ruby?
- 23. Metodi di estensione di Java 8 - perché non vengono chiamati mixin o tratti?
- 24. Come faccio a trovare i metodi che vengono chiamati da un metodo di classe C# - NON in fase di esecuzione
- 25. Pipeline scrapy spider_opened e spider_closed non vengono chiamati
- 26. onSaveInstanceState() e onRestoreInstanceState (stato Parcelable) non vengono chiamati?
- 27. Perché dovresti controllare se Assegnato (auto) nei metodi oggetto?
- 28. F # Metodi statici privati
- 29. Protezione ingresso di metodi privati / protetti?
- 30. Android BLE onCharacteristicRead e onCharacteristicChanged non vengono mai chiamati
In qualche ideale astratto non ci sarebbero commenti. O quello, o il tuo * commento * sarebbe il codice ala Programmazione letteraria di Knuth. –