10. Minimizați datele globale și partajate
Schimbul provoacă controverse și conflicte. Evitați partajarea datelor, în special a datelor globale. Datele partajate consolidează conectivitatea, ceea ce duce la o scădere a acompaniamentului și adesea la performanță.
discuție
Această declarație este mai generală decât cerința mai restrânsă a recomandării 18.
Datele cu legare externă în domeniul de aplicare al spațiului de nume sau al membrilor statici ai clasei ar trebui evitate. Aplicația lor complică logica programului și duce la o legătură strânsă între diversele (și, mai rău, îndepărtate) părți ale programului. date comune fac unitate de testare mai puțin eficace, deoarece corectitudinea fragmentului de cod care utilizează datele partajate, datorită istoricul modificărilor aduse datelor, și, în plus, determină funcționarea unora, încă necunoscute, codul care va utiliza datele mai târziu.
Numele obiectelor din spațiul de nume global duc la blocarea suplimentară a acestora.
Dacă nu puteți face fără obiecte globale, obiecte din domeniul de aplicare al spațiului de nume sau al membrilor din clasa statică, asigurați-vă că sunt inițializați corect. Ordinea inițializării unor astfel de obiecte din diferite unități de compilare nu este definită, prin urmare sunt necesare proceduri speciale pentru funcționarea corectă (vezi legăturile atașate). Regulile ordinii de inițiere sunt destul de complicate, deci este mai bine să le eviți; dar dacă sunteți în continuare forțat să vă ocupați de ele, ar trebui să le studiați bine și să le folosiți cu cea mai mare atenție.
Obiectele care se află în domeniul de aplicare spațiile de nume statice și împărtășite de către diferite fire sau procese pentru a reduce nivelul de medii paralelizarea multithread și multiprocesor, și sunt de multe ori o strangulare în termeni de performanță și scalabilitate (a se vedea. Recomandarea 7). Încearcă să scapi de schimbul de date; Utilizați în locul lor mijloacele de comunicare (de exemplu, coada de mesaje).
Este de preferat să se asigure o conectivitate scăzută și să se minimizeze interacțiunea dintre clase.
excepții
Un astfel de nivel de instrumente de program ca cin. cout și cerr. Acestea sunt specializate și implementate într-un mod special. Fabrica trebuie să mențină funcțiile registrului, care trebuie să fie chemat pentru a crea acest tip, iar un astfel de registru este de obicei un program întreg (cu toate acestea, de preferat ca acesta să fie un obiect intern în legătură cu o fabrică și nu un obiect la nivel mondial în comun, a se vedea punctul 11). .
Codul în care un obiect este partajat de diferite fire trebuie să furnizeze serializarea accesului la un astfel de obiect.
11. Ascunderea informațiilor
Nu eliberați informații interioare în afara obiectului care furnizează abstractizarea.
discuție
Pentru a minimiza dependențele dintre codul de apel care funcționează cu abstractizarea și implementarea abstractizării, datele interne ale unei astfel de implementări trebuie să fie ascunse. În caz contrar, apelantul poate avea acces la aceste informații (sau, mai rău, să-l schimbe), iar această scurgere este destinată doar pentru uz intern de informații face apelantului în funcție de reprezentarea internă a abstractizare. Ar trebui să deschideți abstracțiile (de preferință din domeniul relevant, dar cel puțin obțineți / setați abstractizarea), nu date.
Ascunderea informațiilor reduce costul proiectului, timpul de dezvoltare și / sau riscul în două moduri principale.
Localizează schimbările. Ascunderea informațiilor reduce zona "efectului de undă" al modificării introduse și, prin urmare, costul acesteia.
El întărește invarianții. Ascunderea informațiilor restricționează codul responsabil pentru salvarea (și, în caz de eroare, a încălcării) invarianților programului (a se vedea recomandarea 41).
Nu permiteți ca datele de pe orice obiect care oferă o abstracție să "lumineze" (a se vedea și recomandarea 10). Datele - doar una din variantele de abstractizare, o stare conceptuală. Dacă se concentreze pe conceptul, mai degrabă decât reprezentarea sa, va fi capabil să ofere o interfață grijuliu și „ling“ punerea în aplicare poate fi și mai târziu - de exemplu, prin aplicarea cache în loc de calcul „din zbor“, sau utilizarea unor reprezentări diferite de optimizare (de exemplu, coordonatele polare în schimb cartezian).
Un exemplu comun este faptul că membrii de date de clasă nu sunt niciodată disponibili extern utilizând specificatorul public (a se vedea recomandarea 41) sau prin indicatori sau descriptori (a se vedea recomandarea 42). Acest principiu se aplică și entităților mari, de exemplu, cum ar fi bibliotecile, care, de asemenea, nu trebuie să permită accesul la informații interne din exterior. Modulele și bibliotecile trebuie să furnizeze interfețe care să definească și să lucreze cu abstracțiile, oferind astfel o mai mare securitate pentru codul de apelare și o conectivitate mai mică decât atunci când utilizează date partajate.
excepții
Testarea codului necesită adesea posibilitatea de a accesa "interiorul" clasei sau modulului testat.
Set de valori (struct în C-stil), care este un simplu set de date, fără a oferi nici un abstractii nu necesită ascunderea datelor lor, care în acest caz sunt interfața (a se vedea alin. 41 din recomandare).