From Less is Exponentially More
Jika C ++ dan Java adalah tentang hierarki tipe dan taksonomi tipe, Go adalah tentang komposisi.
programming-languages
go
composition
CMinus
sumber
sumber
Pertanyaan / masalah ini agak mirip dengan yang ini .
Di Go, Anda tidak benar-benar memiliki OOP.
Jika Anda ingin "mengkhususkan" suatu objek, Anda melakukannya dengan menanamkan, yang merupakan komposisi, tetapi dengan beberapa barang membuatnya sebagian mirip dengan warisan. Anda melakukannya seperti ini:
Dalam sampel ini, ConnexionMysql adalah jenis spesialisasi * sql.DB, dan Anda dapat memanggil ConnexionMysql fungsi yang didefinisikan pada * sql.DB:
Jadi pada pandangan pertama Anda mungkin berpikir bahwa komposisi ini adalah alat untuk membuat taksonomi Anda yang biasa.
Tapi
jika suatu fungsi yang didefinisikan pada * sql.DB memanggil fungsi-fungsi lain yang didefinisikan pada * sql.DB, itu tidak akan memanggil fungsi-fungsi yang didefinisikan ulang pada ConnexionMysql bahkan jika mereka ada.
Dengan warisan klasik, Anda sering melakukan sesuatu seperti ini:
Artinya, Anda mendefinisikan
doComplexThing
kelas super sebagai organisasi berdasarkan panggilan spesialisasi.Tetapi di Go, ini tidak akan memanggil fungsi khusus tetapi fungsi "superclass".
Jadi, jika Anda ingin memiliki algoritma yang perlu memanggil beberapa fungsi yang didefinisikan pada * sql.DB tetapi didefinisikan ulang pada ConnexionMySQL (atau spesialisasi lainnya), Anda tidak dapat mendefinisikan algoritma ini sebagai fungsi * sql.DB tetapi harus mendefinisikannya di tempat lain dan fungsi ini hanya akan menyusun panggilan ke spesialisasi yang disediakan.
Anda bisa melakukannya seperti ini menggunakan antarmuka:
Ini sangat berbeda dari pengesampingan klasik hierarki kelas.
Terutama, Anda jelas tidak dapat secara langsung memiliki tingkat ketiga yang mewarisi implementasi fungsi dari yang kedua.
Dalam praktiknya, Anda akan menggunakan sebagian besar antarmuka (ortogonal) dan membiarkan fungsi membuat panggilan pada implementasi yang disediakan alih-alih meminta "superclass" implementasi mengatur panggilan-panggilan tersebut.
Dalam pengalaman saya, ini mengarah pada tidak adanya hierarki praktis yang lebih dalam dari satu level.
Terlalu sering, dalam bahasa lain, Anda memiliki refleks, ketika Anda melihat bahwa konsep A adalah spesialisasi dari konsep B, untuk memverifikasi fakta ini dengan membuat kelas B dan kelas A sebagai subkelas B. Bukan membuat Anda program di sekitar data Anda, Anda menghabiskan waktu mereproduksi taksonomi objek dalam kode Anda, dengan prinsip bahwa ini adalah kenyataan.
Di Go, Anda tidak dapat menentukan algoritma umum dan mengkhususkannya. Anda harus menentukan algoritma umum dan memastikannya umum dan berfungsi dengan implementasi antarmuka yang disediakan.
Setelah merasa ngeri dengan semakin kompleksnya beberapa pohon hierarki di mana para pembuat kode membuat peretasan yang rumit untuk mencoba mengakomodasi suatu algoritma yang logikanya akhirnya menyiratkan semua tingkatan, saya akan mengatakan saya senang dengan logika Go yang lebih sederhana, bahkan jika itu memaksa Anda berpikir alih-alih hanya memahami konsep-konsep model aplikasi Anda.
sumber