Folosind PHP CodeSniffer Cu WordPress Înțelegerea codului miroase

Deseori, modul în care scriem codul depinde de modul în care am început să programăm.

De exemplu, dacă cineva are o educație formală în calcul, este probabil să cunoască o varietate de principii care să îi împiedice să scrie cod de slabă calitate. Aceasta nu este o regulă, desigur, ci o observație. 

În mod similar, cei care intră în programare pe cont propriu, în afara unui cadru formal, sfârșesc de multe ori să se învețe și să învețe dintr-o varietate de resurse diferite. Uneori, acest lucru poate cauza probleme cu tipul de cod care este scris.

Pentru a fi absolut clară: Eu nu spun că o educație formală în computere atrăgește pe cineva care învață ei înșiși și nici invers. Unii programatori fantastice sunt cei care sunt educați; alții sunt cei care sunt auto-învățați. Dar singurul lucru pe care ambele au în comun unul cu altul este că nu sunt scutite de la scrierea de mirosuri de cod din când în când.

În acest articol, vom lua o privire introductivă asupra mirosurilor de cod. Vom examina ceea ce sunt, cum arată și cum se manifestă adesea în munca pe care o facem. Vom folosi PHP pentru exemplele noastre.

În a doua parte a acestei serii, vom examina modul în care putem evita scrierea mirosurilor de cod. În mod specific, vom folosi PHP, câteva instrumente și WordPress ca mediul de alegere.

Dar, mai întâi, să introducem o introducere pentru a codifica mirosurile.

Ce sunt Codul miroase?

În funcție de tipul de dezvoltator pe care îl întrebați, veți obține o variantă cu privire la următoarea definiție:

Mirosul de cod, de asemenea, cunoscut ca un miros rău, în codul de programare al computerului, se referă la orice simptom din codul sursă al unui program care indică eventual o problemă mai profundă. 

Această definiție este direct de la Wikipedia. Nu este rău, dar nu este preferatul meu de a lua pe subiect. În schimb, definiția mea preferată provine de la un programator prolific și popular, numit Martin Fowler. Puteți citi întreaga sa abordare pe tema mirosurilor de cod în acest articol, dar l-am distilat până la următoarele puncte:

  1. "O metodă lungă este un bun exemplu al acestui lucru - doar căutând codul și mișcările nasului meu dacă văd mai mult de o duzină de linii Java".
  2. "Miroasele nu sunt în mod inerent rele pe cont propriu - ele sunt adesea un indicator al unei probleme mai degrabă decât problema în sine".
  3. "Clasele de date (clase cu toate datele și fără comportament) sunt exemple bune."

Dacă nu ați citit articolul, el se termină cu acest lucru:

Unul dintre lucrurile drăguțe despre mirosuri este că este ușor ca oamenii neexperimentați să le vadă, chiar dacă nu știu suficient pentru a evalua dacă există o problemă reală sau pentru a le corecta. 

Și cred că este o afirmație fantastică, deoarece înseamnă că acest subiect este poziționat perfect pentru cei care sunt programatori, dar nu sunteți siguri de unde să începeți atunci când vine vorba de identificarea și abordarea mirosurilor de cod.

Pe scurt, experiența nu joacă un rol important în acest sens. Sigur, cei mai experimentați ar putea identifica mai ușor mirosurile (pentru că au văzut mai multe dintre ele), dar dezvoltatorii mai puțin experimentați ar trebui să-i poată identifica.

Aveți exemple?

Desigur, atunci când vine vorba de un subiect cum ar fi mirosurile de cod, este deseori mai ușor să vorbim despre ele la un nivel abstract că este de fapt să faci ceva despre ei. Dar acest lucru nu este practic, nici nu este aplicabil pentru munca noastră de zi cu zi.

Cu asta a spus, de ce nu aruncăm o privire la un exemplu de mirosuri de cod? Vom examina motivul pentru care acestea sunt problematice și apoi vom oferi o soluție pentru modul în care mirosul ar putea fi eliminat prin refacerea codului.

Exemplul 1: Convenții clare de numire

