Aynı mantığı uygulayan iki dilde yazılmış kod tabanlarını korumanın bazı yolları nelerdir?


10

Ben iki dilde kodlamak için gereken bir mantık yoğun algoritması var (aslında bir dilde tatmin edici bir şekilde bitirdi ve diğer dilde kodlamaya başlamak üzereyim). Yoğun mantıksal olarak, algoritmanın önemsiz olduğunu, dikkatli bir anlayışa ihtiyaç duyduğunu ve daha da önemlisi, gelecekte yamanması gereken hataları (karmaşıklık ve dikkatsizlik nedeniyle, biliyor olabilirsiniz) kastediyorum.

Ayrıca, bu kodun el değiştirdiğinde, sonunda, yeni programcıları boğmaması gerektiğinden emin olmak istiyorum.

Bu senaryo göz önüne alındığında, kod tabanlarının korunmasına ve senkronize kalmasına yardımcı olacak bazı yöntemler nelerdir? Yani yazılım araçları, en iyi uygulamalar vb.

FYI iki dil C ++ ve Java. Windows da dahil olmak üzere C ++ / Linux ve Android dahil "her şey" için Java.


3
Gerçekten başka bir dilde yeniden uygulamak zorunda mısınız? Neden sadece Java kullanmıyorsunuz?
Oleksi

@Oleksi Kod yerel olarak çalıştığında en iyisidir, bu yüzden Java sadece C ++ 'ın kullanılamadığı bir uzlaşmadır.
vin

13
Sadece bu performansa ihtiyacınız olduğundan emin olun. Bir programın iki versiyonunu (özellikle de bu kompleksi) korumak, büyük bir çabadır. Bunu kesinlikle C ++ ile yapmanız gerektiğinden emin olun , çünkü bunu iki dilde yapmak için büyük bir zaman ve çaba harcayacaksınız.
Oleksi

9
@Oleksi'nin dediği gibi - bir Driod üzerinde Java'da kabul edilebilir bir şekilde çalışırsa, PC'nin C ++ 'ın vereceği (muhtemelen marjinal) iyileştirmelere ihtiyaç duyduğunu düşünemiyorum. Performans testleri yaptığınızı belirtmediğiniz gibi, sanmıyorum, bu durumda bu erken optimizasyon gibi kokuyor. Java ile yazın, performans testleri yapın, Java'yı optimize edin. Ancak o zaman bir C ++ yeniden yazmayı düşünün - bunun yerine bir kod tabanını koruyarak kaydedilen zaman, bunun yerine optimizasyona konur, neredeyse kesinlikle iki kod tabanını, her şeyin iki kümesini (gereksinimler hariç) sürdürür.
mattnz

@thePrivateProject define en iyi çalışır , her iki durumda da (C ++ veya Java) iyi yazılmış kod taşınabilir olmalıdır .

Yanıtlar:


16

Kısa cevap: kesinlikle zorlamadığınız sürece bunu yapmayın.

C ++ kullanmanız gerekiyorsa, C ++ 'da Android için algoritmanızı oluşturmak ve sonra UI için ince bir Java sarmalayıcısı eklemek için NDK kullanmayı düşünebilirsiniz . NDK kullanmanın, kodunuzun farklı donanım türlerine göre çok daha az taşınabilir olduğu anlamına geldiğini unutmayın. Bu, her yerde Java kullanmak için kesinlikle tercih edilmez, ancak iki kod tabanından daha iyidir.

Bunu kesinlikle yapamıyorsanız ve iki kod tabanı olması gerekiyorsa, işte üç öneri:

1) Unity gibi taşınabilir yazılımlara yönelik bir araç arayın .

2) Kodun karmaşık bitlerini verilere veya bir komut dosyası diline çekmeye çalışın. Komut dosyası dili ile başa çıkmak için oldukça genel bir kod yazabiliyorsanız, test etmek ve iki kez doğru almak daha kolaydır. (Özellikle başka biri tarafından oluşturulan standart bir dilse.) O zaman karmaşık bitler için bir kod tabanına sahip olabilirsiniz. (Yerleştirilebilirliğe yönelik Lua'yı deneyebilirsiniz.)

3) Diğer yanıt durumlarında olduğu gibi, her iki kod kümesini de doğrulamak için bir test takımı oluşturun. Bunun doğru olması gerçekten zor. Tam olarak bunu yaptıktan sonra, özellikle hata durumlarında hangi sürümün "doğru" olduğu konusunda birçok tartışmaya yol açtığını söyleyebilirim.

(2) ve (3) birlikte kullanılabilir.


4
Güzel nokta. Düşünülmesi gereken bir diğer şey, bir set regresyon testi yazmak ve her iki uygulamayı da test etmek (örneğin SWIG aracılığıyla).
James Youngman

15

