Ruby / Rails Code Smell Basics 04

Kod luktar och deras refactorings kan vara mycket skrämmande och skrämmande för nybörjare. Så i denna serie har jag försökt att göra dem lätta att förstå, både för lite erfarna Ruby-utvecklare och förare.

I den här sista artikeln nämns några mer luktar du borde ta hand om och sammanfatta vad den här lilla serien ville uppnå. En sista whiff, om du gillar ...

ämnen

  • kommentarer
  • callbacks
  • Dåliga namn
  • Mixins
  • Dataklumpar

En Final Whiff

Den sista artikeln i den här serien är något som en bonusrunda. Jag ville presentera dig för några få luktar som kan hanteras snabbt och utan mycket krångel. En för vägen, så att säga. Jag tror med de kunskaper du har samlat från de tidigare artiklarna, de flesta behöver inte ens kodexempel för att sätta på huvudet.

När du öppnar en bok om refactoring, hittar du lättare lukt än vi har diskuterat. Men med dessa större under ditt bälte kommer du vara väl förberedd att hantera någon av dem.

kommentarer

Generöst tillämpade kommentarer är sällan en bra idé - förmodligen aldrig. Varför inte? Eftersom det kan föreslå att din design inte talar för sig själv. Det betyder att din kod är förmodligen så komplicerad att du förstår att den behöver bokstavliga förklaringar.

Först av allt, vem vill gå igenom tuffa texter i din kod - eller sämre, genom kod som är svår att förstå. Jackpot om båda är vanliga förekommande. Det är bara dåligt och inte väldigt hänsynsfullt till människor som kommer efter dig - ingen brott, masochister, tortyrar ditt framtida själv allt du vill.

Du vill skriva kod som är uttrycksfull nog i sig. Skapa klasser och metoder som talar för sig själva. I bästa scenario berättar de en historia som är lätt att följa. Det är förmodligen en av anledningarna konventioner över konfigurationer blev så inflytelserika. Återuppfinning av hjulet är ibland en bra övning för att skärpa din förståelse och utforska nytt territorium, men i snabba utvecklingsmiljöer söker dina kollegor klarhet och snabb navigering - inte bara inom dina filer utan också inom den mentala kartan du skapar i din kod.

Jag vill inte flytta till ett helt nytt ämne, men namngivning spelar en stor roll i allt detta. Och överdriven kommentar inom din kod strider i motsats till goda namngivningspraxis och konventioner. Förse mig inte, det är bra att lägga till kommentarer. Bara stanna på den väg som "belyser" din kod i stället för att distrahere från den. Kommentarer bör absolut inte vara instruktioner för smart kod som du kan dechiffrera för att du ville visa upp. Om du håller dina metoder enkla - som du borde - och namnge allt med hänsyn, då har du lite behov av att skriva hela romaner mellan din kod.

Håll dig borta från följande:

  • Todo listor
  • Död kod kommenterade
  • Kommentarer i metodkroppar
  • Mer än en kommentar per metod

Det är också användbart att bryta ut delar av metoder via extraktmetod och ge den här delen av en metod ett namn som berättar om sitt ansvar, snarare än att få alla detaljer att röra upp en hög nivå förståelse för vad som händer inom metodens kropp.

def create_new_agent ... end ... # skapa en ny agent, besök root_path click_on 'Create Agent' fill_in 'Agent Name' med: 'Jinx' fill_in 'Email' med: '[email protected]' fill_in 'Password' med: 'sekretras 'click_button' Skicka '... 

Vad är lättare att läsa? En brainer självklart! Använd den fria körsträckan du får genom att namnge saker ordentligt via extraherade metoder. Det gör din kod så mycket smartare och lättare att smälta-plus fördelarna med refactoring på ett ställe om det återanvänds, naturligtvis. Jag satsar på detta kommer att hjälpa till att trimma ner dina kommentarer med mycket mycket.

callbacks

Det här är enkelt. Använd inte återuppringningar som inte är relaterade till persistenslogik! Dina objekt har en livslängd för livslängd, skapar, sparar och tar bort objekt, så att säga - och du vill inte "förorena" den logiken med annat beteende som din logiks affärslogik.

Håll det enkelt, kom ihåg? Typiska exempel på vad som ska undvikas är att skicka e-post, bearbeta betalningar och saker. Varför? Eftersom felsökning och refactoring ska din kod vara så enkel som möjligt, och roliga callbacks har ett rykte att störa dessa planer. Återuppringningar gör det lite för lätt att mudda vattnet och skjuta dig i foten flera gånger.

En annan problematisk punkt om återkallelser är att de kan dölja genomförandet av affärslogiken i metoder som #spara eller #skapa. Så var inte lat och missbruk dem bara för att det verkar bekvämt!

