Ho un disaccordo filosofico con uno dei miei colleghi di lavoro, e sto cercando di tornare alle origini qui. Qual è lo scopo di un metodo?
In questa domanda, considera questo esempio. Sono stato criticato per aver scritto i seguenti due metodi. Mi piacerebbe dare l'avvertenza che questo è un esempio di bambino bollito, che c'erano altri punti nel mio codice che erano più complicati ma simili.
L'esempio del bambino
class UI:
def __init___(self):
self.thingsCheckBox = # checkbox widget
self.moreThingsCheckBox = # checkbox widget
def wantShowThings(self):
return self.thingsCheckBox.checkState()
def wantShowMoreThings(self):
return self.moreThingsCheckBox.checkState()
Quindi, il mio collega di lavoro mi ha chiesto di scrivere questi due metodi. Alla fine, sono stato costretto a rimuovere questi due metodi (dato che non hanno superato la revisione del codice). E questo alla fine significava ...
La mia versione
if ui.wantShowThings():
# do stuff...
if ui.wantShowMoreThings():
# do more stuff...
La sua versione (che alla fine ha vinto)
if ui.thingsCheckBox.checkState():
# ...
if ui.moreThingsCheckBox.checkState():
# ...
Qual è lo scopo di scrivere quei metodi?
- riutilizzo: penso che siamo tutti d'accordo sulla riusabilità. Se un bit di codice viene copiato e incollato più volte, dovrebbe essere inserito in una funzione o in un metodo in modo tale che se il codice cambia, è sufficiente modificarlo in un unico punto. Il mio collaboratore sostiene che la riusabilità è la ragione per cui solo scrivere qualcosa in una funzione. Il mio collega ha detto che se una funzione non viene chiamata più di una volta, dovrei "allineare" la logica (scriverla nel posto in cui è utilizzata) e scrivere un commento. I metodi "corti" sono "inutili" e servono ad aumentare il "codice spaghetti". "Smettila di farmi sobbalzare per capire la logica".
Credo che le funzioni di scrittura abbiano altri scopi:
-
incapsulamento: nascondi l'implementazione della tua classe. Questo porta il tuo pensiero ad un livello più alto e astrae le parti concrete del tuo codice. Nel mio esempio precedente, non importa con wantShowThings () indipendentemente dal fatto che l'implementazione sottostante sia una checkbox, un radio button o anche una chiamata al server. Stiamo pensando in modo più astratto di una casella di controllo. Stiamo pensando "se vogliamo mostrare le cose".
-
documentazione: penso che il codice stesso possa servire da documentazione. So che ci sono persone piuttosto radicali che pensano che i commenti siano completamente inutili. Anche se non sono così estremo, sono solidale con la filosofia. Perché scrivere un commento quando puoi refactoring in un metodo con un nome significativo? Nel mio esempio, non ho bisogno di un commento
# This returns true if we want to show things
, è nel nome del metodo.
Credo di avere una moltitudine di letteratura che supporta il mio pensiero. "Clean Code", CodingHorror. Ho frequentato un corso con David Cheriton di Stanford, che sicuramente è stato dalla mia parte.