..


Sponzorirani linkovi

Polimorfizma i patke Typing u Ruby

Članak napisao Alessio Saltarini
Stranica 1 od 2

Polimorfizam programiranje tehnika koja omogućuje korištenje dijelova izvornog koda koji, dok se preostalih nepromijenjene, generirati run-time ponašanja.

Napravite polimorfne kod je specifično značenje u objektno-orijentirano programiranje: znači stvaranje taksonomija nastave da svi implementirati isto sučelje.

(Članak nastavlja se u nastavku ...)

Dakle, ako, na primjer, moje sučelje definira metoda "getArea", svaki razred koji će implementirati ovo sučelje će imati metoda "getArea": ​​To nam omogućuje da pisati polimorfne metode, metode koje se mogu promijeniti svoj algoritam izvršenje Ovisno o vrsti objekta koji je prošao kao argument.

Polimorfizam u tradicionalnim OOP jezicima

U Java - ali isto vrijedi i za C + + i bilo koji drugi jezik Objektno orijentirano (OO) završi, onda ćemo vidjeti umjesto slučaju Ruby - primjer:






 sučelje IFormaGeometrica







 {



   



 getArea void ();







 }









 public class Trokut provodi IFormaGeometrica







 {



 



 @ Override



 



 javni int getArea ()



 



 {



  



 vratiti (* this.base this.altezza) / 2;



 



 }







 }



U tom slučaju ćemo definirati sučelja IFormaGeometrica u kojem se navodi da svaki objekt koji "je" FormaGeometrica getArea će imati način - na primjer, klasa trokut, koji je FormaGeometrica, ima svoju primjenu getArea, što nam omogućava pisanje programa u stanju izračunati područja bilo geometrijskih oblika, da li je to danas nazočan u kodu i da će se provoditi u budućnosti, bez mijenjanja izvornog koda.

U stvari, ako pišem klasa Kalkulator:






 javni završni razred Kalkulator







 {





 



 public static void main (String [] args)



 



 {



  



 Zbirka obrazaca <IFormaGeometrica> =



          



 <IFormaGeometrica> Novi ArrayList ();





  



 forme.add (novi Trokut ());



  



 forme.add (novi trg ());



  



 forme.add (novi Pentagona ());





  



 za (g IFormaGeometrica: oblici)



  



 {



   



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



  



 }



 



 }







 }



To se može uzeti kao ulaz bilo koja kolekcija geometrijskih oblika, pod uvjetom da svaki objekt u zbirci IFormaGeometrica implementira sučelje, te da je bitno metodu getArea. Ovaj primjer Java je isključivo akademska: u stvari, vjerojatno u konstruktora svake klase, što uključuje unos mjere strane geometrijskih oblika, apothem, i tako dalje.

Cilj je postignut: mi napisao klasa koji može print screen područje bilo geometrijskih oblika. Ponavljam: to je kod koji je već implementiran (kao u slučaju trokut), bilo da se provodi u budućnosti.

Ne samo da, ako provedba proračuna trokut prostor sadrži bug, ja mogu promijeniti klasu trokut bez prepisati klase Kalkulator. Možda je to bila razmještene na poslužitelju koji treba ponovo pokrenuti bilo kakve promjene: u ovom slučaju ne mora mijenjati kod je velika prednost. No, osim toga, to je uvijek povoljan ograničiti dijelove koda da je "promjena", jer svaka promjena donosi sa sobom potencijalne greške. Isto tako, dobro je programiranje praksa da se uvijek zna sa sigurnošću koje dijelove koda koji ostaje nepromijenjen.

Što se događa "iza kulisa" je da je prevodilac osigurava da svaki objekt unutar polimorfne kod glavnih metoda klase Kalkulator implementira sučelje. Na taj način, on je rekao je izraz koristi metodologiju dizajna na temelju ugovora, "ugovor poštuje."

Ako ne, ako je to u "oblicima" imaju objekt klase koja ne bismo provesti IFormaGeometrica pogreške u vrijeme prevođenja, ili ne uspijeva pokrenuti program, jer je prevodilac će obavijest o pogrešci.

Polimorfizam u Ruby

Ali što se događa u Ruby? A 'moguće u Ruby, koji se ne sastavlja, ali tumačiti jezik, pisanje polimorfne metode?

Da, to je svakako moguće, ali postoji duboka razlika "filozofski" od OO jezika i sastavio, koji

mogli bismo ga opisati. U OO programiranje u Java i klasik, kako bi se utvrdilo da objekt pripada određenoj vrsti predmeta (tj. implementira sučelje određeni) treba eksplicitno izvući objekt iz klase roditelja: u osnovi trebate koristiti tehnike baštine (naslijediti po razredu, apstraktne klase ili sučelje).

To bi bilo kao što je rekao: Da biste utvrdili je li to patka ispred mene, ja se njegov DNA i studije u laboratoriju kako bi vidjeli ako je to patka.

U Ruby koristite "patka test" (patka test) izumio James Riley (vidi http://en.wikipedia.org/wiki/Duck_typing ):

ako hoda kao patka i quacks kao patka, onda je to patka.

(Koji usput je ono što čini svaki od nas kad vidi patka).

Što to znači? To znači da u Ruby, i općenito u objektno-orijentirana skriptiranje jezika, kao i Python i Perl, nema potrebe da navedete sučelje, ni eksplicitno nasljedstva odnosi između klasa.

Jednostavno tumač "vjeruje" da je programer, ako metoda koraka polimorfni objekt koji "treba imati" određeni način, mi zapravo.

U istoj kategoriji ...
E-učenje
Tečaj Ruby i Ruby On šina Tečaj Ruby i Ruby On šina
Izrada softvera i web aplikacija uz Ruby i ROR. Popust -10% do 2012/06/01.
Sponzorirani linkovi