Apa yang bisa saya gunakan sebagai pengganti Antarmuka di Ruby (atau bahasa dinamis lainnya)?

9

Tujuan saya adalah mendefinisikan kontrak antar kelas.

Saya suka mengetik bebek dan semua tetapi saya juga ingin mendefinisikan antarmuka antara berbagai lapisan aplikasi saya untuk secara jelas menentukan metode mana yang dipanggil dari eksternal, dan mana yang merupakan metode aksesori yang tidak boleh digunakan oleh lapisan lain .

Sebagai contoh di Jawa saya dapat mendefinisikan antarmuka Persistor dengan metode seperti get () dan save () dan kemudian mendefinisikan kelas JdbcPersistor dengan semua metode yang saya butuhkan untuk bertahan di database. Dan mungkin RestPersistor lain dengan metode lain untuk menghemat pada restserver jarak jauh.

Saya tidak meminta antarmuka di Ruby, hanya untuk mengetahui apakah ada cara yang rapi menjaga perbedaan ini. Saya suka Ruby tetapi saya hanya bekerja pada proyek-proyek kecil dengannya.

Uberto
sumber
Saya pikir ini milik StackOverflow ...
thorsten müller
2
@thorsten Stack Overflow adalah untuk masalah implementasi spesifik (yaitu ada masalah dalam kode). Pertanyaan desain program umum adalah pada topik di sini di Programmers.SE.
@ Mark: terima kasih atas koreksinya. Saya pikir itu terlalu spesifik pada Ruby (dan melewatkan kalimat terakhir Uberto). Jadi saya memperbarui pengetahuan saya tentang faq. (Masih menemukan jalan saya di sini)
thorsten müller
+1 Pertanyaan bagus. Saya tertarik jika ada cara lain selain menulis, membaca, dan terus memperbarui dokumentasi atau menggunakan beberapa konvensi konyol seperti sebelumnya metode aksesori internal dengan garis bawah atau sesuatu seperti itu.
Joonas Pulakka
+1 Omong-omong, PLT Racket memiliki dukungan untuk kontrak, dan bersifat dinamis. Menambahkan sesuatu yang mirip dengan Ruby akan menjadi proyek yang menarik.
Larry Coleman

Jawaban:

5

Ini dijawab dalam konteks antarmuka C # dan Ruby on stackoverflow: /programming/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c .

Ringkasnya: tidak ada padanan yang tepat di Ruby karena mengetik bebek membuat antarmuka formal tidak diperlukan. Sebagai gantinya, pertimbangkan pengujian untuk kepatuhan terhadap "antarmuka" atau penggunaan kontrak respond_to?.

Corbin March
sumber
2
ya tapi ini tidak mencegah kode untuk mengakses metode yang seharusnya tidak
Uberto
2

Beberapa bahasa yang diketik secara dinamis memiliki antarmuka, atau konsep yang serupa. Sebagai contoh, Objective-C memiliki protokol. Tetapi kebanyakan tidak. Agar efektif dalam bahasa yang dinamis, Anda harus melupakan apa yang Anda ketahui tentang bahasa yang diketik secara statis, merangkul sifat dinamis dari bahasa tersebut. Bahasa yang diketik secara dinamis umumnya menghindari penggunaan antarmuka.

mipadi
sumber
1

Dalam Perl 5, Moose dan Moo memberikan peran (atau sifat) yang dapat memerlukan implementasi metode tertentu. Moose juga dilengkapi dengan sistem tipe runtime yang memungkinkan Anda untuk mendefinisikan duck_type, yang merupakan tipe yang menyatakan objek yang memiliki serangkaian metode yang diperlukan.

Peran diimplementasikan oleh kelas (atau peran lain) sendiri, dan juga menyediakan implementasi dan perilaku, tidak hanya antarmuka. Tetapi mereka juga (setidaknya dalam Moose) menangani hal-hal seperti metode deteksi konflik.

phaylon
sumber