Ce înseamnă „contract” al unei clase (Programare, Java, Moștenire)

Leem.fin a intrebat.

Citesc cartea Limbajul de programare Java. În capitolul în care se explică suprascrierea metode, se spune:

A face o metodă de suprascriere (în subclasă) mai puțin accesibilă decât era în superclasă ar încălca contractul superclasei …

Textul în ansamblu este de înțeles. Singura mea întrebare este ce înseamnă contractul superclasei? Ce înseamnă contract înseamnă pentru un Java clasă Java?

Comentarii

8 răspunsuri
David

Un contract într-o clasă Java este similar cu un contract în lumea reală – În termeni non-tehnici:

Este un acord conform căruia clasa va expune anumite metode, anumite proprietăți și anumite comportamente.

În termeni mai tehnici, din aici: (bold adăugat de mine)

Nu ar fi frumos dacă toate clasele Java pe care le folosiți, inclusiv cele proprii, și-ar respecta promisiunile? De fapt, nu ar fi frumos dacă ați ști exact ce promite o anumită clasă? Dacă sunteți de acord, citiți mai departe […]

Proiectarea prin contract

Tehnica de dezvoltare a software-ului „Design by Contract” (DBC) asigură un software de înaltă calitate prin garantarea faptului că fiecare componentă a unui sistem se ridică la nivelul așteptărilor sale. În calitate de dezvoltator care utilizează DBC, specificați contractele componentelor ca parte a interfeței componentei. Contractul specifică ce așteaptă componenta respectivă de la clienți și ce pot aștepta clienții de la ea.

Comentarii

  • Există vreo diferență între un contract și specificații? Se pare că un contract este doar un termen umanizat pentru specificații, deoarece oamenii sunt de acord cu contractele, dar mașinile și procesele sunt construite în funcție de specificații. (Cel puțin, în interpretarea mea a limbii engleze).  > Por Buttons840.
  • „Specificație” poate fi interpretat ca fiind detaliile implementării, adică metodele și proprietățile protejate și private. „Contract” înseamnă de fapt doar metodele și proprietățile publice. –  > Por dgvid.
  • Eu mă gândesc la asta în felul următor: În cadrul unui proiect de software, în care angajați un furnizor, există un contract pentru lucrările care urmează să fie efectuate (de obicei destul de general) și (sperăm) un document privind cerințele specifice care este mai detaliat. Specificația este mai apropiată de documentul privind cerințele, în sensul că implementează contractul, cu detalii specifice privind modul în care se realizează acest lucru. –  > Por David.
Victor Sorokin

Contractul de tip (clasă, interfață, enum) este, ei bine, contractul pe care acest tip promite să îl respecte. Acesta prevede următoarele:

  • care sunt parametrii acceptabili pentru constructorul și/sau metodele acestui tip;
  • ceea ce ar trebui și/sau nu ar trebui să se aștepte ca acest tip să facă. De exemplu, se poate preciza că trebuie să vă așteptați ca această clasă să fie sau să nu fie thread-safe;
  • care sunt invariantele acceptate de acest tip. De exemplu, metoda de tip addData(float) din MathAverage care calculează media intrărilor sale poate preciza că, de fiecare dată când se apelează metoda add(float) este returnat, trebuie să vă așteptați ca apelul la MathAverage.getAverage() să returneze media corectă a intrării curente.
  • În general, tipul dumneavoastră poate specifica orice constrângere pe care toate subtipurile sale trebuie să o respecte. De exemplu, se poate spune „nicio metodă din acest tip nu trebuie să dureze mai mult de 1 secundă pentru a se executa”.

Contractul este specificat în formă liberă în javadocul tipului. Există unele instrumente/practici pentru a impune executarea contractelor, dar acestea sunt limitate, tocmai pentru că contractul poate fi arbitrar sau chiar contradictoriu, în cazul unei erori a programatorului.

Deoarece subtiparea (subclasarea) poate extinde/modifica comportamentul metodelor supertipului în mod arbitrar, aceasta poate, de asemenea, să încalce unele părți ale contractului supertipului. Un exemplu în acest sens ar fi extinderea HashMap, care acceptă null valori și chei, cu o implementare care interzice null valorile în apelurile către metodele sale.

Un alt aspect important al contractului de tip este faptul că subtipul poate avea mai puternice contract mai puternic (care acoperă un subset de constrângeri din contractul tipului), dar nu poate avea mai slab contract (care acoperă un supraansamblu de constrângeri din contractul tipului).De exemplu, dacă metoda tipului dvs. „doX(n)” promite să ia O(n) timp (liniar), „doX(n)” din subtip poate dura O(1) timp (constant), dar nu poate dura O(n^2) timp.

jontro

Înseamnă că o metodă care suprascrie o metodă dintr-o clasă părinte sau o interfață trebuie să se comporte în modul în care este definit în contract.

În caz contrar, rezultatul este nedefinit.

cdeszaq

„Contractul” unei clase este interfața publică a acesteia sau cel puțin interfața pe care o prezintă altor clase decât ea însăși.

Aceasta înseamnă că include orice elemente (metode, câmpuri, constructori etc.) care alte clase pot utiliza.

Mansuro

Există multe principii pe care ar trebui să le respectați atunci când programați în java sau în orice alt limbaj de programare. Principiile depind de limbajul de programare pe care îl utilizați. Puteți afla mai multe despre contracte în Proiectarea prin contract pagina wikipedia

sum2000

în termeni simpli, înseamnă că ați încălca condițiile superclasei dacă ați face codul de suprascriere mai puțin accesibil.

Pops

Este o expresie care provine din ideea de contracte în „lumea reală”.

Practic, dacă vă rupeți contractul cu o clasă, atunci aceasta nu este obligată să se comporte așa cum v-ați aștepta. Din cealaltă direcție, este o promisiune a clasei că, dacă respectați regulile pe care le stabilește, se va comporta așa cum spune API-ul său.

Un exemplu obișnuit de contract în Java este suprapunerea clasei equals() atunci când hashCode() este suprascrisă. Două obiecte care sunt considerate egale trebuie, prin contract, să aibă același cod hash. Este posibil să scrieți un cod corect din punct de vedere sintactic care să nu respecte acest lucru, dar s-ar putea să nu funcționeze corect, iar acest lucru este vina programatorului care a încălcat contractul.

dgvid

Contractul unei clase sau al unei interfețe, în Java sau în orice alt limbaj OO, se referă în general la metodele (sau funcțiile) și proprietățile (sau câmpurile sau atributele) expuse public ale acelei clase sau interfețe. împreună cu orice comentarii sau documentație care se aplică la aceste metode și proprietăți publice.

În cazul relației dintre o clasă și o subclasă, orice metode sau proprietăți protejate sunt considerate „expuse public”, în sensul că sunt expuse subclasei.