Arhitectura Aplicarea straturilor conceptuale și modalitățile de utilizare a acestora
Construirea de sisteme foarte complexe, complex și nu, nu este o sarcină banală. Mai mult decât atât, dezvoltarea de complexitate crește direct proporțional cu numărul de dezvoltatori care participă la ea. În aceste condiții, de dezvoltare, făcute să adere la pre-definite reguli, modele și aranjamente, să nu mai vorbim de modele de design, metodologii bine-cunoscut pentru dezvoltarea de software și, în general, principiile OEP.
exemple de aranjamente
Să luăm în considerare, de exemplu, bine-cunoscut cadrul ASP.NET MVC. Dacă ați lucrat cu acest sistem, probabil ați observat că proiectul, care este creat de Visual Studio în dosarul implicit modele. Vizualizări. Controlori. Acesta este primul acord că fiecare tip de fișier (de clasă) este în propriul dosar.
În prima versiune a cadrului de controlere ASP.NET MVC ar putea consta doar în dosarul Controllers. Mai târziu, această limitare.
Esli atunci când în curs de dezvoltare orice metodă controler încercați să creați o metodă și deschideți-l, fără a crea o vizualizare (vizualizare) a acestei metode, sistemul vă va da un mesaj de eroare:
Rețineți că, în cazul în care sistemul a încercat să găsească „pierdut“, prezentarea înainte de a emite un mesaj. Acest comportament este, de asemenea, predeterminat prin acordurile cadrului. În acest caz, regula este că, în cazul în care punctul de vedere (vizualizare) nu se găsesc în folderul Acasă Controller. ar trebui să caute mai întâi în dosarul comun. atunci totul este la fel, dar cu o altă extensie pentru un alt motor de redare (în cazul în care conectarea mai multe motoare de randare de marcare). De fapt, acordurile de acest gen în ASP.NET MVC număr foarte mare. Și cu cât le veți întâlni decât a merge mai adânc în „salbaticia“ ale cadrului.
cadru ASP.NET MVC ca toate cadrele, cel puțin pentru cea mai mare parte, se bazează pe paradigma „pentru un acord konfigruratsii“ (configurație peste convenția).
acord de principiu privind konfigruratsii aplicat, de obicei, în dezvoltarea unor cadre. și reduce numărul de configurare necesare fără pierderea flexibilității.
Esența acestui articol este de a arăta că utilizarea paradigmei menționate mai sus, în ceea ce privește dezvoltarea colectivă poate accelera în mod semnificativ (și simplificarea) procesul de dezvoltare a aplicatiilor, mai ales în cazul în care dezvoltarea de bunuri și servicii ale unui număr mare de dezvoltatori. „Convenția asupra configurației“ se poate rezolva întrebări care de multe ori deșeuri minute prețioase, ore sau chiar zile și săptămâni. De exemplu, de multe ori, se pune întrebarea, cum de a apela clasa, proprietate, metoda, proiectare, soluție variabilă (soluție)? Cât de mulți dezvoltatori, atât de multe opțiuni, în cazul în care nu au fost de acord în prealabil cu regulile de denumire. Și dacă noul dezvoltator a venit la echipa, atunci acesta poate începe să scrie codul corect, fără să știe despre regulile pe care este scris acest cod? Desigur, există un număr foarte mare de instrumente suplimentare (de exemplu, StyleCop), care simplifică sarcina, dar ei sunt lipsiți de putere, în unele cazuri.
Trebuie să recunosc că în fiecare an pentru dezvoltatorii să devină mai complicată din cauza complexității problemelor care rezolvă afacerea. Mai multe sarcini complexe necesită abordări mai integrate în soluția lor. De multe ori nu este suficient pentru a crea o aplicație (sistem de program), de obicei este necesar să se mențină și să dezvolte după lansarea versiunii finale. Și dacă în echipa ta există reguli și acorduri similare, va fi mult mai ușor de a găsi un loc în cod, controlerul corect și metoda. Înțelegerea și regulilor de denumire vă ajută să navigați rapid prin codul.
Un pic de istorie
În creșterea exemplu kachechestve de complexitate, va aduce evolutia modelelor logicii de afaceri care descriu modul în care și în cazul în care ar trebui să fie neobișnuit și logica de afaceri relizovana. Tipare pentru organizarea stratului de afaceri (logica de afaceri), cu trecerea timpului a suferit modificări semnificative, de la simplu la complex. Mai mult decât atât, această evoluție nu a oprit.
Fiecare dintre ele este descrisă în detaliu de către Martin Fowler. așa că nu voi insista asupra ei în detaliu. Evoluția spune că sistemul de programare care manipula datele devine tot mai dificilă. Trebuie înțeles faptul că utilizarea de modele de design pentru construcția arhitecturii sistemelor complexe simplifică foarte mult sistem suplimentar de suport (mentenabilitate) și introducerea de noi funcționalități, dar dezvoltarea este mult mai complicat. Pentru a facilita această evoluție cel mai mult, propun să utilizeze regulile acordului, adică, „Configurarea acordului“, dar în ceea ce privește procesul de cod scris.
Ce pot să spun, dacă nu numai pentru dezvoltatorii, ci și în rândul clienților mai mult și mai des auzim astfel de cuvinte și expresii: ORM. Repository. Business Layer. Abstracție și Dependency Injection, MVVM și altele.
Printre dezvoltatorii merge la o dezbatere de lungă durată asupra faptului dacă să utilizeze un „strat“ suplimentar ORM, cum ar fi între bazele de date și DAL. De exemplu, pe sql.ru sau habrahabr.ru ridicate în mod frecvent subiecte. Leitmotiv în astfel de litigii suna ideea „Pentru proiecte complexe, folosind un ORM reduce in mod semnificativ de rutină.“.
Așa sa întâmplat că de ceva timp m-am oprit pentru a partaja proiecte complexe și simplu, bazat pe utilizarea ORM pentru proiecte de orice complexitate. Mai ales având în vedere că abordarea ORM CodeFirst permite utilizarea (în special, EntityFramework).
Aș sugera că sunteți deja familiarizați cu modele de design. și, în special, cu modele și Repository UnitOfWork. se bazează pe ele, și voi vorbi despre modalitățile de construire stratului de acces la date (date Access Layer). De asemenea, presupunem că aveți o idee de la injectare Dependență.
Folosind modelele nu garantează că codul va fi scris corect.
norme și aranjamente primare pentru denumirea
Nu obosesc de a repeta expresia „totul este inventat pentru noi“, si repeta în acest context. În curs de dezvoltare lume există deja acorduri cu privire la numirea, de exemplu, Microsoft sau aceste alte variante în Wikipedia. Ca bază pentru regulile sale, am luat acordul de la Microsoft. Deci, să începem.
Reguli spațiu de nume de denumire a companiei pentru proiect:
Numele oricărui proiect trebuie să înceapă cu un CompanyName>. Această regulă este valabil și pentru dezvoltarea companiei.
După primele cuvinte CompanyName> prin punctul trebuie să li se dea numele proiectului.
Pentru numele proiectului trebuie să urmeze în mod necesar numele platformei.
După ce a spus porțiune platforma de arhitectura internă a proiectului.
X Nu folosiți subliniere, cratime și alte simboluri.
X Nu folosiți abrevieri și acronime cunoscute în mod obișnuit
X Nu folosiți numere în denumire.
X Evitați utilizarea numelor greu compuse în aceste părți ale naming
Naming variabile:
Utilizați un nume de identificatori care pot fi citite. De exemplu, o proprietate numita HorizontalAlignment este mai intuitiv decât AlignmentHorizontal.
X Nu folosiți subliniere, cratime și alte simboluri.
X Nu folosiți notația maghiară.
X NU folosiți un nume de identificatori care intră în conflict cu cuvinte cheie frecvent utilizate limbaje de programare.
X Nu folosiți abrevieri sau de reducere, ca parte a numelui de identificare. De exemplu, în loc de a folosi GetWindow getwin.
X Nu folosiți acronime care nu sunt acceptate, și chiar dacă acestea sunt, numai atunci când este necesar.
Utilizați nume semnificative semantic în loc de cuvinte rezervate în limba pentru tipurile de nume. De exemplu GetLength un nume mai bun decât getint.
Utilizați numele de tip universal al CLR, și nu numele unui limbaj specific, în cazuri rare, atunci când identificatorul nu are nici un sens semantic dincolo de acest tip. De exemplu, metoda de conversie trebuie să fie numită Int64 ToInt64. în schimb ToLong (ca Int64 - este numele CLR la C # -psevdonim lung). Tabelul de mai jos oferă câteva tipuri de bază de date folosind nume CLR tipuri de mediu (și tipuri de numele corespunzătoare pentru C #, Visual Basic și C ++).
Utilizați nume comune, cum ar fi valoarea sau un element, în loc de scandând numele tipului, în cazuri rare, atunci când identificatorul nu are valoare semantică și tipul parametrului este irelevant.
Exemplele care nu ar trebui să fie folosite atunci când denumiți: namespace
Exemple de denumiri și proiecte spațiul de nume:
Numele soluției (soluție):
Numele proiectelor (proiecte) de tip aparținând nivelului de abstractizare:
Nivelul Rezumat Data Access Layer
Deci, în proiectele lor, folosesc următoarele niveluri de abstractizare la nivelul de logica de afaceri:
Acestea sunt conceptele de bază pentru cele mai multe proiecte, dar trebuie să recunoaștem că au existat proiecte care au avut de a adăuga niveluri mai ridicate ale nivelului de manager. Acum primele lucruri mai întâi. Să luăm pentru o mai mare claritate, natura specifică și va face pentru ei din clasele wrapper pentru nivelul de afaceri. Să presupunem că avem în proiectul are, în esență, categorie. Mesaj. Tag. Comentariu. Se pare ca natura pentru punerea în aplicare a unui blog? Așa este.
depozit
Sper să citiți descrierea imaginii pentru Repository, dar voi explica faptul că operațiunile de bază sunt: citirea bazei de date listă, citind dintr-o bază de date o singură entitate pe identificatorul, se introduce o nouă intrare în baza de date, edita intrările existente în baza, eliminând intrările. Unele Repository pot avea metode suplimentare, de exemplu, metoda Clear pentru LogRepository depozit. Deci, pentru fiecare dintre aceste entități creează un depozit: CategoryRepository. PostRepository. TagRepository. CommentRepository.
Reguli pentru Repository Naming: numele esenței la singular, înainte de cuvântul Repository.
Această abordare permite-mi să fie moștenit de la una sau doua clasă abstractă de punere în aplicare de acces bazat pe rol la esența fazei de dezvoltare. Deci, avem deja patru clase, care pot controla (CRUD) fiecare din esența sa.
Următorul în ierarhia nivelurilor de logica de afaceri, acces la date este un furnizor. Vorbind despre asta, voi da un exemplu al relației dintre entitățile Tag și post. Să presupunem că sunt necesare eticheta (tag-ul) asociat cu intrarea pe blog (post) pe „mulți-la-mulți“ și tag-ul pentru intrările blog. Deci, se pare că atunci când adăugați o intrare de blog, va trebui să se ocupe cumva etichetele (tag-uri). Această funcționalitate este supusă Unitatea model de lucru. care gestionează la nivel central de mai multe entități. Astfel, PostProvider implementează parțial Unitate de model de lucru.
denumire regulă furnizor: numele entității specificate la singular, înainte de cuvântul Provider.
Performanță prin injecție de dependență pentru a lua designer de Repository. Furnizorii de Ie gestionează arhive. Astfel, am ajuns la prima injecție de regula Dependență pentru nivelurile Layer acces la date.
Regula Dependență Injecție: Constructorul Furnizorul de clasă se pot alătura ca dependențe obiecte de Repository.
Am uitat să menționez că în clasele Repository trebuie să se alăture DbContext (EntityFramework) sau reprezentant al abstract.
Regula Dependență Injecție: Clasele Repository se pot alătura DbContext (EntityFramework) sau abstractizare pentru această clasă.
Regula Dependență Injecție: Managerul poate alătura clase ca dependențe obiecte de furnizor.
Punctul-cheie în acest exemplu este faptul că fiecare dintre nivelurile de mai sus de abstractizare pune în aplicare propria funcționalitate, care urmează să fie extinsă în cazul în care este necesar. Acesta a construit un fel de piramidă de entități de management. De la o operațiuni „mici“ din Magazia de la o „mare“ în Manager. Mai mult decât atât, „dimensiunea“ a operațiunii depinde de numărul de entități pe care le afectează.
controlor
Vorbind de ASP.NET MVC să nu mai vorbim de controlori, care constituie baza în cadrul, în jurul căruia este construit întreaga infrastructură. In MVC-controller (API-controler de asemenea) tipuri pot fi turnate în funcție Repository. Provider. Managerul.
Regula Dependență Injecție: Managerul poate alătura, de asemenea, clase ca dependențe obiecte de Repository.
Am act de faptul că, în bolshestve cazuri, operațiunile pe care le va fi chemat de la operator trebuie să nahoditcya la furnizor și la nivel Manager. pentru că aceste două niveluri puse în aplicare în comun de unitatea de lucru. și funcționarea Depozitului sunt de multe ori nu sunt implicate în procesele de afaceri ale unei aplicații „mari“.
denumire regulă pentru controler: numele entității specificate la plural la cuvântul controler.
De asemenea, este demn de menționat faptul că, de obicei, în aplicații ale proceselor de business existente, care nu sunt legate de o anumită entitate. De exemplu, atunci când plasarea unei comenzi de a cumpăra un produs, pe care doriți să trimiteți un mesaj la managerul sau notificarea prin conturi de e-mail. Pentru a pune în aplicare această funcționalitate, am crea EmailService. pune în aplicare trimiterea unui mesaj prin e-mail.
Regula Dependență Injecție: Clasele Repository, Provider, Managerul de servicii se pot alătura obiecte.
concluzie
Modelul prezentat de logica de afaceri si ierarhie a dependențelor verificate automat folosind un recipient de injectare Dependență, deoarece prezența ciclicității în dependențele, va primi o eroare dintr-o dată (cel mult în timpul rulării).
De asemenea, trebuie remarcat faptul că cele trei niveluri de abstractizare oferă ample posibilități de a alege locul de realizare a metodelor proceselor de afaceri, ca să spunem așa, logica de afaceri distribuite. Dar decizia cu privire la ce nivel să pună în aplicare procese de business specifice pe care trebuie să decidă pe cont propriu, pentru că totul depinde de obiectivele pe care le-ați stabilit pentru tine. Dar, în cazuri extreme, se poate solicita, iar arhitectul sistemului. )
ASP.NET MVC: Optimizarea de link-uri de pe site-ul web sau SEO prietenos MVC
Aplicația WPF MVVM cu privire la utilizarea PRISM 6 și Autofac