..


Sponsrade länkar

Polymorfism och Duck skriva i Ruby

Artikel skriven av Alessio Saltarini
Sidan 1 av 2

Den polymorfism är en programmeringsteknik som tillåter användning av delar av källkoden, samtidigt som den är oförändrad, för att skapa run-time beteenden.

Skapa polymorfa koden har en viss betydelse i objektorienterad programmering: det innebär att skapa en taxonomi av alla klasser som implementerar ett gränssnitt.

Så om till exempel definierar min gränssnitt metod "getArea", varje klass som ska implementera det här gränssnittet kommer att ha en metod "getArea": ​​detta ger oss möjlighet att skriva polymorfa metoder, metoder som kan förändra sin algoritm utförande Beroende på vilken typ av objekt som skickas som ett argument.

Polymorfism i den traditionella OOP språk

I Java - men detsamma gäller för C + + och andra språk, objektorienterad (OO) är färdigt kommer vi sedan handen vid Ruby - till exempel:






 gränssnitt IFormaGeometrica







 {



   



 void getArea ();







 }









 public class Triangle implementerar IFormaGeometrica







 {



 



 @ Åsidosätt



 



 public int getArea ()



 



 {



  



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



 



 }







 }



I det här fallet definierar vi det gränssnitt IFormaGeometrica som säger att varje objekt som "är" en FormaGeometrica getArea kommer att ha en metod - som triangeln klassen, som är en FormaGeometrica, har sin egen tillämpning av getArea, som tillåter oss att skriva ett program kunna beräkna ytan för varje geometrisk form, även som nu finns i koden och som kommer att genomföras i framtiden, utan att ändra den ursprungliga källkoden.

Faktum är att om jag skriver en klass Calculator:






 public final class Calculator







 {





 



 public void main (String [] args)



 



 {



  



 Formulär för insamling <IFormaGeometrica> =



          



 <IFormaGeometrica> Nytt ArrayList ();





  



 forme.add (nytt Triangle ());



  



 forme.add (nytt torg ());



  



 forme.add (nytt Pentagon ());





  



 för (IFormaGeometrica g: form)



  



 {



   



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



  



 }



 



 }







 }



Detta kan ta som indata någon samling av geometriska former, förutsatt att varje föremål i samlingen måste implementera gränssnittet IFormaGeometrica, och det har i huvudsak en metod getArea. Detta exempel i Java är rent akademisk: i själva verket förmodligen i konstruktorn i varje klass kommer vi bland annat in mått på sidorna av geometrisk form, det sneda, och så vidare.

Målet är uppnått: vi skrev en klass som kan skriva ut till video ytan för de geometriska form. Jag upprepar: detta är den kod som redan har genomförts (som i fallet med triangeln), som genomförs i framtiden.

Inte bara: om genomförandet av beräkningen av Triangle området innehöll en bugg, kan jag byta klass utan att behöva skriva om Calculator klassen Triangle. Kanske det var utplacerade på en server som måste startas om varje förändring: i detta fall inte att behöva ändra koden är en stor fördel. Men än är det alltid fördelaktigt att begränsa delar av kod som "förändring" eftersom varje förändring för med sig potentiella buggar. Omvänt är det en god programmeringsvana att alltid med säkerhet veta vilka delar av koden som förblir oförändrade.

Vad som händer "bakom kulisserna" är att kompilatorn ser till att alla objekt i polymorfa koden för den huvudsakliga metoden i klassen Calculator implementerar gränssnittet. På detta sätt, de säger är ett uttryck enligt den metod för design genom avtal, "avtalet respekteras."

Om inte, om det är i "form" har ett objekt av en klass som vi inte skulle genomföra IFormaGeometrica ett fel vid kompileringen, eller inte klarar av att köra programmet, eftersom kompilatorn skulle märka felet.

Den polymorfism i Ruby

Men vad händer i Ruby? Och "möjligt i Ruby, som inte kompileras, men tolkat språk, skrivande polymorfa metoder?

Ja, det är säkert möjligt, men det finns en stor skillnad "filosofisk" än OO språk och sammanställas, vilket

vi skulle kunna beskriva det. OO-programmering i Java och klassiska, att fastställa att ett objekt tillhör en viss typ av objekt (som implementerar ett visst gränssnitt) behov av att uttryckligen motsätta sig komma från en förälder klass: i grunden du behöver använda de metoder för arv (ärva av en klass, en abstrakt klass eller ett gränssnitt).

Det skulle vara som att säga: För att avgöra om detta är en anka framför mig, tar jag hans DNA och studera i laboratoriet för att se om det är att ducka.

I Ruby du använder "anka test" (anka test) som uppfanns av James Riley (se http://en.wikipedia.org/wiki/Duck_typing ):

Om det går som en anka och kvackar som en anka, då är det en anka.

(Som för övrigt är det som gör oss alla när han ser en anka).

Vad innebär det? Det innebär att i Ruby, och mer allmänt i objektorienterad skriptspråk samt Python och Perl, behöver inte ange gränssnittet, varken uttryckliga relationer arv mellan klasser.

Tolken helt enkelt "förtroende" som programmerare, steg metoden när en polymorfa objekt som "bör ha" ett visst sätt, vi faktiskt har.

I samma kategori ...
E-Learning
Ruby och Ruby on Rails (kurs) Ruby och Ruby on Rails (kurs)
Skapa program och webbapplikationer med Ruby och RoR. Från 39 €.
Sponsrade länkar