Din când în când particip la discuții cu oameni despre ceea ce este TDD . Datorită faptului că utilizez TDD , dar și că îl explic altora , am dezvoltat o anumită cunoaștere în timp referitoare la acest subiect. De aceea, m-am hotărât să scriu acest articol care detaliază punctul meu de vedere în legătură cu ce este TDD. Sper că îl veți găsi util. Cum ar putea fi un articol lung, voi scrie pentru Today Software Magazine o serie de articole mai scurte pe această temă. Iată-l pe primul.
Designul concepe și dă formă în mod intenționat artefactelor care rezolvă probleme.
Codul pentru computer este un astfel de artefact; de aceea, orice bucată de cod care rezolvă în mod intenționat o problemă este conceput.
Astfel, TDD este o metodă pentru a obține design.
Un design bun înseamnă un design care are anumite calități. Cea mai comună calitate pe care o căutăm astăzi este aceea de a putea fi schimbat.
TDD oferă câteva calități integrate: testabilitate și rezistență la erori crescută. Dezvoltatorul trebuie să lucreze la îmbunătățirea altor calități, precum aceea de a fi șanjabil. De aceea, specialiștii folosesc principiile SOLID pentru a-și ghida deciziile legate de design.
În acest fel se justifică faptul că designul care deține aceste calități obținute prin TDD, depinde în mare măsură de abilitățile designerului.
Atunci când face TDD, dezvoltatorul concepe design înainte de a începe (deoarece utilizează un cadru web MVC) și pe toată durata ciclurilor TDD: când scrie testul (alege numele clasei/ metodei, decide ce tipuri de clase să utilizeze, etc.), când implementează codul (nume variabile) și când face restructurare.
Eu propun ideea că TDD este o metodă pentru design incremental, deoarece soluția crește pas cu pas. Aceasta are legătură cu rezolvarea de probleme, iar cercul se închide - deoarece designul înseamnă soluționarea unei probleme.
Interesant? Mai avem încă multe!
Dintr-un oarecare motiv, termenul de "design" a devenit supraîncărcat și ambiguu. Să luăm pentru un moment exemplul unui smartphone. Ce definește designul său? Cum arată? Cum se comportă? Materialele care îl compun? Au telefoanele mobile mai vechi un "design" sau numai smartphone-urile mai noi și mai ingenioase au "design"?
Lucrurile devin mai complicate când vorbim despre software. Are "design" o bucată de cod care urmează principiile SOLID? Există "design" atunci când este cod procedural? Există "design" când are metode lungi?
Eu am început să pun aceste întrebări în urmă cu câțiva ani, deoarece nu aveam nicio idee în legătură cu răspunsul. Singura modalitate de a găsi răspunsuri era să învăț mai multe despre design în alte domenii decât software. La urma urmei, designul este o disciplină care a existat timp de sute de ani înainte de industria noastră.
În sfârșit, am găsit un răspuns categoric și satisfăcător:
"Designul înseamnă să concepi și să dai formă unor artefacte care rezolvă probleme; artefactul (este)… orice produs de creare intenționată, inclusiv … software-ul".
Karl T. Ulrich, "Design - crearea artefactelor în societate"
De aceea, orice bucată de cod care rezolvă o problemă într-un mod intenționat este design. Telefoanele mai vechi aveau "design" deoarece ele rezolvau o problemă: conversațiile la telefon cu alți oameni.
Dar dacă design este orice bucată de cod care rezolvă o problemă în mod intenționat, de ce utilizăm principiile SOLID sau cod curat sau alte lucruri? Probabil din aceleași motive pentru care designerii grafici utilizează principii precum alinierea sau accentuarea. Pentru a face designul mai bun.
Lucrul cel mai dificil de înțeles în legătură cu designul este că designul are anumite calități. De exemplu, una dintre calitățile designului experienței de utilizator este calitatea sa de a fi "comod în utilizare" - cât de ușor este să folosești aplicația și cât de repede poate utilizatorul să își rezolve problema cu ea.
Aceste calități sunt contextuale. De exemplu, o experiență a utilizatorului de mobil este diferită de experiența utilizatorului web. Mediul contează în acest caz.
Dar designul software? Care sunt câteva dintre calitățile sale? Iată o listă rapidă care mi-a trecut prin cap:
Calități statice (când codul nu rulează):
Lizibilitatea: codul poate fi citit ușor.
Navigabilitatea: se poate naviga ușor în cod.
Logica: prin citirea codului, poți să îți dai seama ușor cum se comportă în perioada de rulare.
Calități dinamice (valabile în perioada de rulare):
Performanța,
Scalabilitatea,
Securitatea,
Rezistența la dezastre,
Calitățile designului software sunt contextuale, de asemenea. În cazul unei aplicații web tipice, calitatea de a fi șanjabil și performanța sunt în mod tipic cele mai importante, urmate îndeaproape de scalabilitate și securitate. Pentru aplicațiile mobile, performanța și modificabilitatea sunt importante. Pentru serviciile web de date cu volum mare, performanța și scalabilitatea sunt cheia. Și așa mai departe.
Un lucru este constant: capacitatea de a fi modificat este importantă în aproximativ 90% dintre aplicațiile pe care le dezvoltăm azi. Noi trebuie să le modificăm des, deci este util să le putem schimba rapid.
Date fiind toate acestea, ce este un design bun? Ar trebui să fie ușor:
Designul bun este o bucată de cod care rezolvă o problemă în mod intenționat și care etalează calitățile de design necesare în contextul dat.
Motivul pentru care noi tot vorbim despre lucruri precum cele patru principii ale designului simplu, principiile SOLID și Cod Curat este pentru că avem nevoie de o calitate pe care aceste principii o oferă: modificabilitatea. Faptul că avem teste ne ajută să evităm greșelile atunci când modificăm codul. Principiile SOLID sunt toate despre ușurința de a modifica codul. Duplicarea ne împiedică să facem schimbări rapid. Numele nepotrivite ne împiedică să înțelegem codul și doar îl fac mai dificil de modificat.
Este important de notat, totuși, că aceasta nu este singura calitate a designului pe care ar trebui să o urmărim. Tehnologii precum nodejs sau vertx preferă performanța în locul calității de a putea fi schimbat. Proceduri memorate sau concepții pentru crearea rapoartelor au același efect.
Punerea în balanță a calităților designului este unul dintre cele mai dificile lucruri pentru un programator. Modificabilitatea este, totuși, un bun început, fiind o preocupare atât de larg răspândită.
Dacă înțelegem ce este designul și ce este un design bun, atunci ce este TDD de fapt?
Urmăriți-ne în articolul următor, din numărul viitor al revistei.
de Patkós Csaba
de Ioana Varga , Ioana Costea
de Lucian Pop