Unul dintre cele mai simple coduri miroase la fața locului este atunci când un programator a optat să utilizeze nume variabile neclare. Adică, în contextul codului, nu este clar ce înseamnă o anumită variabilă.

Desigur, există momente în care acest lucru este acceptabil (ca de exemplu utilizarea unui eu în a pentru buclă). Dar într-o metodă mai lungă, nu este același lucru cu cel pentru buclă). 

De exemplu:

Având suficient timp, probabil că vom fi capabili să ne dăm seama ce face. În primul rând, este o metodă relativ simplă. În al doilea rând, vom putea citi prin variabile, blocuri și întoarcere pentru a obține o idee mai bună cu privire la ceea ce se întâmplă.

Dar dacă căutăm să scriem un cod curat, care este mai ușor de înțeles pe măsură ce ne referim la el sau când un alt programator lucrează cu el, atunci folosirea convențiilor clare de numire întotdeauna ajută. Și codul de mai sus nu utilizează convenții clare de numire.

În schimb, să o refacem astfel încât să arate astfel:

Este mult mai ușor de înțeles, nu-i așa??

Observați că algoritmul însuși nu sa schimbat, dar numele funcției și numele variabilelor au. Asta a făcut acea o mare parte din diferența în citirea acestui cod. Dacă ne întrebăm ce ar trebui să facă acest cod, putem spune cu ușurință ceva de genul:

Returnează o serie de elemente marcate ca fiind adevărate dintr-o serie de elemente predefinite.

Pe cât posibil, evitați folosirea numelor de variabile generice și folosiți ceea ce este cea mai clară opțiune pentru dvs. și pentru colegii dumneavoastră.

Exemplul 2: Stați uscat

În programare, ați fi greu să găsiți un dezvoltator care nu a auzit de KISS sau DRY (știi, "nu te repeta"). Cu toate acestea, deseori do ne repetăm. 

Acest lucru indică faptul că încercarea de a adera la principiile DRY se desfășoară diferit cu diferite tipuri de programatori. Și e bine! Nu există o singură modalitate de a demonstra cum să aderăm la acest principiu.

Dar pentru că există mai multe modalități de a face acest lucru, putem oferi un exemplu de ceea ce nu ar trebui să arate și cum ar trebui să arate.

Să presupunem în scopul următorului exemplu că avem o funcție numită save_post și acceptă două argumente: un ID post și un șir reprezentând titlul postului. Un miros de cod ar arăta așa:

Dar de ce am face manual un apel save_post de trei ori? În schimb, să organizăm o matrice asociativă, să iterăm prin ea și apoi să sunăm metoda o dată pe iterație.

 'Hello World!', 2 => 'La revedere!', 3 => 'Ce este această lume nouă?';]; foreach ($ post după $ post_id => $ post_title) save_post ($ post_id, $ post_title); 

Deși apelarea uneia dintre metode este plăcută, metoda ar putea deveni și mai flexibilă prin faptul că ar accepta o serie de posturi ca argument și lăsând pentru fiecare buclă intactă, deși acest lucru nu este chiar punctul acestui exemplu.

Dacă vă vedeți că efectuați aceeași metodă apelând de mai multe ori într-o funcție, dar cu parametri diferiți, este posibil să aveți miros de cod. Și dacă o faci, căutați modalități de a o reface, astfel încât să numiți această metodă o singură dată. 

La urma urmei, nu vreți să vă repetați.

Exemplul 3: Liste lungi de parametri

Unul dintre lucrurile mai frecvente pe care continuăm să le vedem în programare, indiferent de limbă, este atunci când o funcție acceptă un număr mare de parametri. 

Diferiții programatori vor avea opinii cu privire la numărul ideal de parametri pe care o funcție ar trebui să le accepte, dar am tendința să cred că trei (da sau să ia doi, poate) este un număr bun.

Mai întâi, să aruncăm o privire la ceea ce ar arăta o funcție cu o listă lungă de parametri. Este posibil să nu existe surprize în codul următor și este posibil să fiți în legătură cu ceva exact ca acesta într-unul dintre proiectele dvs. curente:

