Masalah apa yang bisa muncul dari meniru konsep dari bahasa lain?

12

Saya telah membaca berkali-kali di web bahwa jika bahasa Anda tidak mendukung beberapa konsep, misalnya, orientasi objek, atau mungkin panggilan fungsi, dan itu dianggap praktik yang baik dalam konteks lain ini, Anda harus melakukannya.

Satu-satunya masalah yang dapat saya lihat sekarang adalah bahwa programmer lain mungkin menemukan kode Anda terlalu berbeda dari biasanya, sehingga menyulitkan mereka untuk memprogram. Apa masalah lain yang menurut Anda mungkin timbul dari ini?

Julio Rodrigues
sumber
3
Orang-orang akan mengolok-olok Anda, untuk satu hal :-)
Karl Bielefeldt
Saya telah menerjemahkan fungsi parser bersarang dari D ke java sekali tetapi saya akui itu bukan bagian kode terbersih yang pernah saya tulis (satu fungsi besar dengan antarmuka dan beberapa kelas mengimplementasikannya didefinisikan di dalamnya)
ratchet freak

Jawaban:

23

Salah satu masalah adalah bahwa Anda mungkin menemukan diri Anda menulis banyak kode untuk mengekspresikan sesuatu dengan cara yang akan Anda lakukan dalam bahasa lain, sementara ada cara yang lebih mudah dalam bahasa yang Anda gunakan.

Misalnya, dalam jawaban tentang Stack Overflow , saya telah menjelaskan bagaimana kontrak kode, konsep yang digunakan dalam .NET Framework, dapat sebagian ditiru dalam PHP yang tidak mendukungnya. Saya akhirnya menulis banyak kode tanpa biaya, karena hal yang sama dapat dilakukan dengan array sederhana.

Secara umum, setiap bahasa memiliki budaya sendiri, praktik terbaiknya sendiri, gayanya sendiri.

  • Jika saya mulai menulis kode C # seperti itu C, itu akan jelek.

  • Jika saya menangkap Haskell sebagai pengembang Java yang terpaksa menggunakan Haskell, tetapi tidak ingin memahami kekuatannya dan hanya ingin mengkloning konsep Java, kode yang saya tulis akan menderita.

  • dll.

Tidak ada salahnya mencoba meningkatkan bahasa (misalnya meningkatkan C # dengan memperkenalkan satuan ukuran seperti dalam F #), tetapi jika Anda melakukannya terlalu banyak, Anda mungkin harus memilih bahasa yang berbeda yang benar-benar sesuai dengan kebutuhan Anda.

Arseni Mourzenko
sumber
+1 Jawaban yang bagus, dan terima kasih untuk istilah pencarian tambahan dengan menambahkan satuan ukuran ke C # seperti di F #.
2
Sebagai orang yang pernah berhenti dari pekerjaannya karena dipaksa untuk menggunakan Java, 2 sen saya: seseorang tidak bisa dipaksa untuk menggunakan Haskell, seseorang jatuh cinta padanya dan kemudian itu menyebalkan Anda hingga tidak bisa kembali. Haskell adalah seperti satu lubang hitam yang indah yang hanya ingin Anda jatuhkan - dan tidak seperti yang asli, Anda masih hidup untuk menceritakan kisahnya :)
Cetin Sert
Anda mungkin harus memilih bahasa lain ... kecuali ketika Anda tidak punya pilihan, seperti JavaScript sisi klien. (Meski begitu, tidak punya pilihan bukan alasan untuk menerapkan emulasi OOP berbasis kelas dalam bahasa prototipe. Jauh lebih efisien untuk hanya belajar bagaimana bahasa bekerja.)
kojiro
@kojiro: atau pekerjaan lain. Saya memiliki masalah yang sama ketika saya dipaksa untuk menggunakan PHP, dan saya terus-menerus mencoba memodifikasi bahasa, termasuk menulis kompiler saya sendiri. Solusi yang kurang gila adalah mengubah pekerjaan saya dan mulai bekerja hanya pada proyek-proyek yang tidak menggunakan PHP.
Arseni Mourzenko
1
@Cetin Sert: setuju, Haskell adalah bahasa yang sangat baik. Tetapi jika seseorang tidak ingin mempelajarinya dan tidak mengerti pemrograman fungsional, akan sulit untuk menghargai Haskell.
Arseni Mourzenko
10

