Nasza strona używa cookies. Dowiedz się więcej o celu ich używania i zmianie ustawień w przeglądarce. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

Dlaczego społeczność Ruby zachęca do używania duck typingu

Mehdi Farsi Ruby on Rails Senior Developer
Dowiedz się, czym jest typowanie statyczne, dynamiczne i duck typing oraz czemu duck typing jest zalecany w Ruby.
Dlaczego społeczność Ruby zachęca do używania duck typingu

W tym tekście przyjrzymy się kilku zagadnieniom:

- Językom statycznie typowanym
- Językom dynamicznie typowanym
- Podstawom stojącym za duck typing


Wstęp

Każda wartość w programie jest powiązana z typem. W zależności od języka typ zmiennej jest definiowany statycznie lub dynamicznie. Ruby opiera się na zasadzie, która jest nazywana Duck Typing. Przyjrzyjmy się więc, czym są statycznie i dynamicznie typowane języki. Odpowiemy też sobie na pytanie: Czemu w Ruby zalecane jest używanie zasady projektowania zwanej Duck Typing.


Języki typowane statycznie

W języku typowanym statycznie typ zmiennej jest statyczny. To oznacza, że w momencie, w którym przypiszesz zmienną do typu, nie możesz go dalej zmienić. W tym przypadku typowanie jest powiązane ze zmienną, a nie z wartością, na którą wskazuje zmienna. Niektóre języki, jak C, wymuszają, by każda zmienna była powiązana z szeregiem ograniczeń określonych w momencie deklaracji. Te ograniczenia są specyficzne dla każdego istniejącego typu w C.

int main()
{
  int  x;
  
  x = "rubycademy.com"; //  warning: incompatible pointer to integer conversion assigning to 'int' from 'char [15]' [-Wint-conversion]
  return (0);
}


W powyższym programie w C widzimy, że zmienna x jest powiązana z typem int - czyli liczbą całkowitą. Tak więc ten typ będzie powiązany ze zmienną przez cały okres jej życia. Niezależnie od wartości, którą przypiszemy do zmiennej, typem zmiennej nadal pozostanie int.

Zauważ, że zwykle języki typowane statycznie są językami kompilowanymi, ponieważ kompilator może sprawdzić typ każdej zmiennej poprzez zdefiniowane ograniczenia, w czasie kompilacji.


Języki typowane dynamicznie

W języku typowanym dynamicznie typ zmiennej jest dynamiczny. To oznacza, że w po przypisaniu zmiennej do typu nadal możesz go zmienić, kiedykolwiek zechcesz. W zasadzie typowanie jest tu powiązane z wartością, a nie ze zmienną jako taką.

Niektóre języki, jak Python, są językami typowanymi dynamicznie.

website = "rubycademy.com" # `website` refers to a string
website = True             # `website` refers now to a boolean


W powyższym przykładzie zmienna website najpierw wskazuje na string, a potem na wartość boolowską. Tak więc typ jest definiowany w czasie wykonywania, a Python nie robi żadnego sprawdzenia typów w tym przypadku.

W językach typowanych dynamicznie możesz myśleć o zmiennej jako pudełku, które ma wskaźnik do wartości dowolnego typu. A jak jest z Ruby?


Duck Typing

Po pierwsze Ruby to również język typowany dynamicznie. Typy są definiowane w czasie wykonania programu.

Ruby jest oparty na konwencjach. Pozwala na maksymalną kontrolę developerowi, który jest odpowiedzialny za kod, który produkuje. Oczywiście Ruby zapewnia wiele ograniczeń, by pomóc programiście. Nie jest to ziemia niczyja.

Dodatkowo Core Team języka proponuje cały zestaw zasad, które programista może przyjąć, bądź odrzucić. Jedną z nich jest duck typing. Jest oparty na znanym teście kaczki:

Kiedy widzę ptaka, który chodzi jak kaczka, pływa jak kaczka i kwacze jak kaczka, to nazywam tego ptaka kaczką.

Możemy to przetłumaczyć na Ruby następująco:

Jeżeli obiekt kwacze jak kaczka (albo zachowuje się jak tablica), to możemy go traktować jak kaczkę (lub tablicę).

Stwórzmy przykład, który to ilustruje:

a = [1, 2, 3]
a.map(&:to_s) # => ['1', '2', '3']


Tu zmienna a jest w stanie odpowiedzieć na metodę map i zwrócić spodziewany obiekt. Więc jest uzasadnione, by myśleć, że zmienna a to tablica.


Podsumowanie

Podsumowując, podzielę się z Wami odpowiedzią, jaką dał mi Yukihiro “Matz” Matsumoto, gdy zapytałem go, dlaczego zalecane jest w Ruby używanie duck typingu:

W przeciwieństwie do statycznego i dynamicznego typowania zmiennych (i wyrażeń), duck typing nie jest cechą języka, ale zasadą projektowania, która jest kombinacją dynamicznego typowania i programowania zorientowanego obiektowo. Ponieważ Ruby jest dynamicznie typowanym zorientowanym obiektowo językiem programowania, to naturalne, że społeczność Ruby zachęca do używania duck typingu.


Oryginał tekstu w języku angielskim przeczytasz tutaj.

Lubisz dzielić się wiedzą i chcesz zostać autorem?

Podziel się wiedzą z 120 tysiącami naszych czytelników

Dowiedz się więcej