În această serie de utilizatori începători, ne uităm la AntiPatterns, care - așa cum sugerează și numele - reprezintă aproape opusul modelelor de design. Ele sunt descoperiri de soluții la probleme pe care ar trebui să le eviți.
În acest articol ne vom concentra pe principalul View AntiPattern-PHPitis și vom lucra prin câteva tehnici pentru a vă păstra opinia înclinată și medie. Având tone de cod Ruby în opinia dvs. nu este doar urât, dar de multe ori simplu inutile.
Rails vine cu ERb (Embedded Ruby) din cutie și cred că nu este necesar să aruncăm motoarele de afișare răcoritoare, cum ar fi Slim, pentru exemplele noastre de acum. Dacă credeți că "convenția peste configurație" se aplică în cea mai mare parte la straturile de model și controler, vă lipsesc pe multe dintre bunele care fac lucrul cu Rails atât de rapid și progresiv. Îngrijirea stratului de vizualizare include nu numai modul în care compuneți marcajele, ci și CSS / Sass, JavaScript, asistenții de vizualizare și șabloanele de aspect. Privită din acest unghi, devine un pic mai adânc decât credeți la început. Numărul mare de tehnologii care pot fi implicate în crearea vederilor dvs. sugerează că ar trebui să se acorde o atenție deosebită păstrării unor lucruri clare, clare și flexibile.
Deoarece modul în care scriem marcajul și stilurile este mult mai puțin constrâns decât modelarea domeniului, doriți să fiți foarte precauți pentru a păstra lucrurile cât mai simple posibil. Întreținerea ar trebui să fie o prioritate numărul unu. Deoarece reproiectările sau iterațiile de proiectare pot fi mai frecvente decât modificările extinse ale stratului dvs. de model, pregătirea pentru schimbare are un sens cu totul nou atunci când vine vorba de stratul dvs. orientat spre utilizator. Sfatul meu: nu construiți neapărat pentru viitor, dar, de asemenea, nu subestimați rata de schimbare - mai ales dacă aveți unul dintre acei "tipi de idei" care știe Jack despre implementări în echipă. Ceea ce îmi place de abordarea lui Rails față de punctele de vedere în MVC este că este tratată la fel de importantă și lecțiile învățate din domeniul modelului au fost încorporate în vedere - ori de câte ori este posibil și util. Alte cadre par să fie de acord, deoarece au integrat multe dintre aceste idei pionierate de Rails.
Din moment ce ultimul articol a fost un pic mai extins, am ales acest subiect ca o mică respirație. Următoarele articole despre controlerele Rails și testele sunt din nou mai mari. Antipaternele pentru opinii nu sunt atât de multe, dar ele sunt totuși la fel de importante. Ne vom concentra pe cea principală, PHPitis, și vom lucra cu ajutorul a două tehnici pentru a vă menține opiniile înclinate și însemnate. Din moment ce vederea este stratul de prezentare, poate ar trebui sa fiti foarte atenti sa nu creati o mizerie periculoasa. Hai să ajungem la asta!
De ce avem în primul rând MVC? Da, deoarece separarea preocupărilor părea a fi cel mai rezonabil lucru de făcut. Sigur, implementările acestei idei variază puțin aici și acolo, însă conceptul general de a avea responsabilități distincte pentru fiecare strat este motivația de bază pentru construirea de aplicații robuste. Având tone de cod în stratul dvs. de vedere, ar putea să nu fie străin dezvoltatorilor care provin din partea PHP a lucrurilor - deși am auzit că cadrele lor au ajuns deja (influențate puternic de lucruri ca Rails?) - dar în Ruby-land aceste lucruri au lung a fost un AntiPattern cu voce tare.
Problemele evidente, cum ar fi amestecarea responsabilităților și duplicarea, se simte pur și simplu urâtă și leneșă - și puțin proastă, pentru a fi sinceră. Sigur, înțeleg, când dezvolți mult într-un cadru, într-un limbaj sau în orice ecosistem, este ușor să devii complicat sau amorțit față de astfel de lucruri. Ceea ce îmi place despre oamenii care împing pe Ruby este că aceste lucruri par a avea o greutate mult mai mică - acesta ar putea fi un motiv pentru care inovarea nu părea a fi o problemă în cadrul comunității. Oricare ar fi cele mai bune lucrări câștigă argumentul și putem merge mai departe.
Deci este o sectiune dedicata miscarii PHP? Deloc! În trecut, aplicațiile PHP aveau reputația de a avea separări slabe între modele, vizualizări și controlori (poate că acesta a fost unul dintre motivele principale pentru care oamenii au simțit că scrierea de aplicații cu Rails era mult mai atrăgătoare). A avea fișiere unice cu cod pentru toate cele trei straturi nu părea sexy. Deci, atunci când suntem în ton de Ruby sau cod de domeniu în punctul nostru de vedere, acesta începe să arate ca un stil de temut PHP de structurare a lucrurilor - PHPitis. Doar câteva lucruri sunt la fel de rele ca aceasta atunci când vine vorba de dezvoltarea de aplicații web, mă simt. Când îți pasă de dezvoltatorii fericiți și de sanatatea ta viitoare, nu înțeleg de ce cineva ar merge pe drumul ăsta - nu este decât o durere înainte, se pare.
Rails oferă o mulțime de bunuri pentru a minimiza codul în vedere cât mai mult posibil. Trebuie să învățați modalitățile de ajutorare, machete și preprocesoare pentru a obține o viziune mai curată. O regulă simplă este păstrarea logicii domeniului din vizualizări - fără comenzi rapide!
Prețul care trebuie plătit pentru a fi leneș în acest sens este greu de supraestimat. Codul Ruby care trebuie să fie prezent în stratul de prezentare trebuie să fie cât mai mic și mai simplu posibil, precum și inteligent organizat. Răsplata dvs. va fi un cod care este o bucurie de extindere și menținere, iar noii membri ai echipei vor avea, de asemenea, un timp mai ușor de a-și împacheta capul în jurul noului codaj. Ca un bonus, designerii ciudați care codifică, de asemenea, nu vor fi supărați și nu vor ascunde alimentele puturoase în salată dacă păstrați tone de cod Ruby din marcajul lor.
Cunoașterea nenumăratelor metode de ajutor în Rails va îmbunătăți semnificativ calitatea stratului de prezentare. Nu numai că va curăța lucrurile și va injecta ocazional creșterea vitezei în productivitate, dar mai important vă ajută să luptați cu PHPitis.
Lucrul pe care ar trebui să-l apreciezi în legătură cu acești ajutoare este că reprezintă reprezentări ale extragerilor din codul obișnuit. În loc să reinventezi roata, atunci când ai dubii, verifică dacă nu există deja un ajutor în jurul care rezolvă problema în vedere - același lucru este valabil și pentru modelele și controlorii, bineînțeles.
Iată o listă de ajutoare pe care ar trebui să le priviți imediat:
form_for
fields_for
LINK_TO
content_for
Să aruncăm o privire form_for
primul. Știu că formele sunt puțin plictisitoare și nu sexy pentru un subiect, dar vă încurajez foarte mult să le citiți pentru a vă familiariza cu detaliile mai fine. Este important să înțelegeți cum funcționează. Îmi amintesc de multe ori doar căutându-le peste ele fără să le acordăm multă atenție. Sigur, îi puteți face să lucreze destul de ușor, fără a înțelege ce se întâmplă sub capotă. În viitor, mi-ar lua timp să scriu un articol complet despre ei. Între timp, vă recomandăm să vă petreceți puțin timp verificând documentația - cel puțin veți aprecia cât de convenabil îl face Rails să se ocupe de chestii de formă.
Exemplul de mai jos vă arată codul HTML al unei mici forme de care avem nevoie pentru a crea agenți. Acceptă numai trei parametri ca intrări: Nume
, număr
și licence_to_kill
. O mulțime de cod pentru această sarcină mică, de fapt. authenticity_token
vine de la Rails - este un lucru de securitate care protejează aplicația de "falsificarea cererii între site-uri".
Scrierea unui formular manual nu este doar lungă, ci și predispusă la erori. De asemenea, dacă am fi abordat-o astfel, ar trebui să rezolvăm problema și cu rutele și clasele variate de CSS care ne-ar putea fi necesare pentru crearea unui obiect nou și pentru actualizarea unui efect existent, ar trebui să duplicăm formulare creați și editați înregistrări. După cum veți vedea în curând, Rails vă întâlnește mai mult de jumătate de vreme. Verdict: cu toate acestea ați pus-o, abordarea manuală este neplăcută și lipsită de confort.
Am putea merge în jos pe următoarea cale, care nu folosește perfect convențiile în Rails. Cu capul în sus, nu o faci. În principiu, arată că nu gestionați instrumentele disponibile în avantajul dvs. și că duplicați formularul nou
și Editați | ×
acţiuni.
<%= form_for :agent, url: agents_path(@agent), html: method: :post do |form_object| %> <%= form_object.label :name %> <%= form_object.text_field :name %> <%= form_object.label :number %> <%= form_object.text_field :number %> <%= form_object.label :licence_to_kill %> <%= form_object.check_box :licence_to_kill %> <%= form_object.submit 'Create New Agent' %> <% end %>
Ce se întâmplă aici este faptul că constructorul de forme poartă modelul de care aveți nevoie pentru formular.
<%= form_object.text_field :name %>
În spatele scenei, linia de mai sus se extinde în următoarele:
<%= text_field :agent, :name %>
form_for
Metoda ia câteva argumente:
URL-ul
hașișhtml
hașișSpațiu de nume
hașișHash-ul url este pentru specificarea opțiunilor de rutare. Asta inseamna ca puteti specifica manual calea de rutare pe care o trimiteti, traseele formate fiind la indemana cu aceasta. Acest stil este numit "mod generic" deoarece trebuie să configurați manual form_for
apel.
De ce este această soluție suboptimală? Pentru că dorim să păstrăm cât mai mult posibil logica de afaceri din vizualizările și controlorii noștri. Un efect secundar al acestui lucru este că trebuie să schimbăm mai puține părți atunci când este necesar.
În cazul în care ați pierdut-o, această abordare nu ne-a furnizat ID-uri și clase pentru formă
etichetă automat. Cei pentru intrare
tag-uri, cu toate acestea, au fost generate pentru tine. O vom rezolva într-un minut. Doar știți ce puteți obține gratuit și că probabil că ar trebui să folosiți acest lucru în avantajul dvs. Dacă aveți nevoie de ceva diferit sau de un spațiu de nume suplimentar, puteți utiliza html
hash sau Spațiu de nume
hash pentru a specifica lucrurile un pic mai mult.
<%= form_for :agent, url: agents_path(@agent), html: method: :post, class: 'create_agent', id: 'unique_agent', namespace: 'mi6' do |form_object| %>
Nu-i rău! Acum formă
tag-ul are clasa specificată și id-orice face fluxul sanguin-și intrare
etichetele sunt asociate cu MI6
. Aproape acolo.
Aceasta se numește "stil orientat spre resurse" și are cea mai mică cantitate de Ruby pe care trebuie să o scrieți în opiniile dvs. Prin această abordare, dorim să ne bazăm pe identificarea automată a resurselor. Rails evaluează ce rute are nevoie pe baza obiectului propriu-zis. Nu numai că, vă oferă o ieșire HTML diferită pentru a crea un obiect nou sau pentru a edita unul existent. În spatele scenei, Rails doar întreabă obiectul dacă există deja și acționează în consecință.
Crearea de formulare în acest mod este o utilizare inteligentă a convențiilor și ajută la evitarea dublei acțiuni. O linie și toată ridicarea grele se face pentru dvs..
<%= form_for @agent do |form_object| %> <%= form_object.label :name %> <%= form_object.text_field :name %> <%= form_object.label :number %> <%= form_object.text_field :number %> <%= form_object.label :licence_to_kill %> <%= form_object.check_box :licence_to_kill %> <%= form_object.submit %> <% end %>
Mult mai bine, nu-i așa? Acum obținem exact ceea ce avem nevoie atât pentru obiecte existente, cât și pentru noi. De asemenea, nu era necesar să adăugăm textul butonului nostru de trimitere. Rails a avut grijă de acest lucru și se adaptează, de asemenea, obiectelor noi sau existente.