Oftent är hur vi skriver kod beror på hur vi började med programmering.
Till exempel, om någon har en formell utbildning i databehandling, kommer de troligen att känna till en rad principer som hindrar dem från att skriva dålig kvalitetskod. Det här är inte en regel, utan en observation.
På samma sätt hamnar de som själva in i programmeringen, utanför en formell inställning, ofta med att lära sig sig själva och lära sig från en rad olika resurser. Ibland kan detta orsaka problem med den typ av kod som skrivs.
För att vara helt klart: Jag säger inte att en formell utbildning i datorer trumpar någon som lär sig själva eller vice versa. Några fantastiska programmerare är de som är utbildade. andra är de som är självlärda. Men det enda som båda har gemensamt med varandra är att de inte är undantagna från att skriva kodluft från tid till annan.
I den här artikeln kommer vi att ta ett inledande titt på kodluktar. Vi ska undersöka vad de är, hur de ser ut, och hur de ofta manifesterar sig i det arbete vi gör. Vi använder PHP för våra exempel.
I den andra delen av denna serie ska vi titta på hur vi kan undvika att skriva kodluktar. Specifikt använder vi PHP, ett par verktyg och WordPress som valfri miljö.
Men först, låt oss få en introduktion till kod luktar.
Beroende på vilken typ av utvecklare du frågar får du förmodligen en variation på följande definition:
Kodlukt, även känd som en dålig lukt, i datorprogrammeringskoden, hänvisar till eventuella symptom i källkoden för ett program som möjligen indikerar ett djupare problem.
Denna definition är direkt från Wikipedia. Det är inte dåligt, men det är inte min favorit att ta på ämnet. Istället kommer min favoritdefinition från en produktiv och populär programmör som heter Martin Fowler. Du kan läsa hela sin ta upp ämnet kodluktar i den här artikeln, men jag har destillerat den till följande punkter:
Om du inte har läst artikeln avslutar han med följande:
En av de fina sakerna om lukt är att det är lätt för oerfarna människor att upptäcka dem, även om de inte vet tillräckligt för att utvärdera om det finns ett verkligt problem eller att rätta till dem.
Och jag tycker att det är ett fantastiskt uttalande eftersom det betyder att detta ämne är perfekt för dem som är programmerare men inte osäkra var de ska börja när det gäller att identifiera och ta itu med kodlukt.
Kort sagt, erfarenhet spelar inte en stor roll i detta. Visst, de som är mer erfarna kommer sannolikt att lättare identifiera dofter (eftersom de har sett fler av dem), men mindre erfarna utvecklare borde kunna identifiera dem.
Naturligtvis, när det gäller ett ämne som kod luktar, är det ofta lättare att prata om dem på abstrakt nivå att det är att faktiskt göra något åt dem. Men det är inte praktiskt, det är inte heller tillämpligt på vårt dagliga arbete.
Med det sagt, varför inte ta en titt på några exempel på kod luktar? Vi undersöker varför de är problematiska och erbjuder sedan en lösning för hur lukten kan avlägsnas genom att refactoring koden.
En av de enklaste kodens luktar är att när en programmerare har valt att använda oklara variabla namn. Det är, i samband med koden, det är inte klart vad en viss variabel ska representera.
Visst, det finns tillfällen där detta är acceptabelt (som att använda en jag
i en för
slinga). Men i en längre metod är det inte riktigt detsamma som för
slinga).
Till exempel:
Med tanke på tillräckligt med tid skulle vi troligen kunna räkna ut vad detta gör. För det första är det en relativt enkel metod. För det andra skulle vi kunna läsa igenom variablerna, blocken och
lämna tillbaka
värde för att få en bättre uppfattning om vad som händer.Men om vi letar efter att skriva ren kod som är lättare att förstå när vi hänvisar till det eller en annan programmerare arbetar med det, hjälper det att använda tydliga namngivningskonventioner alltid. Och ovanstående kod använder inte tydliga namngivningskonventioner.
Låt oss istället refactor det så att det ser ut så här:
Mycket lättare att förstå, är det inte?
Observera att själva algoritmen inte har ändrats, men funktionsnamnet och variabelnamnen har. Detta har gjort den där mycket av en skillnad i att läsa denna kod. Om du frågar vad den här koden ska göra kan vi lätt säga något som:
Returnerar en rad objekt som är markerade som sanna från en fördefinierad grupp av objekt.Så mycket som möjligt, undvik att använda generiska variabla namn och använd vad som är det tydligaste alternativet för dig och dina kamrater.
Exempel 2: Håll DRY
I programmering skulle du vara hårt pressad för att hitta en utvecklare som inte hade hört talas om KISS eller DRY (du vet, "repetera inte dig själv"). Trots detta, vi ofta do upprepa oss själva.
Detta indikerar att försök att följa DRY-principerna skiljer sig annorlunda med olika typer av programmerare. Och det är bra! Det finns inget enda sätt att visa hur man följer denna princip.
Men eftersom det finns flera sätt att göra det kan vi ge ett exempel på hur det inte ska se ut och hur det ska se ut.
Antag i följande exempel att vi har en funktion som heter save_post och den accepterar två argument: ett post-ID och en sträng som representerar postens titel. En kodlukt skulle se ut så här:
Men varför skulle vi manuellt skriva ett samtal till
spara inlägget
tre gånger? Låt oss istället skapa en associativ array, iterera genom den och sedan ringa metoden en gång per iteration.'Hello World!', 2 => 'Goodbye World!', 3 => 'Vad är den här nya världen?',]; foreach ($ post som $ post_id => $ post_title) save_post ($ post_id, $ post_title);Även om man kallar metoden en gång är snäll kan metoden göras ännu mer flexibel genom att den accepterar utbudet av inlägg som ett argument och lämnar
för varje
slingan intakt, men det är inte verkligen meningen med detta exempel.Om du tycker att du gör samma metod flera gånger i en funktion men med olika parametrar kan du ha en kodlukt. Och om du gör det, leta efter sätt att refactor det så att du bara ringer metoden en gång.
När allt kommer omkring vill du inte upprepa dig själv.
Exempel 3: Långa parameterlistor
En av de vanligaste sakerna som vi fortsätter att se i programmeringen, oavsett språk, är när en funktion accepterar ett stort antal parametrar.
Olika programmerare kommer att ha åsikter om vad som är det ideala antalet parametrar som en funktion ska acceptera, men jag tenderar att tänka tre (ge eller ta två, kanske) är ett bra tal.
Låt oss först titta på vad en funktion med en lång parameterlista skulle se ut. Det finns sannolika inga överraskningar i följande kod, och du kan hantera något exakt som detta i ett av dina nuvarande projekt:
Observera i ovanstående exempel är vi inte oroliga för genomförandet av funktionen. I stället är vi oroade över hur många parametrar det kräver. Det är mycket information att skicka, och det kommer att göra metoden att ringa den där mycket illaluktande också.
Det slår inte ens på ämnet verifiering och validering. Men jag avviker på det.
Hur kan den här rengöras? Personligen är jag ett fan av att skapa klasser för att representera samlingar av information som denna. För det här exemplet kan vi ha en klass som presenterar personens kontaktuppgifter. Dessutom kan den personen vara associerad med ett kreditkortsnummer.
Detaljerna om detta kan genomföras med hjälp av affärslogik på annat håll i ansökan, men abstraktionen skulle se ut så här:
Denna refactoring, även om den är liten, är den största vi har gjort i den här artikeln. Observera att vi har gjort följande saker:
- Skapat a
Kontakt information
klass som tillåter oss att inställa ett objekt som innehåller all betalningsinformation för en person.- Skapat a
Betalningsinformation
klass som tillåter oss att behålla kreditkorts- eller betalkortsnummer för en person samt andra detaljer som är kopplade till den betalningsmetoden.- Skapat en
Ordning
klass, placeradesubmit_order
funktionen inuti den, omdirigerade den att skicka in (sedansubmit_order
skulle vara överflödig), och sänkte dess parameterlista till två värden: en instans avKontakt information
klass ochBetalningsinformation
klass).För att klargöra detta hanterar inte exemplet verifiering av kontaktinformation och betalningsinformation, det visar inte heller andra klasser som kan vara nödvändiga (till exempel om betalning misslyckades för transaktionen).
Men det är inte meningen med övningen.
Istället tittar vi på kodluften av långa parameterlistor och hur vi kan minska dem med hjälp av praktiska, mer underhållbara metoder som är tillgängliga för oss.
När du skriver en funktion eller ringer till en funktion som kräver ett stort antal argument, leta efter sätt att refactor den funktionen. Det kommer att öka kohesionens kohesion och lukten minskar.
Slutsats
Kom ihåg att de exempel vi har tittat på ovan är bara det. Listan är inte fullständig, men de är vanliga luktar som du sannolikt kommer att se i kod som du arbetar med eller till och med kodar du skriver. Jag är den första som medger att jag är skyldig till detta.
Dessutom finns det många, många resurser som är tillgängliga när det gäller att identifiera och fixa kodluktar. Lyckligtvis har vi också ett antal verktyg till vårt förfogande som hjälper oss att upptäcka dem automatiskt och städa upp dem.
Och det är där vi är på väg nästa. Specifikt kommer vi att använda PHP CodeSniffer för att hjälpa oss att undvika kodluktar i vår kod. Då ska vi se hur man införlivar WordPress-reglerna till PHP CodeSniffer och kopplar den till vårt IDE-val.
Som tidigare nämnts i den här artikeln kommer nästa artikel i serien att fokusera mer på kodlukt när du skriver kod för WordPress. Vi tar en titt på några verktyg och resurser som finns tillgängliga för att se till att vi undviker kodlukt och för att försäkra oss om att vi skriver starkare kod.
Under tiden studerar du exemplen ovan och kolla in de resurser som jag har angett eftersom de är bra ställen att lära dig mer om lukt och kodreaktivering från människor och platser som är anmärkningsvärda inom vår bransch.
Kom ihåg att du kan fånga alla mina kurser och handledning på min profilsida, och du kan följa mig på min blogg och / eller Twitter på @tommcfarlin där jag pratar om olika mjukvaruutveckling och hur vi kan använda dem i WordPress.
Tveka inte att lämna några frågor eller kommentarer i foderet nedan, och jag vill sikta på att svara på var och en av dem.