Saya memiliki algoritma intensif logika yang saya perlu kode dalam dua bahasa (sebenarnya saya menyelesaikannya dalam satu bahasa dengan memuaskan dan saya akan memulai pengkodean dalam bahasa lain). Secara logika intensif maksud saya algoritma ini tidak sepele, perlu pemahaman yang cermat dan, yang penting, bisa saja memiliki bug (karena kompleksitas dan kecerobohan, Anda tahu) yang harus ditambal di masa depan.
Juga, saya ingin memastikan bahwa ketika kode ini berpindah tangan, pada akhirnya, itu tidak akan membebani programmer baru.
Dengan skenario ini, beberapa cara apa yang akan membantu mempertahankan basis kode dan menjaganya tetap sinkron? Maksud saya alat perangkat lunak, praktik terbaik dll.
FYI kedua bahasa tersebut adalah C ++ dan Java. C ++ untuk Windows / Linux dan Java untuk "segalanya" termasuk Android.
Jawaban:
Jawaban singkat: jangan lakukan ini kecuali benar-benar dipaksakan.
Jika Anda harus menggunakan C ++, maka Anda dapat mempertimbangkan menggunakan NDK untuk membangun algoritme untuk Android di C ++ dan kemudian menambahkan pada pembungkus Java tipis untuk UI. Perhatikan bahwa menggunakan NDK berarti kode Anda jauh lebih portabel untuk berbagai jenis perangkat keras. Ini jelas tidak disukai untuk menggunakan Java di mana-mana, tetapi lebih baik daripada memiliki dua basis kode.
Jika Anda benar-benar tidak dapat melakukan ini, dan harus memiliki dua basis kode, berikut adalah tiga saran:
1) Cari alat seperti Unity yang diarahkan untuk perangkat lunak portabel.
2) Cobalah untuk menarik bit kode yang kompleks ke dalam data, atau bahasa scripting tertentu. Jika Anda dapat menulis kode yang cukup umum untuk berurusan dengan bahasa scripting, lebih mudah untuk menguji dan memperbaiki dua kali. (Terutama jika itu adalah bahasa standar yang dibuat oleh orang lain.) Kemudian Anda dapat memiliki satu basis kode untuk bit kompleks. (Anda dapat mencoba Lua, yang diarahkan untuk kemampuan embeddability.)
3) Seperti yang dinyatakan oleh jawaban lainnya, buat rangkaian uji untuk memvalidasi kedua set kode. Perhatikan bahwa ini sangat sulit untuk diperbaiki. Setelah melakukan hal ini dengan tepat, saya dapat memberi tahu Anda bahwa hal itu menarik banyak perdebatan tentang versi mana yang "benar", terutama dalam kasus kesalahan.
(2) dan (3) dapat digunakan bersama.
sumber
Membangun satu paket uji eksternal yang dapat memastikan kedua basis kode berperilaku dengan cara yang sama. Saya memberikan penekanan ekstra pada kata "tunggal" karena jika tidak, Anda harus mempertahankan dua suite tes yang dapat berbeda dalam pernyataan mereka. Saya tidak punya saran tentang cara melakukan ini, tetapi sepertinya ini adalah salah satu cara untuk menjaga kewarasan Anda (dan pengembang masa depan) ketika mengerjakan jenis kode dasar ini.
sumber
Anda bisa menggunakan bahasa yang dapat dikompilasi ke dalam kode mesin dan kode byte java baik dengan terlebih dahulu mentransformasikannya menjadi java dan C ++ atau secara langsung. Terakhir saya memeriksa LLVM memiliki back-end untuk keduanya
sunting: sedikit berselancar wiki membuat saya ke GCJ yang dapat mengkompilasi kode java ke mesin
sumber
Menurut pendapat saya, aturan paling penting bagi seorang programmer adalah, "Jangan Ulangi Diri Sendiri". Apa yang Anda sarankan adalah pelanggaran yang jelas terhadap aturan ini.
Saya sangat menyarankan agar Anda menemukan cara untuk hanya mengimplementasikan algoritma sekali. Saat ini saya dapat memikirkan dua pendekatan yang berbeda.
Gunakan bahasa khusus domain. Mungkin algoritme dapat diekspresikan dengan lebih baik dalam bahasa yang berbeda, misalnya bahasa skrip, yang dapat digunakan parser di semua platform yang Anda harapkan menjalankan aplikasi, atau Anda dapat membuat kode C ++ / Java berdasarkan kode DSL.
Tulis semuanya dalam C ++. C ++ dapat dikompilasi ke hampir semua platform. Jika pada beberapa platform Anda memerlukan aplikasi utama untuk ditulis dalam Java, saya kira mungkin untuk memanggil perpustakaan asli (saya tidak terlalu berpengetahuan di Jawa, tapi saya berasumsi bahwa itu bisa dilakukan).
Mempertahankan algoritma yang sama pada dua platform yang berbeda hanya dapat menyebabkan rasa sakit dan bug.
sumber
Selain saran yang sangat baik untuk menggunakan test suite eksternal yang umum Anda mungkin ingin melihat ke pemrograman terpelajar . Alat pemrograman melek memberi Anda kemampuan untuk menghasilkan banyak file dari satu file sumber.
Penggunaan LP tradisional adalah untuk memungkinkan Anda melakukan interleave dokumentasi dengan kode dengan cara yang memungkinkan Anda untuk menjaga dokumentasi sangat dekat dengan kode sumber. File noweb tunggal (misalnya) dapat digunakan untuk menghasilkan file dokumentasi yang dapat dikompilasi menjadi dokumen yang lebih besar menggunakan (katakanlah) LaTex, dan menghasilkan file
.cpp
dan.h
yang dapat dikompilasi ke dalam aplikasi Anda.Dalam kasus Anda, ini bisa memungkinkan Anda untuk menjaga basis kode dan dokumentasi bersama, menghasilkan
.java
file juga.Menyimpan dokumentasi dan versi kode yang berbeda bersama-sama dalam satu file, dipecah menjadi bagian yang setara secara logis, akan membuatnya lebih mudah untuk menjaga mereka semua sinkron satu sama lain.
sumber
Ini adalah contoh yang bagus di mana tes dapat membantu.
Saya akan menyarankan memiliki satu test suite yang dijalankan oleh kedua basis kode Anda. Maka Anda tahu bahwa basis kode Anda keduanya sesuai dengan spesifikasi yang sama!
(dan, memiliki cakupan tes yang baik!)
sumber
Pertimbangkan kode yang menghasilkan C ++ dan Java dari beberapa bahasa lain
sumber
Penolakan
Seperti disebutkan dalam posting sebelumnya, jika Anda tidak benar-benar punya pilihan lain, maka.
Menjawab
Beberapa saran praktis, alih-alih satu jawaban:
(1) Gunakan struktur umum, bahkan, jika hal yang sama dapat dilakukan secara berbeda.
Contoh: Saya harus memiliki kode yang sama dalam "Object Pascal" & "C ++", di mana kalimat "jika" ada di keduanya, tanda kurung dalam "C ++" diperlukan, tetapi, tidak dalam "object Pascal".
Diubah menjadi:
Menambahkan tanda kurung ke kedua bahasa. Kasus lain adalah ruang nama opsional versus ruang nama yang diperlukan ("paket").
(3) Simpan nama pengidentifikasi, sensitivitas huruf, jenis khusus, serupa, gunakan alias, subclassing, pembungkus:
Ke:
...
Ringkasan
Saya biasanya harus bekerja dengan beberapa bahasa pemrograman, dan ada beberapa perpustakaan "inti" khusus, yang saya simpan dalam beberapa bahasa pemrograman.
Semoga berhasil.
sumber