Dalam konferensi goto yang dipikirkan oleh Rich Hickey, keynote conference " The Value of Values " pada 29 menit dia berbicara tentang overhead bahasa seperti Java dan membuat pernyataan seperti, "Semua antarmuka membunuh penggunaan kembali Anda." Apa yang dia maksud Benarkah?
Dalam pencarian saya untuk jawaban, saya telah menemukan:
Prinsip Pengetahuan Paling Tidak AKA Hukum Demeter yang mendorong antarmuka API kedap udara. Wikipedia juga mencantumkan beberapa kerugian.
Imperial Clothing Crisis Kevlin Henney yang berpendapat bahwa penggunaan, bukan penggunaan kembali adalah tujuan yang tepat.
Pembicaraan " Stop Writing Classes " Jack Diederich yang menentang over-engineering secara umum.
Jelas, apa pun yang ditulis dengan cukup buruk tidak akan berguna. Tetapi bagaimana antarmuka API yang ditulis dengan baik mencegah kode tersebut tidak digunakan? Ada beberapa contoh sepanjang sejarah tentang sesuatu yang dibuat untuk satu tujuan lebih banyak digunakan untuk sesuatu yang lain . Tetapi di dunia perangkat lunak, jika Anda menggunakan sesuatu untuk tujuan yang tidak dimaksudkan, biasanya rusak.
Saya sedang mencari satu contoh bagus dari antarmuka yang bagus untuk mencegah penggunaan kode yang sah tetapi tidak disengaja. Apakah itu ada? Saya tidak bisa membayangkannya.
sumber
Jawaban:
Belum menonton presentasi lengkap Cupang Kaya, tetapi jika saya memahaminya dengan benar, dan menilai dari apa yang dia katakan tentang tanda 29 menit, dia sepertinya berdebat tentang jenis pembunuhan yang menggunakan kembali. Dia menggunakan istilah "antarmuka" secara longgar sebagai sinonim untuk "nama tipe", yang masuk akal.
Jika Anda memiliki dua entitas
{ "name":"John" }
tipePerson
, dan{ "name": "Rover" }
tipeDog
, di Java-land mereka mungkin tidak dapat beroperasi kecuali mereka berbagi antarmuka atau leluhur yang sama (sepertiMammal
, yang berarti menulis lebih banyak kode). Jadi antarmuka / jenis di sini adalah "membunuh penggunaan ulang Anda": meskipunPerson
danDog
terlihat sama, satu tidak dapat digunakan secara bergantian dengan yang lain, kecuali Anda menulis kode tambahan untuk mendukungnya. Catatan Hickey juga bercanda tentang proyek-proyek di Jawa yang membutuhkan banyak kelas ("Siapa di sini yang telah menulis aplikasi Java hanya menggunakan 20 kelas?"), Yang tampaknya merupakan konsekuensi dari hal di atas.Namun, dalam bahasa "berorientasi nilai", Anda tidak akan menetapkan tipe pada struktur itu; mereka hanya nilai yang kebetulan berbagi struktur yang sama (dalam contoh saya, mereka berdua memiliki
name
bidang dengan nilai String) dan karenanya dapat dengan mudah dioperasikan, misalnya mereka dapat ditambahkan ke koleksi yang sama, diteruskan ke metode yang sama, dll.Singkatnya, semua ini tampaknya menjadi sesuatu tentang kesetaraan struktural vs jenis / antarmuka kesetaraan eksplisit . Kecuali saya melewatkan sesuatu dari bagian-bagian video yang belum saya tonton :)
sumber
ERROR: Object doesn't have a property called "name"
seringkali merupakan hasil darivalue-oriented
bahasa, dan masalah lainnya adalah ketika Anda tidak ingin lagi memanggil properti ituname
. Selamat mencoba refactoring karena kemungkinan ada ratusan objek dengan propertiname
tetapi tidak semuaPerson
atauDog
.interface
tetapi untuk kekacauan itu adalah proyek Java yang khas.Dia kemungkinan merujuk pada fakta dasar bahwa sebuah antarmuka tidak dapat dipakai. Anda tidak dapat
reuse
menggunakan antarmuka. Anda hanya dapat mengimplementasikan kode yang mendukungnya, dan ketika Anda menulis kode untuk antarmuka tidak ada penggunaan kembali.Java memiliki sejarah menyediakan kerangka kerja banyak API yang menggunakan antarmuka sebagai argumen, tetapi tim yang mengembangkan API tidak pernah menerapkan berbagai kelas untuk digunakan kembali dengan antarmuka tersebut.
Ini seperti kerangka kerja GUI yang memiliki
IWindow
antarmuka untuk kotak dialog, dan kemudian Anda dapat menambahkanIButton
antarmuka untuk kontrol. Kecuali, mereka tidak pernah memberimuButton
kelas bagus yang mengimplementasikanIButton
. Jadi, Anda tinggal membuat sendiri.Kerangka yang diabstraksi yang memiliki berbagai kelas dasar yang menyediakan fungsionalitas inti lebih dapat digunakan kembali, dan yang bekerja paling baik ketika kelas-kelas yang diabstraksi dapat diakses oleh mereka yang menggunakan kerangka kerja.
Pengembang Java mulai melakukan hal ini di mana lapisan API mereka hanya terbuka
interfaces
. Anda bisa mengimplementasikan antarmuka itu, tetapi Anda tidak pernah bisa menggunakan kembali kelas dari pengembang yang mengimplementasikan antarmuka itu. Ini semacam gaya jubah dan belati pengembangan API.sumber
Saya pikir slide 13 di presentasinya ( Nilai Nilai ) membantu untuk memahami ini:
Pemahaman saya adalah, Hickey menyarankan bahwa jika saya perlu, katakanlah, gandakan nilai yang Anda kirimkan kepada saya, saya cukup menulis kode yang terlihat seperti
Anda lihat, kode di atas sama, tidak peduli apa pun nilai yang Anda kirim - semacam penggunaan kembali yang sempurna .
Sekarang, bagaimana ini akan terlihat seperti dalam bahasa yang memiliki objek dan antarmuka?
Oh tunggu! bagaimana jika
YourValue
tidak diterapkanDoublable
? bukan karena itu tidak dapat digandakan, itu mungkin saja tapi ... bagaimana jika tidak ada metodeDouble
? (Bagaimana jika ada metode yang disebut katakanTwiceAsMuch
?)Uh oh kita punya masalah.
YourValue.Double
tidak akan berfungsi, tidak dapat digunakan kembali lagi. Per bacaan saya tentang slide di atas, ini adalah tentang apa yang dimaksudkan Hickey ketika dia berkata, "Semua antarmuka itu membunuh Anda!"Anda lihat, antarmuka berasumsi bahwa objek dilewatkan "bersama dengan metode mereka", bersama dengan kode yang beroperasi pada ini. Untuk menggunakan objek, orang perlu memahami cara menjalankan kode itu, metode apa yang harus dihubungi.
Ketika metode yang diharapkan hilang, ada masalah, meskipun secara semantik , operasi yang diinginkan masuk akal untuk suatu objek. Seperti yang dinyatakan dalam presentasi, nilai tidak memerlukan metode ("Saya bisa mengirimkan Anda nilai tanpa kode dan Anda baik-baik saja"), memungkinkan untuk menulis kode yang berurusan dengan mereka secara umum.
Catatan: gagasan untuk memberikan nilai yang kurang kode, entah bagaimana, mengingatkan saya pada pola Flyweight di OOP.
Penggunaan kelas terbang yang pernah saya lihat biasanya mengikuti pendekatan yang sama dengan menghilangkan kode (metode, antarmuka) dari objek dan mengedarkan barang-barang sekitar, juga, nilai-nilai tanpa kode , berharap bahwa menerima kode memiliki cara yang diperlukan untuk mengoperasikannya.
Ini terasa seperti pada slide, "nilai tidak perlu metode. Saya bisa mengirimkan Anda nilai tanpa kode dan Anda baik-baik saja".
sumber
MyValue = Double(YourValue)
tidak masuk akal jika Nilai Anda adalah String, Alamat, Pengguna, Fungsi, atau Database. Jika tidak, argumen metode-hilang Anda adalah kuat. OTOH, metode pengaksesor memungkinkan Anda menegakkan berbagai kendala sehingga Nilai Anda valid, dan hanya operasi yang masuk akal yang digunakan untuk menghasilkan Nilai baru. Jika Anda kemudian memutuskan untuk memisahkan Alamat dari Pengguna dan Perusahaan Anda, metode accessor berarti Anda tidak melanggar semua klien kode Anda. Jadi mereka dapat membantu menggunakan kembali dalam jangka panjang bahkan jika mereka kadang-kadang menghambatnya dalam jangka pendek.Dalam kelas dunia yang ideal (dan saya) interface dan akan selalu menggambarkan perilaku, tetapi kenyataannya adalah bahwa terlalu sering mereka akhirnya hanya menggambarkan data. Baru kemarin saya menonton video seseorang membangun
BankAccount
kelas yang disebut tidak lebih dari yang dimuliakanint
(memang itu jauh lebih tidak berguna daripadaint
, sehingga 'membunuh' penggunaan kembali yang saya miliki seandainya dibiarkan begitu saja sebagaiint
), semua atas nama desain 'baik'. Jumlah kode, keringat, dan air mata yang terbuang untuk menciptakan kembali representasi data yang berbelit-belit sangat mengejutkan; jika Anda tidak menggunakan data dengan cara yang berarti maka biarkan saja.Sekarang, ini adalah tahap di mana Rich Hickey puas untuk membuang bayi keluar dengan air mandi dan mengatakan bahwa kita semua harus tinggal di tanah nilai (tetangga ke kerajaan kata benda). Saya pikir, di sisi lain, bahwa OOP dapat dan memang mempromosikan penggunaan kembali (dan yang penting dapat ditemukan kembali, yang saya temukan kurang dalam pemrograman fungsional) ketika dipekerjakan dengan bijaksana. Jika Anda mencari prinsip OOP yang paling baik menangkap ketegangan ini, saya pikir itu mungkin http://c2.com/cgi/wiki?TellDontAsk (yang tentu saja merupakan sepupu dekat Demeter)
sumber