Batu-batu dari kuil kuno tahu bagaimana berbicara, tetapi sedikit orang yang mengindahkannya. Alam semesta dipenuhi dengan suara-suara yang tidak bisa kita dengar manusia; warna yang tidak kita lihat: kadang-kadang itu adalah batasan obyektif dari tubuh dan roh, tetapi ada juga alasan subjektif - kurangnya pengetahuan dan keterampilan atau ketidakmampuan untuk menggunakannya dalam praktik sehari-hari. Sebuah contoh nyata dari pemrograman kedua di dunia - tanda tangan fungsi. Anak-anak di dunia OO paling-paling berpikir dalam antarmuka - sudah dekat, tetapi "tidak sepenuhnya" dan semakin Anda menjadi penuh perhatian, semakin berubah menjadi "tidak sama sekali". Dan tanda tangan fungsi juga tahu cara berbicara.
Sejujurnya, saya ingin memulai dari sisi abstraksi yang benar-benar tingkat tinggi, tetapi pengalaman saya sebelumnya menunjukkan bahwa kebenaran matematika yang paling sederhana sekalipun dalam bahasa non-matematika “jangan terdengar”. Secara sepintas, saya perhatikan bahwa semua yang saya bicarakan lahir dari pemikiran matematika - dan, karenanya, dapat diformalkan secara ketat.
Dan sekarang - spesifik. Mungkin lebih atau kurang "mengobrak-abrik" repot-repot untuk membaca setidaknya sekali karya pembuatan zaman GoF; bahkan mungkin yang “tidak lengket” tahu bahwa ada pola seperti itu - iterator. Dan tentu saja semua orang menggunakannya setiap hari. Jadi (berpegang pada conditional C #):
bool MoveNext(); T Current { get; }
... dan sekarang hal yang sama, tetapi tanpa noise sintaksis (ini mengindikasikan bahwa sebenarnya “tanpa noise sintaksis” berarti di Haskell):
MoveNext :: () -> Bool Current :: () -> t
... lupa tentang jenis untuk sementara waktu dan fokus pada panah itu sendiri (->), Anda tanpa sadar datang ke pertanyaan tentang apa yang akan terjadi jika "dibalik"? Kemudian ternyata:
MoveNext' :: Bool -> () Current' :: t -> ()
Sedikit ketidakharmonisan, kan? Jika tidak ada masalah dengan
t -> () , maka
Bool -> () terlihat lebih mencurigakan. Dan memang - bendera ini digunakan untuk menandai akhir dari urutan, bukan? Dalam bentuk terbalik, case
True -> () tidak masuk akal - hanya
False -> () yang cukup. Ketidakpastian biner yang disediakan oleh tipe Bool hilang - dan karenanya harus terlihat seperti ini:
completed :: () -> () next :: t -> ()
Apakah itu menyerupai sesuatu? Bagaimana dengan
ekstensi reaktif ?
Wow! Tanda tangan (well, lebih tepatnya, tanda tangan, tetapi pendekatan itu sendiri bekerja pada level individu) dari fungsi satu (hampir) keren (mini) framework memberi tahu kita tentang yang lain yang tidak kalah keren, kan? Anda hanya perlu berhati-hati dan mendengar.
Kabar Baik untuk Dunia dari Kategori TeoriSiapa di subjek, tentu saja, tahu bahwa contoh dengan IEnumerator <-> IObserver bukanlah hal baru.
Sangat mengejutkan bahwa jarang ada orang yang menyadari bahwa ini jauh dari satu-satunya contoh (walaupun kita harus membayar upeti, khususnya yang ini sangat cerah).
Orang-orang yang ingin tahu dapat mengambil pola GoF yang tersisa dan melihat dualisme mereka. Sering kali omong kosong total akan muncul - ini normal: dalam dirinya sendiri, "dualitas" lebih tinggi dari dunia di bumi dan tidak menganggap dirinya berkewajiban untuk memperhitungkan penggunaan praktis: tetapi bagaimanapun juga, Matahari juga tidak memerlukan apa pun dari orang untuk bersinar.
Lalu mengapa "hampir keren"? Ya, karena ketidakharmonisan yang menyebabkan kebutuhan untuk lebih menggiling dan memotong. Sebenarnya, membalikkan panah, ternyata sesuatu yang tidak terlalu berguna, yang dapat diartikan sebagai kelemahan dari tanda tangan asli. Ke depan, saya akan mengatakan bahwa tanda tangan ini dapat didefinisikan ulang sedemikian rupa sehingga ketidakharmonisan menghilang dan akan sangat mudah untuk beralih ke dual. Tapi saya tidak akan repot-repot dengan ini ... setidaknya - tidak dalam catatan ini.
Lebih baik untuk meringkas, berdasarkan sepenuhnya pada pengalaman saya:
- Tanda tangan fungsi dapat berbicara, tetapi programmer sering tuli.
- Setiap kali Anda menemukan fungsi yang dirancang dengan baik, tanyakan pada diri sendiri apa dualisnya dan apakah itu bisa berguna untuk tugas apa pun.
- Jika dual ada, tetapi membutuhkan "sedikit modifikasi" seperti pada contoh di atas, maka kemungkinan besar tanda tangan asli memiliki beberapa cacat implisit; mungkin masuk akal untuk mendefinisikannya kembali sehingga tidak ada masalah seperti itu?