Apakah bebek mengetik subset polimorfisme


17

Dari Polimorfisme di WIkipedia

Dalam ilmu komputer, polimorfisme adalah fitur bahasa pemrograman yang memungkinkan nilai-nilai dari tipe data yang berbeda ditangani menggunakan antarmuka yang seragam.

Dari mengetik bebek di Wikipedia

Dalam pemrograman komputer dengan bahasa pemrograman berorientasi objek, pengetikan bebek adalah gaya pengetikan dinamis di mana serangkaian metode dan properti objek saat ini menentukan semantik yang valid, daripada pewarisannya dari kelas tertentu atau implementasi antarmuka tertentu.

Interpretasi saya adalah bahwa berdasarkan pada mengetik bebek, metode objek / properti menentukan semantik yang valid. Berarti bentuk objek saat ini menentukan antarmuka yang ditegakkan.

Dari polimorfisme Anda dapat mengatakan suatu fungsi bersifat polimorfik jika ia menerima beberapa tipe data yang berbeda asalkan mereka menjunjung tinggi suatu antarmuka.

Jadi, jika suatu fungsi dapat tipe bebek, ia dapat menerima beberapa tipe data yang berbeda dan beroperasi pada mereka selama tipe data memiliki metode / properti yang benar dan dengan demikian menjunjung tinggi antarmuka.

(Penggunaan istilah antarmuka dimaksudkan bukan sebagai konstruk kode tetapi lebih sebagai konstruk deskriptif, yang mendokumentasikan)

  • Apa hubungan yang benar antara ducktyping dan polimorfisme?
  • Jika suatu bahasa dapat tipe bebek, apakah itu berarti ia dapat melakukan polimorfisme?

1
Tidak yakin apa yang Anda cari dalam jawaban. Anda mendefinisikan keduanya secara akurat, sehingga Anda memiliki jawaban pasti sebanyak yang ada. Memutuskan apakah bebek mengetik "dianggap" sebagai polimorfisme lebih atau kurang merupakan pertanyaan filosofis, atau mungkin pertanyaan terminologi jika Anda bersungguh-sungguh. Jadi apa yang akan Anda cari dalam jawaban?
psr

@psr Saya pada dasarnya mengatakan "beginilah cara saya menafsirkannya. Apakah saya salah? Apakah saya benar? Apakah ada orang akademis yang dapat diulang yang mengatakannya dengan satu atau lain cara. Apakah ada artikel tentang topik ini?" Pada dasarnya secara terperinci selain "mengetik bebek adalah implementasi / bagian dari polimorfisme" apa lagi yang bisa dikatakan tentang hubungan tersebut?
Raynos

sejauh yang saya mengerti homografi membuat bebek mengetik apa pun selain antarmuka seragam => bukan polimorfisme, atau setidaknya tidak dalam arti bagaimana Wikipedia mendefinisikannya. Misalnya door.close()dantiger.close()
nyamuk

4
Mengetik bebek adalah kasus polimorfisme Ad-hoc . Anda terlalu memikirkan ini.
yannis

Jawaban:


16

Saya mengatakan bahwa polimorfisme adalah sifat generik, yang dapat diimplementasikan beberapa cara:

  • warisan berbasis kelas.
  • objek berbasis prototipe (dengan atau tanpa warisan)
  • mengetik bebek
  • kepatuhan antarmuka (seperti yang dilakukan oleh antarmuka Go dan secara implisit pada templat C ++)

masing-masing memungkinkan programmer untuk menggunakan kode tunggal dengan tipe yang berbeda, jadi semuanya mewujudkan konsep polimorfisme.


7

Saya pikir itu:

Baik mengetik bebek dan polimorfisme adalah cara tipuan / abstraksi. Polimorfisme adalah konsep yang didasarkan pada jenis dan pengetikan sedangkan pengetikan bebek didasarkan pada kontrak.

Dengan polimorfisme, penting HAL-HAL itu dan bukan bagaimana berperilaku (perilaku itu mungkin merupakan konsekuensi dari apa itu).

