..


Link-uri sponsorizate

Polimorfismul şi Tastarea Duck în Ruby

Articolul scris de Alessio Saltarini
Pagina 1 din 2

Polimorfismul este o tehnică de programare care permite utilizarea unor părţi din codul sursă, în timp ce rămânând neschimbate, generează comportamente run-time.

Creaţi cod polimorf are un înţeles specific în cadrul programării orientate-obiect: înseamnă crearea unei taxonomii de clase care punerea în aplicare a tuturor aceeaşi interfaţă.

Deci, dacă, de exemplu, interfata mea defineste o metoda "getArea", fiecare clasă ce va implementa această interfaţă va avea o metodă de "getArea": ​​aceasta ne permite să scriem metode polimorfice, metode care pot schimba algoritmul de executarea lor În funcţie de tipul de obiect care este trecut ca argument.

Polimorfismul în limbile OOP tradiţionale

În Java - dar acelaşi lucru este valabil şi pentru C + +, precum şi orice alte limbi Object Oriented (OO) a finalizat, atunci vom vedea, în schimb, cazul Ruby - de exemplu:






 interfaţă IFormaGeometrica







 {



   



 getArea nule ();







 }









 Triangle public class implementeaza IFormaGeometrica







 {



 



 @ Override



 



 public int getArea ()



 



 {



  



 întoarcere (* this.base this.altezza) / 2;



 



 }







 }



În acest caz, vom defini IFormaGeometrica interfata care prevede că fiecare obiect care "este" o getArea FormaGeometrica va avea o metoda - de exemplu, Triunghiul de clasă, care este un FormaGeometrica, are propria implementare a getArea, care ne permite să scrie un program posibilitatea de a calcula zonele de orice formă geometrică, dacă acest lucru este prezent astăzi în codul şi care vor fi puse în aplicare în viitor, fără a schimba codul sursă original.

De fapt, dacă am scrie un Calculator de clasă:






 Calculator publice finală de clasă







 {





 



 public void principal statică (String [] args)



 



 {



  



 Colectia forme <IFormaGeometrica> =



          



 <IFormaGeometrica> Nou ArrayList ();





  



 forme.add (nou Triunghi ());



  



 forme.add (Piaţa nou ());



  



 forme.add (nou Pentagon ());





  



 pentru (g IFormaGeometrica: formulare)



  



 {



   



 System.out.println (g.calcolaArea ());



  



 }



 



 }







 }



Acest lucru se poate lua ca intrare orice colecţie de forme geometrice, cu condiţia ca fiecare obiect din colecţia IFormaGeometrica implementeaza interfata, şi care are în esenţă, un getArea metodă. Acest Java exemplu este pur academică: în fapt, probabil, în constructorul de fiecare clasă, vom include măsuri de intrare din laturile forme geometrice, apothem, şi aşa mai departe.

Obiectiv este atins: am scris o clasa care poate imprima pe ecran zona de orice formă geometrică. Repet: aceasta este codul care a fost deja pusă în aplicare (ca în cazul de Triangle), dacă este pusă în aplicare în viitor.

Nu numai că în cazul în care punerea în aplicare a zonei de calcul Triunghiul conţinea un bug, pot schimba clasa Triunghiul fără a trebui să rescrie Calculator de clasă. Poate că a fost desfăşurată pe un server care are nevoie pentru a reporni orice schimbare: în acest caz nu are pentru a schimba codul este un avantaj major. Dar altele decât că, aceasta este întotdeauna avantajoasă pentru a limita părţi de cod care "schimbare", pentru că fiecare schimbare aduce cu ea bug-uri potenţial. În schimb, este o practică de programare bine de stiut mereu cu certitudine ceea ce părţi din cod, care rămâne neschimbat.

Ce se întâmplă "în spatele scenei" este că compilatorul se asigură că fiecare obiect în interiorul codul polimorf principala metodă de Calculator clasa implementeaza interfata. În acest fel, se spune că este o expresie folosind metodologia de design prin contract, "contractul este respectat."

Dacă nu, în cazul în care este în "forme" au un obiect de o clasă care nu ne-ar pune în aplicare IFormaGeometrica o eroare la compilare, sau nu reuşeşte să-rula programul, pentru că compilatorul ar observa această greşeală.

Polimorfismul în Ruby

Dar ce se întâmplă în Ruby? Şi "posibile în Ruby, care nu este compilat, dar interpretat limbajul, metodele de scriere polimorfi?

Da, este cu siguranţă posibil, dar există o diferenţă profundă "filosofice" decât limbajele OO şi compilate, care

am putea-l descrie. În programare OO în Java şi clasic, pentru a stabili că un obiect aparţine unui anumit tip de obiecte (de exemplu, pune în aplicare o anumită interfaţă) necesitatea de a obţine în mod explicit obiectul dintr-o clasă părinte: în principiu aveţi nevoie pentru a utiliza tehnici de moştenire (moşteni de către o clasă, o clasă abstractă sau interfata).

Ar fi cum ai spune ca: Pentru a determina dacă aceasta este o raţă în faţa mea, eu iau ADN-ul său şi de studiu în laborator pentru a vedea dacă acesta este de raţă.

În Ruby pe care îl utilizaţi "testul raţă" (test de raţă), inventat de James Riley (a se vedea http://en.wikipedia.org/wiki/Duck_typing ):

în cazul în care merge ca o raţă şi de şarlatani ca o raţă, atunci este o raţă.

(Care, întâmplător este ceea ce face fiecare dintre noi atunci când vede o raţă).

Ce înseamnă acest lucru? Aceasta înseamnă că, în Ruby, şi, mai general în orientat-obiect limbaje de scripting, precum şi Python şi Perl, nu este nevoie să se precizeze interfaţă, nici relaţiile explicită moştenire între clase.

Pur şi simplu interpret "speră" ca programator în cazul în care metoda de paşi un obiect polimorf, care "ar trebui să aibă" un anumit fel, avem de fapt.

În aceeaşi categorie ...
E-Learning
Ruby şi Ruby on Rails (Curs) Ruby şi Ruby on Rails (Curs)
Crearea de aplicatii software si web cu Ruby şi RoR. Incepand de la 39 €.
Link-uri sponsorizate