Gli odori di codice e i loro refactoring possono essere molto scoraggianti e intimidatori ai neofiti. Quindi, in questa serie, ho cercato di renderli di facile comprensione, sia per gli sviluppatori di Ruby che per gli antipasti.
Questo articolo finale parla di alcuni odori che dovresti cercare e riassume ciò che questa piccola serie voleva ottenere. Un ultimo soffio, se ti piace ...
L'ultimo articolo di questa serie è qualcosa come un giro bonus. Volevo presentarti alcuni altri odori che possono essere affrontati rapidamente e senza troppi problemi. Uno per la strada, per così dire. Penso che con la conoscenza che hai raccolto dagli articoli precedenti, la maggior parte di loro non avrà nemmeno bisogno di esempi di codice per avvolgere la tua mente.
Quando apri un libro sul refactoring, troverai facilmente più odori di quanti ne abbiamo discusso. Tuttavia, con questi importanti alla cintura, sarai ben preparato a trattare con qualcuno di loro.
I commenti generosamente applicati sono raramente una buona idea, probabilmente mai. Perchè no? Perché potrebbe suggerire che il tuo design non sta parlando da solo. Ciò significa che il tuo codice è probabilmente così complicato da capire che ha bisogno di spiegazioni letterali.
Prima di tutto, chi vuole passare attraverso orde di testo nel tuo codice, o peggio, attraverso un codice che è difficile da capire. Jackpot se entrambi sono un evento comune. Questa è solo una cattiva forma e non molto premurosa per le persone che vengono dopo di te - senza offesa, masochisti, torturando il tuo sé futuro tutto ciò che vuoi.
Vuoi scrivere un codice che è abbastanza espressivo in sé. Crea classi e metodi che parlano da soli. Nello scenario migliore, raccontano una storia che è facile da seguire. Questo è probabilmente uno dei motivi convenzioni sulle configurazioni divenne così influente. Reinventare la ruota è a volte una buona pratica per affinare la tua comprensione ed esplorare un nuovo territorio, ma in ambienti di sviluppo frenetici, i tuoi colleghi sono alla ricerca di chiarezza e navigazione rapida, non solo all'interno dei tuoi file ma anche all'interno della mappa mentale che crei nel tuo codice.
Non voglio addentrarmi in un argomento completamente nuovo, ma la denominazione gioca un ruolo importante in tutto ciò. E i commenti eccessivi all'interno del tuo codice contraddicono leggermente le buone pratiche e le convenzioni di denominazione. Non fraintendetemi, va bene aggiungere commenti: state semplicemente sul sentiero che "illumina" il vostro codice piuttosto che distoglierlo da esso. I commenti non dovrebbero certamente essere istruzioni per un codice intelligente che per lo più puoi decifrare perché volevi esibirti. Se mantieni i tuoi metodi semplici, come dovresti, e dai un nome a tutto ciò, non hai bisogno di scrivere interi romanzi tra il tuo codice.
Stai lontano da ciò che segue:
È anche utile scomporre parti di metodi tramite metodo di estrazione e dare a questa parte di un metodo un nome che ci dice sulla sua responsabilità, piuttosto che avere tutti i dettagli ingombra una comprensione ad alto livello di ciò che sta accadendo nel corpo del metodo.
def create_new_agent ... end ... # crea un nuovo agente visita root_path click_on 'Crea agente' fill_in 'Agent Name', con: 'Jinx' fill_in 'Email', con: '[email protected]' fill_in 'Password', con: 'secretphrase 'click_button' Submit '...
Cosa è più facile da leggere? Un gioco da ragazzi, ovviamente! Utilizza il chilometraggio gratuito ottenuto nominando le cose correttamente tramite i metodi estratti. Rende il tuo codice molto più intelligente e più facile da digerire, oltre ai vantaggi del refactoring in un unico posto, se riutilizzato, ovviamente. Scommetto che questo ti aiuterà a ridurre i tuoi commenti di un importo molto significativo.
Questo è semplice. Non utilizzare callback che non sono correlati alla logica di persistenza! I tuoi oggetti hanno un ciclo di vita di persistenza - creando, salvando e cancellando oggetti, per così dire - e non vuoi "inquinare" quella logica con altri comportamenti come la logica di business delle tue classi.
Mantieni semplice, ricordi? Esempi tipici di cosa evitare di inviare e-mail, elaborare pagamenti e cose. Perché? Perché il debugging e il refactoring del codice dovrebbero essere il più semplici possibile e le callback disordinate hanno la reputazione di interferire con questi piani. I callback rendono un po 'troppo facile intorbidare le acque e sparare al piede più volte.
Un altro punto problematico sui callback è che possono nascondere l'implementazione della logica di business in metodi come #salvare
o #creare
. Quindi non essere pigro e abusare di loro solo perché sembra conveniente!
La più grande preoccupazione è l'accoppiamento di preoccupazioni, ovviamente. Perché lasciare che il metodo di creazione di SpectreAgent
, ad esempio, gestire la consegna di a #mission_assignment
o qualcosa? Come spesso, solo perché possiamo farlo facilmente non significa che dovremmo. È un morso garantito nel culo in attesa di accadere. La soluzione è in realtà piuttosto semplice. Se il comportamento di un callback non ha nulla a che fare con la persistenza, è sufficiente creare un altro metodo per questo e il gioco è fatto.
Le cattive scelte di denominazione hanno gravi conseguenze. In effetti, stai sprecando il tempo degli altri, o meglio ancora il tuo, se devi rivisitare quel pezzo di codice in futuro. Il codice che scrivi è un insieme di istruzioni da leggere da te e dalle altre persone, quindi un approccio puramente logico, superprosaico, eccessivamente intelligente o peggio, un semplice e pigro approccio alla denominazione delle cose è una delle cose peggiori che puoi lasciarti alle spalle. Cerca di rendere il tuo codice più facile da capire fornendo nomi migliori.
La chiarezza supera ogni falsa intelligenza o inutile concisione in qualsiasi giorno della settimana! Lavora duro sulla denominazione di metodi, variabili e classi che rendono facile seguire una sorta di thread.
Non voglio arrivare al punto di dire che dovresti cercare di raccontare una storia, ma se puoi, provaci! Le macchine non sono quelle che hanno bisogno di "leggere" il tuo codice - è gestito da loro, ovviamente. Forse questa è una delle ragioni per cui il termine "Software Writer" è cresciuto su di me un po 'ultimamente. Non sto dicendo che l'aspetto ingegneristico dovrebbe essere diminuito, ma scrivere software è più che scrivere istruzioni senz'anima per le macchine, almeno un software che è elegante e fa piacere lavorare con.
Non spaventare se questo risulta essere molto più difficile di quanto pensassi. Il nome è notoriamente difficile!
Le misture sono un odore? Bene, diciamo che possono essere puzzolenti. L'eredità multipla attraverso Mixins può essere utile, ma ci sono un paio di cose che li rendono meno utili di quanto avresti pensato quando avevi iniziato con OOP:
Ti suggerisco di leggere un po 'su "Composition Over Eredità". Il nocciolo della questione è che dovresti fare più affidamento sul riutilizzo delle tue classi composte separatamente che sull'ereditarietà o sottoclassi. Le mixine sono una forma di ereditarietà che può essere utilizzata in modo efficace ma anche qualcosa di cui dovresti essere un po 'sospettoso.
Fai attenzione a passare ripetutamente gli stessi argomenti multipli nei tuoi metodi. Ciò suggerisce spesso di avere una relazione che può essere estratta in una classe a sé stante, che a sua volta può spesso semplificare drasticamente l'alimentazione di questi metodi con i dati riducendo la dimensione degli argomenti. Se vale la pena di introdurre una nuova dipendenza è comunque la cosa che devi pesare.
Questo odore è un'altra forma di duplicazione sottile che possiamo gestire meglio. Un buon esempio è passare una lunga lista di argomenti che costituiscono un indirizzo e informazioni sulla carta di credito. Perché non impacchettare tutto questo in una classe esistente o estrarre prima una nuova classe e passare invece gli oggetti indirizzo e carta di credito? Un altro modo per pensarci è avere un oggetto di intervallo invece di un inizio e una fine. Se hai variabili di istanza che cadono per quell'odore, allora l'estrazione di una classe merita di essere presa in considerazione. In altri casi, a oggetto parametro potrebbe offrire la stessa qualità di astrazione.
Saprai che hai ottenuto una piccola vittoria se il tuo sistema è più facile da capire e hai trovato una nuova carta di credito simile a un concetto, che potresti incapsulare in un oggetto.
Congratulazioni! Hai migliorato in modo significativo le tue abilità OOP! Lo stato del livello del boss si sta avvicinando. No, sul serio, ottimo lavoro se tutto questo argomento fosse piuttosto nuovo per te!
Come ultima raccomandazione, voglio che tu porti via una cosa. Per favore ricorda che non esiste una ricetta che funzionerà sempre. Dovrai pesare ogni problema in modo diverso e spesso mescolare tecniche diverse per soddisfare le tue esigenze. Inoltre, per il resto della tua carriera, probabilmente è qualcosa con cui non dovrai mai smettere di lottare - immagino che una bella lotta, comunque, sia creativa e stimolante.
Questa è una piccola ipotesi, ma credo che se capissi la maggior parte degli argomenti trattati, starai sulla buona strada per scrivere codice che altri sviluppatori amano scoprire. Grazie per il tuo tempo a leggere questa piccola serie, e buona fortuna diventare un felice hacker!