Dalam mengetik bebek, penting bagaimana HAL berperilaku. Mengetik bebek lebih terikat pada konsep objek sebagai aktor yang bertukar pesan, bukan objek yang memiliki beberapa properti yang ditentukan.


2
Ini salah. Polimorfisme adalah payung besar yang mencakup banyak hal. Secara khusus, ini mencakup mengetik bebek. Jadi mengetik bebek adalah bentuk polimorfisme.
Thomas Eding

Saya tidak setuju. Warisan tradisional dengan metode perilaku memiliki sifat yang sama. Itu hanya lebih aman dengan secara eksplisit mengenai perilaku apa yang dijamin akan ditunjukkan oleh suatu benda (yang tidak mengecualikan perilaku lain!)
marstato

6

Jawabannya adalah YA .

Mengetik Bebek adalah kasus khusus pengetikan dinamis , dan bahkan jika pengetikan dinamis per se tidak dapat secara langsung dianggap sebagai polimorfisme (karena itu hanya properti bahasa untuk melakukan pemeriksaan ketik saat runtime daripada pada waktu kompilasi), teknik yang biasanya mendasari pengetikan dinamis, pengikatan yang lambat dan pengiriman dinamis seperti ini merupakan karakteristik untuk polimorfisme .


Masalah dengan artikel Wikipedia dan berapa banyak orang menggunakan istilah saat ini adalah bahwa itu tidak mendefinisikan apa yang dimaksud dengan mengetik bebek ketika saya pertama kali melihatnya (yaitu, bentuk mengetik) tetapi lebih tepatnya, hanya bisa memanggil metode dan melempar kesalahan runtime ketika mereka tidak didefinisikan. Itu bukan pengetikan melainkan kurangnya pengetikan, seperti yang dijelaskan Eric Lippert .
reinierpost

1

Mengetik bebek bukan bagian dari polimorfisme, karena polimorfisme membutuhkan kesaksian, yang hilang dalam pengetikan bebek. Jadi mengetik bebek memiliki peluang untuk "mengimplementasikan" sebuah "antarmuka" bukan karena itu masuk akal semantik tetapi karena Anda memiliki tanda tangan yang sama. Jika mengetik bebek adalah bagian dari polimorfisme maka ia akan memiliki semua sifat polimorfisme, termasuk deklarasi eksplisit.

Mengetik bebek juga sebenarnya bukan implementasi polimorfisme, itu bagian dari sistem tipe yang berbeda. Biasanya Anda mengasosiasikan pengetikan bebek dengan bahasa dinamis yang berjalan di depan dan meneruskan pesan ke objek tanpa mengetahui apakah objek tersebut dapat menanganinya - jika dapat maka secara efektif ia telah lulus uji pengetikan bebek. Biasanya Anda menganggap polimorfisme sedang diimplementasikan pada waktu kompilasi dengan mengatur vtables (dan itu mungkin jika antarmuka berbeda dari kelas). Tetapi ada BANYAK bahasa di luar sana dan banyak cara untuk mengimplementasikan fitur-fitur ini.

Hingga taraf tertentu ini adalah pertanyaan filosofis. Bisakah Anda menganggap bebek mengetik sebagai antarmuka yang secara otomatis dinyatakan secara implisit? Saya tidak bisa memikirkan alasan yang salah , tepatnya, tetapi saya tidak berpikir itu mungkin cara paling produktif untuk melihatnya. Saya pikir bebek mengetik dan antarmuka keduanya fitur yang biasa ditemui dari sistem jenis bahasa pemrograman, keduanya memiliki cara berperilaku yang cukup mirip, dan keduanya penting bagi pemrogram untuk mengerti.


6
"polimorfisme membutuhkan kesaksian" di mana katanya? pewarisan berbasis kelas hanyalah bentuk polimorfisme, bukan satu-satunya.
Javier

Dan melanjutkan komentar @ Javier, bagaimana dengan polimorfisme ad hoc ?
yannis

