De ce am nevoie pentru a îngloba ce variază overflow stivă în limba rusă

Incapsuleaza ce se schimbă. necesară, deoarece economisește timp și efort pentru a schimba acest lucru depinde de ceea ce poate fi schimbat.

Un exemplu practic

Pe baza faptului că sub incapsularea variabilă este în general înțeleasă în sensul de abstractizare pentru a ascunde un principiu de funcționare specific, este posibil să se ofere exemplul următor.

Proiectați un cont bancar obiect, care lucrează acum cu aceeași bază de date. Dacă ne imaginăm că obiectul de cont poate fi operat cu o bază de date complet diferite (sau fișiere text), apoi, dacă sunt doar de stabilire pe ea în proiectarea interfeței obiectului, nu trebuie să rescrie codul. care utilizează un cont obiect.

În cazul în considerare modificările de echilibru cauzate de metoda, inclusiv parametrii care conțin numai suma și justificarea, obiectul de utilizator va fi absolut nici o nevoie să știe ce fel de baze de date accesează obiectul de cont pentru a salva modificările.

De exemplu, această funcție, nu există nici o diferență dacă îl utilizați trecut printr-un fel de baze de date sau fișiere - face diferența într-un cont este încapsulat:

addToAccount funcție va funcționa la fel de bine cu atat instanta a clasei de cont. și o instanță a DatabaseAccount clasă:

Un design unic clasa de interfață de cont puteți schimba în mod arbitrar principiile de păstrare a datelor în cadrul contului fără a fi nevoie de a schimba ceva în clasă, folosind clasa de cont.

De ce altceva ar putea fi necesar?

În plus față de confortul modificărilor ulterioare ar trebui să ia în considerare factorul de încărcare cognitivă pe programator. Și abstractizare, precum și reținerea de informații permit să reducă. De exemplu, pentru a folosi același cont pentru obiectul programator nu are nevoie să se gândească la baza de date sau cu privire la manipularea manuală a excepțiilor. Încapsularea face irelevantă detaliile specifice pe care programatorul nu are nevoie să se schimbe, în cazul ideal, eliminând complet nevoia de a se gândească la ele.

Prin intermediul încapsulează o entitate este creat cu comportamentul cunoscut (interfață externă). În același timp, toate informațiile necesare pentru „funcționare“ a esenței conținute în ea, de asemenea.

Ie a făcut separarea interfeței și punerea în aplicare. Se presupune că interfața va fi stabilă (care nu fac obiectul unor schimbări frecvente), precum și punerea în aplicare pot suferi modificări frecvente. Fără încapsulare, se poate face numai cu funcții (comportament), dar nu a entităților (clase).

Cu un design adecvat al interfeței este doar o parte dintr-o clasă fără ipoteze cu privire la punerea sa în aplicare internă. Din cauza acestei schimbări în vânzări (chiar radicale) unei clase nu afectează cealaltă, ceea ce face mai ușor pentru a schimba programele procesului și o face mai puțin predispuse la erori.

De exemplu, direcția sistemului de control al vehiculului pentru conducătorul auto constă dintr-o roată, a cărui rotație conduce la o rotație a roților (interfața). În acest caz, sistemul în sine poate fi realizat în diferite moduri și din diferite componente (cremalierei de direcție, trapez, etc. - implementare). Cu toate acestea, din cauza încapsulării cu separarea vehiculelor de interfață și de schimbare de direcție de punere în aplicare cu punctul de vedere, nu există practic invizibil pentru șoferi.

În general, ideea de încapsulare este bine ilustrată (și se pare că a ieșit) conceptul de tipuri de date abstracte (puteți citi, de exemplu, Aho, Hopcroft, Ullman. Structuri de date și algoritmi). De exemplu, există o stivă de metode (interfață) împinge și pop. În acest caz, punerea în aplicare stiva poate fi orice, dar în termeni de interfață nu există nici o diferență. Înainte de apariția de sprijin pentru acest concept în limbaje de programare, pentru a realiza încapsulare a avut el însuși, care impune cerințe pentru auto-disciplina. Dar, atunci, acest concept a fost aprobat de nivelul constructelor limbaj de programare. Această diferență poate fi văzută bine în C și C ++ limbile înrudite.