DropKurangnya keterbacaan cukup menjadi masalah tersendiri: penurunan drastis orang yang berpotensi mempertahankan proyek Anda tanpa pelatihan ekstensif dari Anda.

Tambahan,

  • Menerapkan paradigma asing mungkin lebih mahal daripada potensi penghematan dari penggunaannya
  • Adaptasi Anda terhadap fungsionalitas asing mungkin buggy, sehingga menambah biaya perawatan
  • Adaptasi Anda terhadap fungsionalitas asing dapat mendorong tumpukan teknologi Anda ke batas di luar yang disyaratkan oleh implementasi asli Anda.
dasblinkenlight
sumber
2
Saya pernah harus meniru pengiriman dinamis C ++ (tabel virtual, dll) di vanilla C, dan mengalami masalah ini: programmer C yang tidak memahami pengiriman dinamis tidak dapat berkontribusi atau mempertahankan proyek.
comingstorm
4

Itu bukan ide yang baik seperti yang terlihat di atas kertas.

Contoh 1: Jika Anda sudah cukup tua, Anda mungkin ingat hari-hari ketika C adalah anak baru di kota. Pemrogram Pascal dan Ada tidak suka kurung kurawal buka dan tutup. Mereka #defined begindan enduntuk membuka brace dan menutup brace, dan voila! CAda! Hasil yang disayangkan buruk dari perspektif Baik atau C.

Contoh 2, pribadi: Salah satu hal yang sangat saya sukai dari Common Lisp Object System adalah sebelum, sesudah, dan sekitar metode. Mereka bisa sangat berguna di banyak tempat. Jadi saya meniru konsep ini dalam C ++ di beberapa tempat tertentu. Satu-satunya cara untuk meniru konstruksi ini di C ++ adalah dengan mengharuskan pengembang kelas turunan untuk memanggil metode kelas induk dengan nama yang sama di tempat yang tepat dalam kode. Ini menempatkan persyaratan pada pengembang yang berasal dari kelas saya yang agak asing untuk pemrograman C ++, dan mungkin bertentangan dengan pemrograman C ++. Tidak peduli seberapa baik didokumentasikan persyaratan ini, orang hanya tidak mengikuti pedoman karena tidak cukup sesuai dengan paradigma C ++.

David Hammen
sumber
2

Masalah apa yang bisa muncul dari meniru konsep dari bahasa lain?

Abstraksi bocor.

Jim G.
sumber
Mungkin menyenangkan untuk memasukkan lebih banyak detail dalam jawaban Anda. Artikel ini berkaitan dengan kasus di mana abstraksi gagal menangkap optimalisasi kinerja yang signifikan, tetapi saya akan mengatakan masalah yang lebih besar muncul dari perilaku kasus sudut yang tidak konsisten dan jaminan yang tidak konsisten; contoh dari yang terakhir adalah upaya C # untuk meniru outparameter dalam kerangka kerja yang tidak benar-benar mendukungnya; C # mengasumsikan bahwa setiap fungsi akan selalu menulis ke semua outparameternya, tetapi metode non-C # yang dipanggil oleh metode C # tidak menawarkan jaminan seperti itu.
supercat
1

Ini bisa sangat sulit. Bayangkan mencoba mengimplementasikan LINQ dari C # ke dalam aplikasi Java Anda. Atau bagaimana kalau hanya menambahkan penutupan leksikal ke suatu bahasa? Anda cukup banyak harus menulis kompiler baru, yang cukup banyak memberi Anda bahasa baru.

Atau, untuk kasus-kasus di mana Anda tidak harus mengimplementasikan bahasa Anda sendiri, bayangkan saja mencoba menerapkan metode pengumpulan menggunakan fungsi tingkat tinggi (seperti peta) dalam bahasa yang tidak memiliki blok kode atau fungsi lambda atau penutupan atau fungsi sebagai yang pertama benda-benda kelas. Setiap fungsi urutan yang lebih tinggi harus dinyatakan sebagai antarmuka dan diimplementasikan secara eksplisit, dan semua negara yang akan ditangkap dalam penutupan harus secara eksplisit disimpan di kelas implementasi. Mengetik terlalu banyak, dan jauh lebih sulit untuk dibaca, sehingga seringkali tidak sepadan.

psr
sumber