@YannisRizos - Masalah dengan menjawab pertanyaan seperti ini adalah ada begitu banyak bahasa dan begitu banyak terminologi yang mungkin membuat seseorang tertarik pada Anda, apa pun yang Anda katakan. Saya mengerti mengapa "polimorfisme ad hoc" memiliki kata "polimorfisme" dalam nama, tetapi saya berpendapat itu adalah sesuatu yang lain daripada apa yang OP maksudkan dengan "polimorfisme".
psr

@ Javier - Semua metode yang Anda daftarkan memerlukan kesaksian kecuali pengetikan bebek.
psr

@psr Sebenarnya saya tidak peduli tentang apa yang OP maksud dengan "polimorfisme". Saya tidak berpikir ada orang yang peduli, itu konsep ilmiah dengan definisi yang sangat sederhana, saya tidak berpikir kita harus menjawab berdasarkan interpretasi kita sendiri atau apa yang kita pikir itu interpretasi OPs. Terutama interpretasi OPs, karena dia bertanya secara default dia tidak yakin tentang interpretasinya. Saya tidak setuju bahwa ini adalah pertanyaan filosofis, pertanyaan yang dinyatakan adalah pertanyaan ilmiah dengan satu jawaban sederhana: Ya ducktyping adalah bentuk polimorfisme ad hoc, satu subset polimorfisme.
yannis

1

Rasanya hampir wajar untuk mengatakan "Ya, jika foo memiliki ketikan bebek, foo memiliki polimorfisme". Tapi saya tidak bisa mengatakan ini 100% pasti, dalam arti bahwa mungkin itu benar mungkin untuk membuat contoh buatan dari sistem seperti itu yang mengetik bebek ("bisakah itu dukun && dapat mengapung di atas air ==> itu adalah Bebek ") walaupun tidak memiliki polimorfisme (" foo, dukun! "Gagal), tetapi mereka akan benar-benar buatan dan di dunia nyata, saya akan mengatakan" Ya, jika mengetik bebek ada, polimorfisme juga harus ada ".

Secara pribadi saya melihat bebek mengetik sebagai "polimorfisme dilakukan dengan benar". Yang saya maksud dengan itu, hal yang ada di dunia pengetikan bebek tidak perlu memiliki tipe eksplisit dan perilaku mereka (polimorfik = "akses yang sama, hasil yang berbeda") adalah satu-satunya hal yang diperhitungkan. Dalam implementasi polimorfisme lain, ia dibatasi pada tipe / antarmuka / pewarisan, sehingga "polimorfisme yang diimplementasikan dan dibatasi" bukan "polimorfisme per se".


0

Bahasa pemrograman yang diketik secara statis memungkinkan pemeriksaan kesalahan sebelumnya, penegakan yang lebih baik dari gaya pemrograman yang disiplin, dan pembuatan kode objek yang lebih efisien daripada bahasa di mana semua jenis pemeriksaan konsistensi dilakukan pada saat dijalankan.

(B. Pierce & teman-teman)

Jadi seperti yang Anda perhatikan, dalam hal ini, pengetikan bebek adalah pengetikan dinamis yang benar-benar berjalan sebaliknya.

Ada beberapa metode untuk menentukan jenis yang berhubungan dengan polymorphing misalnya yang membuat kode lebih fleksibel tetapi mengetik bebek adalah masalah lain sama sekali dalam kasus ini.

Secara rinci ada kalkulus lambda yang diketik dan kalkulus lambda yang tidak diketik yang membantu menentukan properti kalkulasi dan perhitungan.

Saya juga melihat bahwa hal-hal seperti mengetik bebek dapat membantu jika kita hanya ingin mendapatkan hasil dengan cepat tetapi pada kesempatan lain saya juga merasa bahwa sifat dinamis membuatnya lebih dapat disesuaikan dengan kebutuhan, sehingga saya dapat menghitung lebih cepat. Saya kira itu hanya untuk mengatakan, sayang, bahwa jika saya sudah tahu apa yang ingin saya hitung, mengetik adalah yang terbaik, tetapi mengapa saya tahu apa yang saya inginkan? Hehehe ...

Itu lima sen saya dan saya kira itu bisa menjadi topik penelitian yang menarik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.