Răspuns 7 '16 martie, la 10:37

Incapsuleaza ce variază - incapsuleaza ce se va schimba
P.S. Încapsula cuvântul nu este în valoare literalmente înțeles ca principiu al OEP.

Unul dintre principiile de bază de proiectare aplicare, a analizat mai multe cărți despre modele de design, cum ar fi acesta este primul în Patterns O'Reilly primul cap de design.

Ideea este că, atunci când scrierea de cod pentru a localiza că, în viitor, poate fi complicat / schimbare, datorită noilor cerințe că aceste modificări nu au afectat alte părți ale cererii. De obicei, interfețele sunt folosite pentru acest lucru, clase abstracte și metode șablon.

Cel mai simplu exemplu - dacă faci rațe simulator, nu trebuie să piuie () metoda este implementată în Duck clasa de baza, deoarece rața de cauciuc nu este quacking. Desigur, se poate spune că această metodă poate fi înlocuită pe un ciot gol pentru rațe de cauciuc, dar pot exista altele nu rațe quacking. Ideea este de a anticipa partea schimbare în aplicarea (punerea în aplicare a unui vraci) și localizați-l de restul cererii (în carte este utilizarea strategiei de model).

Răspuns 7 '16 martie, la 22:12

În acest fel puteți separa interfața obiectului de la punerea sa în aplicare. De exemplu:

Interfețele de export sunt utilizate pe scară largă, de exemplu, în Windows în tehnologia COM (Component Object Model), care a înlocuit OLE (Object Linking and Embedding).

Atunci când este utilizat împreună, obiectele create în interiorul DLL, și utilizat în codul de aplicație, este important ca obiectul a fost șters din memoria timpului - adică, atunci când nu mai este necesară, și nu mai târziu și nu înainte. În acest scop interfață funcțiile de numărare de referință.

Biblioteca exportă o funcție de cererea sa de interfață UUID - identificatorul unic al interfeței.

Clientul solicită interfața, să-l și solicită funcția AddRef (), prin creșterea numărului de referință de către unul. Atunci când interfața nu mai este necesară, clientul apelează funcția de deblocare (), care reduce numărul de referință de unul. În cazul în care numărul de referință devine zero, funcția de eliberare () elimină obiectul creat-COM.

Răspuns 8 martie '16 la 09:51

Încapsularea este necesară în primul rând, în scopul de a ascunde detaliile de implementare pe care nimeni nu ar trebui să știe. De exemplu, ia în considerare o clasă de unele analizator abstracte:

Când scrieți o clasă, ne-am ascuns cea mai mare parte lucrează în cabinete private, lăsând doar un singur public. De ce am făcut acest lucru, pentru că a fost posibil să se facă publice toate metodele? - dacă am făcut toate metodele publice, clasa noastră nu ar fi protejate de utilizarea greșită, care ar putea duce cu ușurință într-o eroare.

Sootvetsvteno, utilizarea de încapsulare ajută la protejarea datelor obiectului eventualelor erori care pot apărea cu acces direct la date.

Răspuns 6 martie '16 la 18:04

Toți ai dreptate, pur și simplu nu răspunde la această întrebare. TC întrebam de ce ai nevoie pentru a îngloba logica, care este supusă unor modificări frecvente. - Dmitriy Simushev 06 martie '16 la 18:19

Pentru a interfață cu logica variabilă continuu a rămas același și, în consecință, menține compatibilitatea cu restul codului de aplicare. Cred că ceva de genul asta. - S. Pronin Mar 6 '16 la 19:03

Cine este și ce să se ascundă? Poate doar o încercare patetică de govnokod sub licențiere covor Co matura? Deoarece Decompilare și refkleshen nimeni să se ascundă pentru o lungă perioadă de timp nu se poate. Și prin ascunderea punerea în aplicare a fost întotdeauna înțeles pentru a minimiza dependențele. care se realizează printr-un număr mic de metode publice. și mai târziu, și un subset al acestora, care aduce în interfețele. - Webaib 07 martie '16 la 12:42