Czy kaczka wpisuje podzbiór polimorfizmu

17

Od polimorfizmu na WIkipedii

W informatyce polimorfizm to funkcja języka programowania, która umożliwia obsługę wartości różnych typów danych przy użyciu jednolitego interfejsu.

Z pisania kaczek na Wikipedii

W programowaniu komputerowym z obiektowymi językami programowania typowanie dynamiczne jest stylem dynamicznego pisania, w którym aktualny zestaw metod i właściwości obiektu określa prawidłową semantykę, a nie jej dziedziczenie po określonej klasie lub implementacji określonego interfejsu.

Moja interpretacja jest taka, że ​​w oparciu o pisanie kaczek metody / właściwości obiektów określają poprawną semantykę. Oznacza to, że obecny kształt obiektów określa interfejs, który obsługuje.

Na podstawie polimorfizmu można powiedzieć, że funkcja jest polimorficzna, jeśli akceptuje wiele różnych typów danych, o ile utrzymują one interfejs.

Jeśli więc funkcja może przechylać się na typ, może akceptować wiele różnych typów danych i działać na nich, dopóki te typy danych mają poprawne metody / właściwości, a tym samym podtrzymują interfejs.

(Użycie terminu interfejs nie jest rozumiane jako konstrukcja kodu, ale raczej jako konstrukcja opisowa, dokumentująca)

  • Jaki jest prawidłowy związek między kaczątkiem a polimorfizmem?
  • Jeśli język potrafi uchylać się od tekstu, czy oznacza to, że może on polimorfizm?
Raynos
źródło
1
Nie wiem, czego szukasz w odpowiedzi. Zdefiniowałeś oba dokładnie, więc masz tyle ostatecznej odpowiedzi, ile jest. Decyzja, czy pisanie kaczki „liczy się” jako polimorfizm, jest mniej więcej pytaniem filozoficznym, a może pytaniem terminologicznym, jeśli masz na myśli to w ten sposób. Czego byś szukał w odpowiedzi?
psr
@psr Mówiłem w zasadzie „oto jak to interpretuję. Czy się mylę? Mam rację? Czy są znani akademiccy ludzie, którzy mówią to w ten czy inny sposób. Czy są jakieś artykuły na ten temat?” Zasadniczo inaczej niż „typowanie kaczki jest implementacją / podzbiorem polimorfizmu”, co jeszcze można powiedzieć o związku?
Raynos,
o ile rozumiem, homografia sprawia, że ​​kaczka wpisuje cokolwiek innego, ale jednolity interfejs => nie jest polimorfizmem, a przynajmniej nie w sensie tego, jak definiuje to Wikipedia. Np door.close()itiger.close()
gnat
4
Pisanie kaczek to przypadek polimorfizmu ad-hoc . Nadmiernie o tym myślisz.
yannis

Odpowiedzi:

16

Mówię, że polimorfizm jest cechą ogólną, którą można wdrożyć na kilka sposobów:

  • dziedziczenie klasowe.
  • obiekty prototypowe (z dziedziczeniem lub bez)
  • pisanie kaczek
  • zgodność interfejsu (tak jak w interfejsach Go i pośrednio w szablonach C ++)

każdy z nich pozwala programiście używać jednego kodu z różnymi typami, więc wszystkie ucieleśniają koncepcję polimorfizmu.

Javier
źródło
7

Myślę, że:

Zarówno pisanie kaczek, jak i polimorfizm są środkami pośredniczenia / abstrakcji. Polimorfizm to koncepcja oparta na typach i pisaniu na maszynie, podczas gdy pisanie na kaczkach opiera się na umowach.

W przypadku polimorfizmu ważne jest, czym jest RZECZ, a nie jak się zachowuje (zachowanie może być konsekwencją tego, czym jest).

W pisaniu kaczek ważne jest, jak zachowuje się RZECZ. Pisanie kaczką jest bardziej związane z koncepcją obiektów jako aktorów, którzy wymieniają się wiadomościami, niż obiektów, które mają określone właściwości.

Wojciech Soczyński
źródło
2
To jest źle. Polimorfizm to ogromny parasol obejmujący wiele rzeczy. W szczególności obejmuje pisanie kaczek. Pisanie kaczek jest zatem formą polimorfizmu.
Thomas Eding,
Nie zgadzam się. Tradycyjne dziedzictwo metodami behawioralnymi ma te same cechy. Jest po prostu bardziej bezpieczny dla typu, ponieważ jasno określa, jakie zachowanie ma gwarantować obiekt (co nie wyklucza innych zachowań!)
marstato,
6

Odpowiedź brzmi TAK .

Duck Typing jest szczególnym przypadkiem dynamicznego typowania , a nawet jeśli dynamiczne typowanie per se nie mogą być bezpośrednio uznawane jako polimorfizm (ponieważ jest to właściwość języka wykonywania typ kontroli w czasie wykonywania, a następnie w czasie kompilacji), techniki, które zwykle leżące u podstaw dynamicznego pisania, takie późne wiązanie i dynamiczne wysyłanie są charakterystyczne dla polimorfizmu .

Alexander Galkin
źródło
Problem z artykułem z Wikipedii i tym, jak wielu ludzi używa tego terminu w tym momencie, polega na tym, że nie definiuje ono znaczenia pisania kaczego, kiedy go zobaczyłem (a mianowicie formy pisania), ale raczej możliwość wywoływania metod i rzucania błąd czasu wykonywania, gdy nie są zdefiniowane. To nie jest pisanie na maszynie, ale raczej brak pisania, jak wyjaśnia Eric Lippert .
reinierpost
1

