Apa sajakah cara untuk mempertahankan basis kode yang ditulis dalam dua bahasa yang menerapkan logika yang sama?

10

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.

vin
sumber
3
Apakah Anda benar-benar harus mengimplementasikannya dalam bahasa lain? Mengapa tidak menggunakan Java saja?
Oleksi
@Oleksi Kode ini terbaik saat dijalankan secara native sehingga Java hanya kompromi di mana C ++ tidak dapat digunakan.
vin
13
Pastikan Anda benar-benar membutuhkan kinerja itu. Mempertahankan dua versi program (terutama yang kompleks ini), merupakan upaya yang sangat besar. Pastikan Anda benar - benar perlu melakukan ini dalam C ++, karena Anda akan membayar biaya besar dalam waktu dan upaya untuk melakukan ini dalam dua bahasa.
Oleksi
9
Seperti yang dikatakan @Oleksi - jika berjalan dengan wajar di Java pada sebuah Driod, saya tidak dapat membayangkan bahwa karena PC membutuhkan (mungkin marginal) perbaikan yang akan diberikan C ++. Karena Anda belum menyatakan bahwa Anda telah menjalankan tes kinerja, saya berasumsi tidak, dalam hal ini bau optimasi prematur. Tulis di Jawa, jalankan tes kinerja, optimalkan Java. Hanya kemudian mempertimbangkan penulisan ulang C ++ - waktu yang disimpan mempertahankan satu basis kode, sebagai gantinya optimaisation, hampir pasti akan melakukan mempertahankan dua basis kode, dua set segalanya (kecuali persyaratan).
mattnz
@ thePrivateProject mendefinisikan berjalan terbaik , dalam kedua kasus (C ++ atau Java) kode yang ditulis dengan baik harus portabel .

Jawaban:

16

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.

Gort the Robot
sumber
4
Poin bagus. Hal lain yang perlu dipikirkan adalah menulis satu set tes regresi dan menguji kedua implementasi dengan itu (misalnya melalui SWIG).
James Youngman
15

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.

Jeremy Heiler
sumber
4

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

aneh ratchet
sumber
4

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.

Pete
sumber
Saya kira menurut Anda harus ada satu sistem operasi, pada setelan produktivitas kantor, satu paket perangkat lunak pemutar video ........
mattnz
1
@ mattnz - Anda salah paham maksud saya. Saya mengacu pada prinsip pemrograman "KERING". Prinsip itu sama sekali tidak menyarankan bahwa seharusnya hanya ada satu sistem operasi, office suite, dll. Anda dapat dengan mudah menghasilkan produk untuk berbagai platform sambil tetap menggunakan DRY.
Pete
2

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 .cppdan .hyang dapat dikompilasi ke dalam aplikasi Anda.

Dalam kasus Anda, ini bisa memungkinkan Anda untuk menjaga basis kode dan dokumentasi bersama, menghasilkan .javafile 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.

Mark Booth
sumber
2

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
1

Pertimbangkan kode yang menghasilkan C ++ dan Java dari beberapa bahasa lain

Nick Keighley
sumber
0

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".

// Object Pascal
...
if MyBollExpression
begin
  ...
end;
...

// C++
...
if (MyBollExpression)
{
  ...
}
...

Diubah menjadi:

// Object Pascal
...
if (MyBollExpression)
begin
  ...
end;
...

// C++
...
if (MyBollExpression)
{
  ...
}
...

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:

// Java
// 
import java.io.*;

...
System.out("Hello World\n");
...

// C++
// 
include <iostream>

...
cout << "Hello World\n";
...

Ke:

// Java
// 
import java.io.*;

static class ConsoleOut
{
   void Out(string Msg)
   {
     System.out("Hello World\n");
   }
}

...
ConsoleOut MyConsole = new ConsoleOut();
...
MyConsole.out("Hello World\n");
...

// C++
// 
include <iostream>

public class ConsoleOut
{
   void Out(string Msg)
   {
     cout << "Hello World\n";
   }
}

...
ConsoleOut MyConsole = new ConsoleOut();
...
MyConsole.out("Hello World\n");

...

Ringkasan

Saya biasanya harus bekerja dengan beberapa bahasa pemrograman, dan ada beberapa perpustakaan "inti" khusus, yang saya simpan dalam beberapa bahasa pemrograman.

Semoga berhasil.

umlcat
sumber