Den största oroen är naturligtvis koppling av bekymmer. Varför låta skapa metod för SpectreAgent, till exempel hantera leverans av a #mission_assignment eller något? Som så ofta, bara för att vi kan göra det-lätt-menar inte att vi borde. Det är en garanterad bett i röven som väntar på att hända. Lösningen är faktiskt ganska enkel. Om ett callbacks beteende inte har något att göra med uthållighet, skapa helt enkelt en annan metod för det och du är klar.

Dåliga namn

Dåliga namngivna val har allvarliga konsekvenser. I själva verket slösar du bort andras tid - eller ännu bättre, om du måste återkomma det stycket kod i framtiden. Koden du skriver är en uppsättning instruktioner som ska läsas av dig och andra människor, så en rent logisk, superprosaisk, alltför smart eller värre, en vanlig lat inställning till att namnge saker är en av de värsta sakerna du kan lämna. Syftar till att göra din kod lättare att förstå genom att ge bättre namn.

Klarhet trummar falsk smarthet eller onödig conciseness någon dag i veckan! Arbeta hårt med namngivna metoder, variabler och klasser som gör det enkelt att följa någon form av tråd.

Jag vill inte gå så långt som att säga att du ska sikta på att försöka berätta en historia, men om du kan, gå för det! Maskiner är inte de som behöver "läsa" din kod, det är naturligtvis de som drivs av dem. Kanske är det en anledning till att termen "Software Writer" har blivit en del av mig på senare tid. Jag säger inte att ingenjörsaspekten bör minskas, men att skriva programvara är mer än att skriva sällsynta instruktioner för maskiner - åtminstone programvara som är elegant och gnistor glädje att arbeta med.

Freak inte ut om det visar sig vara mycket svårare än du trodde. Naming är notoriskt svårt!

Mixins

Mixins är en lukt? Tja, låt oss säga att de kan vara illaluktande. Flera arv via Mixins kan vara användbara, men det finns ett par saker som gör dem mindre användbara än du kanske trodde när du började med OOP:

  • De är knepigare att testa.
  • De kan inte ha sin egen stat.
  • De "förorenar" namespace lite.
  • Det är inte alltid superklart var funktionaliteten kommer från-eftersom den är blandad i.
  • De kan blåsa upp storleken på klasserna eller antalet metoder drastiskt. Små klasser regel, kom ihåg?

Jag föreslår att du läser lite om "Sammansättning över arv". Huvuddelen av det är att du borde förlita dig mer på återanvändning av dina egna, separat sammansatta klasser än på arv eller underklasser. Mixins är en form av arv som kan användas till bra användning, men också något du borde vara lite misstänksam om.

Dataklumpar

Se upp för att du i flera fall går igenom samma flera argument i dina metoder. Det föreslår ofta att de har ett förhållande som kan extraheras till en egen klass - vilket i sin tur ofta kan drastiskt förenkla att mata dessa metoder med data genom att minska storleken på argumenten. Huruvida det är värt att införa ett nytt beroende är det du måste väga.

Denna lukt är en annan form av subtil dubbelarbete som vi kan hantera bättre. Ett bra exempel är att ge en lång lista över argument som utgör en adress och kreditkortsinformation. Varför inte paketera allt detta i en befintlig klass, eller ta ut en ny klass först och skicka i adress och kreditkortsobjekt istället? Ett annat sätt att tänka på det är att ha ett intervallobjekt istället för en start och ett slut. Om du har instansvariabler som faller för den lukten, är utvinning av en klass värt att överväga. I andra fall a parameterobjekt kan erbjuda samma kvalitet av abstraktion.

Du vet att du har uppnått en liten vinst om ditt system är lättare att förstå och du hittade ett nytt konceptliknande kreditkort - som du kan inkapsla i ett objekt.

Slutgiltiga tankar

grattis! Du har nivellerat dina OOP-färdigheter väsentligt! Boss nivå status närmar sig. Nej, allvarligt bra jobb om hela detta ämne var nytt för dig!

Som en sista rekommendation vill jag att du tar bort en sak. Kom ihåg att det inte finns något recept som alltid kommer att fungera. Du kommer att behöva väga alla problem annorlunda och blanda ofta olika tekniker som passar dina behov. Även för resten av din karriär är detta troligtvis något du aldrig kommer att sluta kämpa med - Jag antar en bra kamp, ​​dock en kreativ och utmanande.

Det här är lite gissning, men jag känner att om du förstod de flesta av de ämnen vi täckte, kommer du att gå bra på att skriva kod som andra utvecklare tycker om att upptäcka. Tack för din tid att läsa den här lilla serien och lycka till att bli en lycklig hackare!