Wpisywanie kaczek nie jest całkiem podzbiorem polimorfizmu, ponieważ polimorfizm wymaga jawności, która gubi się w pisaniu kaczek. Tak więc pisanie kaczką ma szansę „zaimplementować” „interfejs” nie dlatego, że ma to sens semantyczny, ale dlatego, że masz ten sam podpis. Gdyby pisanie kaczek było podzbiorem polimorfizmu, wówczas miałoby ono wszystkie właściwości polimorfizmu, w tym wyraźną deklarację.

Pisanie kaczek również nie jest tak naprawdę implementacją polimorfizmu, jest częścią innego systemu typów. Zazwyczaj kojarzysz pisanie z kaczką z dynamicznym językiem, który idzie naprzód i przekazuje komunikat do obiektu, nie wiedząc, czy obiekt może go obsłużyć - jeśli tak, to skutecznie przeszedł test pisania kaczki. Zwykle myślisz o polimorfizmie jako implementowanym w czasie kompilacji poprzez konfigurację vtables (i itables, jeśli interfejsy są inne niż klasy). Ale istnieje wiele języków i wiele sposobów na wdrożenie tych funkcji.

W pewnym stopniu jest to pytanie filozoficzne. Czy możesz myśleć o pisaniu kaczek jako interfejsach, które są automatycznie deklarowane niejawnie? Nie mogę wymyślić żadnego niewłaściwego powodu , ale nie sądzę, że jest to prawdopodobnie najbardziej produktywny sposób na to. Wydaje mi się, że pisanie kaczek i interfejsy to często spotykane cechy systemów typów języka programowania, oba mają dość podobny sposób zachowania i oba są ważne dla programistów.

psr
źródło
6
„polimorfizm wymaga jawności”, co to znaczy? dziedziczenie klasowe jest tylko formą polimorfizmu, nie jedyną.
Javier
Kontynuując komentarz @ Javiera, a może polimorfizm ad hoc ?
yannis
@YannisRizos - Problem z odpowiedzią na takie pytanie jest taki, że istnieje tyle języków i tyle terminologii, że ktoś może cię podważyć, bez względu na to, co powiesz. Rozumiem, dlaczego „polimorfizm ad hoc” ma w nazwie słowo „polimorfizm”, ale argumentowałbym, że to coś innego niż to, co OP oznacza „polimorfizm”.
psr
@Javier - Wszystkie wymienione metody wymagają jawności, z wyjątkiem pisania kaczego.
psr
@ psr Właściwie nie obchodzi mnie, co OP rozumie przez „polimorfizm”. Nie sądzę, żeby nikogo to obchodziło, to koncepcja naukowa z bardzo prostą definicją, nie sądzę, że powinniśmy odpowiadać na podstawie naszych własnych interpretacji lub tego, co moglibyśmy uznać za interpretację OP. Zwłaszcza interpretacja OP, ponieważ domyślnie o to pyta, nie jest pewien swojej interpretacji. Nie zgadzam się, że jest to pytanie filozoficzne, pytanie, jak stwierdzono, było naukowe z jedną prostą odpowiedzią: Tak, unikanie jest formą polimorfizmu ad hoc, jednego podzbioru polimorfizmu.
yannis
1

Prawie naturalne jest powiedzenie „Tak, jeśli foo ma kaczkę, foo ma polimorfizm”. Ale nie mogę powiedzieć tego w 100% pewien, że w pewnym sensie może to jest możliwe, aby wymyślić przykłady sztucznych takiego systemu, który ma kaczkę wpisywanie ( "może to szarlatan && może unosić się na wodzie ==> to jest Kaczka ”), chociaż nie ma polimorfizmu („ foo, kwak! ”Zawodzi), ale naprawdę byłyby sztuczne i w prawdziwym świecie powiedziałbym„ Tak, jeśli typowanie kaczki jest obecne, polimorfizm również musi być obecny ”.

Osobiście widzę, że pisanie kaczek to „polimorfizm zrobiony dobrze”. Rozumiem przez to, że rzeczy, które istnieją w świecie kaczych typów, nie muszą mieć żadnych wyraźnych typów, a ich zachowanie (polimorficzne = „taki sam dostęp, inny wynik”) jest jedyną rzeczą, która się liczy. W innych implementacjach polimorfizmu jest on ograniczony do typów / interfejsów / dziedziczenia, więc jest „zaimplementowany i ograniczony polimorfizm”, a nie „polimorfizm per se”.

herby
źródło
0

Statycznie typowane języki programowania umożliwiają wcześniejsze sprawdzanie błędów, lepsze egzekwowanie zdyscyplinowanych stylów programowania i generowanie bardziej wydajnego kodu obiektowego niż języki, w których wszystkie kontrole spójności typów są wykonywane w czasie wykonywania.

(B. Pierce i przyjaciele)

Tak więc, jak można zauważyć, pod tym względem pisanie kaczką jest pisaniem dynamicznym, ale naprawdę jest inaczej.

Istnieje pewna metoda określania typu, który odnosi się do polimorfizacji, np. Która uelastycznia kod, ale pisanie z kaczką to zupełnie inna kwestia w tych przypadkach.

W szczegółach jest typowany rachunek lambda i niepisany rachunek lambda, które pomagają określić właściwość obliczeń i obliczeń.

Widzę również, że takie rzeczy, jak pisanie kaczek, mogą pomóc, jeśli chcemy tylko szybko uzyskać wynik, ale przy innych okazjach czuję też, że dynamiczna natura sprawia, że ​​jest bardziej dostosowany do potrzeb, dzięki czemu mogę szybciej obliczać. Myślę, że to tylko powiedzieć, kochanie, że jeśli naprawdę wiem, co chcę już obliczyć, najlepiej pisać na maszynie, ale dlaczego mam wiedzieć, czego chcę? Hehehe ...

To moje pięć centów i myślę, że może to stanowić ciekawy temat badawczy.

Edd
źródło