Observați în exemplul de mai sus, nu suntem preocupați de implementarea funcției. În schimb, suntem preocupați de numărul de parametri necesari. Este o mulțime de informații pe care trebuie să le trimiteți și va face apelul la metodă acea mult mai urât, de asemenea.

Nici măcar nu a lovit pe tema verificării și validării. Dar mă descurc pe asta.

Cum ar putea fi curățată? Personal, eu sunt un fan al creării de clase pentru a reprezenta colecții de informații de genul asta. Pentru acest exemplu, am putea avea o clasă care să prezinte informațiile de contact ale unei persoane. În plus, acea persoană ar putea fi asociată cu un număr de card de credit. 

Detaliile acestui lucru ar putea fi impuse folosind logica de afaceri în altă parte a aplicației, dar abstracția ar arăta astfel:

Acest refactoring, deși mic, este cel mai mare lucru pe care l-am făcut în acest articol special. Observați că am făcut următoarele lucruri:

  1. Creat a Informatii de contact clasa care ne permite să instanțiăm un obiect care include toate informațiile de plată pentru o persoană.
  2. Creat a Informatii de plata clasa care ne permite să păstrăm numărul cărții de credit sau de debit pentru o persoană, precum și alte detalii asociate cu acea metodă de plată.
  3. Creat un Ordin clasa, a plasat depune comanda funcția din interiorul acesteia, a redenumit-o să prezinte (din moment ce depune comanda ar fi redundant), și a scăzut lista de parametri la două valori: o instanță a Informatii de contact clasa și Informatii de plata clasă).

Pentru a fi clar, acest exemplu nu se ocupă de verificarea asocierii dintre informațiile de contact și informațiile de plată și nici nu arată alte clase care ar putea fi necesare (cum ar fi dacă plata a eșuat sau nu pentru tranzacție).

Dar asta nu este scopul exercițiului.

În schimb, ne uităm la mirosul de cod al listelor de parametri lungi și la modul în care putem să le micșorăm utilizând metode practice, mai moderne disponibile pentru noi.

Ori de câte ori scrieți o funcție sau efectuați o convorbire la o funcție care necesită un număr mare de argumente, căutați modalități de refăcurare a acestei funcții. Aceasta va face ca coeziunea codului să crească și mirosul să scadă.

Concluzie

Amintiți-vă, exemplele pe care le-am analizat mai sus sunt tocmai aceleași. Lista nu este completată, dar sunt mirosuri comune pe care probabil că le veți vedea în codul cu care lucrați sau chiar pe codul pe care îl scrieți. Voi fi primul care va recunoaște că sunt vinovat de asta.

În plus, există multe, multe resurse care sunt disponibile atunci când vine vorba de identificarea și fixarea mirosurilor de cod. Din fericire, avem la dispoziție un număr de instrumente care ne vor ajuta să le descoperim în mod automat și să le curățăm.

Și aici mergem în continuare. Mai precis, vom folosi PHP CodeSniffer pentru a ne ajuta să evităm mirosurile de cod în codul nostru. Apoi, vom vedea cum să încorporăm regulile WordPress în PHP CodeSniffer și să o conectăm la IDE-ul nostru de alegere.

Așa cum am menționat mai devreme în acest articol, următorul articol din serie se va concentra mai mult pe mirosurile de cod atunci când scrieți un cod pentru WordPress. Vom analiza câteva instrumente și resurse disponibile pentru a vă asigura că evităm mirosurile de cod și pentru a ne asigura că scriem coduri mai puternice.

Între timp, studiați exemplele de mai sus și verificați resursele pe care le-am furnizat deoarece sunt locuri excelente pentru a afla mai multe despre mirosurile și refacularea codurilor de la persoane și locuri care sunt notabile în cadrul industriei noastre.

Amintiți-vă că puteți prinde toate cursurile și tutorialele mele pe pagina mea de profil și puteți să mă urmați pe blogul meu și / sau pe Twitter la @tommcfarlin unde vorbesc despre diverse practici de dezvoltare software și cum le putem angaja în WordPress.

Nu ezitați să lăsați orice întrebări sau comentarii în feed-ul de mai jos și mă voi adresa fiecăruia.

Cod