Bir İnşa tek aynı şekilde davranmasına hem kod üsleri sağlayabilirsiniz harici test paketi. "Tek" kelimesine daha fazla önem veriyorum çünkü aksi takdirde iddialarında farklılık gösterebilecek iki test paketini sürdürmeniz gerekecek . Bunun nasıl yapılacağı hakkında herhangi bir öneri yok, ama bu tür bir kod tabanı üzerinde çalışırken (ve gelecekteki geliştiriciler) akıl sağlığını korumak için bir yol gibi görünüyor.


4

önce java ve C ++ 'ya dönüşerek veya doğrudan makine koduna ve java bayt koduna derleyebilen bir dil kullanabilirsiniz. En son LLVM'nin her ikisi için de arka uçları olduğunu kontrol ettim

edit: wiki sörf biraz Java makine kodu java derleyebilirsiniz GCJ var


4

Bence bir programcı için en önemli kural "Kendinizi Tekrar Etmeyin" dir. Önerdiğiniz, bu kuralın açık bir ihlalidir.

Ciddi bir şekilde algoritmayı sadece bir kez uygulamak için bir yol bulmak öneririz. Şu anda iki farklı yaklaşım düşünebiliyorum.

  • Etki alanına özgü bir dil kullanın. Belki de algoritma, uygulamayı çalıştırmayı beklediğiniz tüm platformlarda bir ayrıştırıcının bulunabileceği farklı bir dilde, örneğin bir komut dosyası dilinde daha iyi ifade edilebilir veya DSL kodunu temel alarak C ++ / Java kodu oluşturabilirsiniz.

  • Her şeyi C ++ ile yazın. C ++ hemen hemen her platforma derlenebilir. Bazı platformlarda ana uygulamanın Java ile yazılmasını istiyorsanız, yerel bir kütüphaneyi çağırmanın mümkün olduğunu tahmin ediyorum (Java'da çok bilgili değilim, ancak yapılabileceğini varsayıyorum).

Aynı algoritmanın iki farklı platformda tutulması yalnızca ağrıya ve böceklere neden olabilir.


Sanırım sizce bir işletim sistemi, ofis üretkenliği, bir video oynatıcı yazılım paketi
olmalı

1
@mattnz - Demek istediğimi tamamen yanlış anladın. "DRY" programlama prensibinden bahsediyorum. Bu ilke hiçbir şekilde yalnızca tek bir işletim sistemi, ofis paketi, vb. Olması gerektiğini göstermez. DRY'ye yapışırken birden çok platform için kolayca bir ürün üretebilirsiniz.
Pete

2

Ortak bir harici test paketi kullanmak için mükemmel tavsiyeye ek olarak, okuryazar programlamaya bakmak isteyebilirsiniz . Okuryazar programlama araçları, tek bir kaynak dosyadan birden fazla dosya üretmenizi sağlar.

LP'nin geleneksel kullanımı, belgeleri kaynak koduna çok yakın tutmanıza izin verecek şekilde belgeleri kodla birlikte eklemenize izin verir . Tek bir noweb dosyası (örneğin), (diyelim) LaTex kullanılarak daha büyük bir belgede derlenebilecek bir dokümantasyon dosyası oluşturmak .cppve .huygulamanızda derlenebilecek bir ve dosyası üretmek için kullanılabilir.

Sizin durumunuzda, hem kod tabanlarını hem de belgeleri bir arada tutmanıza ve bir .javadosya oluşturmanıza izin verebilir .

Belgelerin ve farklı kod sürümlerinin, mantıksal olarak eşdeğer bölümlere ayrılmış tek bir dosyada bir arada tutulması, bunların birbiriyle senkronize olmasını çok daha kolay hale getirmelidir.


2

Bu, testlerin yararlı olabileceği iyi bir örnektir.

Her iki kod tabanı karşı çalıştırmak tek bir test paketi sahip öneririz . Daha sonra kod tabanlarınızın aynı spesifikasyona uygun olduğunu biliyorsunuz!

(ve iyi bir test kapsamına sahip olun!)



0

feragat

Daha önce de belirtildiği gibi, gerçekten başka bir seçeneğiniz yoksa mesajlar.

Cevap

Tek bir cevap yerine birkaç pratik öneri:

(1) Aynı şeyler farklı yapılabilse bile ortak yapıları kullanın.

Örnek: "Object Pascal" ve "C ++" ile aynı kodun olması gerekiyordu.

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

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

Olarak değiştirildi:

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

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

Her iki dile de parantez eklendi. Başka bir durum, gerekli ad alanlarına karşı isteğe bağlı ad alanları ("paketler") olacaktır.

(3) Tanımlayıcıların adlarını, büyük / küçük harfe duyarlılığı, özel türleri, benzerlerini kullanın, takma adları kullanın, alt sınıflandırma, sarma:

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

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

// C++
// 
include <iostream>

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

İçine:

// 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");

...

özet

Genellikle birkaç programlama dili ile çalışmak zorundayım ve bazı programlama dillerinde tuttuğum bazı özel "çekirdek" kütüphaneler var.

İyi şanslar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.