Quali sono alcuni modi per mantenere basi di codice scritte in due lingue che implementano la stessa logica?

9

Ho un algoritmo logico intensivo che ho bisogno di codificare in due lingue (in realtà l'ho terminato in una lingua in modo soddisfacente e sto per iniziare a programmare nell'altra lingua). Con logica intensiva intendo che l'algoritmo non è banale, richiede un'attenta comprensione e, soprattutto, potrebbe avere bug (a causa della complessità e della noncuranza, lo sai) che dovrebbe essere corretto in futuro.

Inoltre, voglio essere sicuro che quando questo codice cambia mano, alla fine, non deve sopraffare i nuovi programmatori.

Dato questo scenario, quali sono alcuni modi per aiutare a mantenere le codebase e mantenerle sincronizzate? Con parole intendo strumenti software, best practice ecc.

FYI le due lingue sono C ++ e Java. C ++ per Windows / Linux e Java per "tutto il resto" incluso Android.

    
posta vin 26.05.2012 - 20:10
fonte

8 risposte

16

Risposta breve: non farlo a meno che non sia assolutamente forzato.

Se devi usare C ++, potresti prendere in considerazione l'uso del NDK per costruire il tuo algoritmo per Android in C ++ e quindi aggiungere un sottile wrapper Java per l'interfaccia utente. Tieni presente che l'uso di NDK significa che il tuo codice è molto meno portabile a diversi tipi di hardware. Questo non è sicuramente preferibile usare Java ovunque, ma meglio che avere due basi di codice.

Se non puoi assolutamente farlo e devi avere due basi di codice, ecco tre suggerimenti:

1) Cerca uno strumento come Unity orientato al software portatile.

2) Prova a inserire i bit complessi del codice in dati o in alcuni linguaggi di scripting. Se riesci a scrivere codice abbastanza generico per gestire il linguaggio di scripting, è più facile testare e ottenere il doppio. (Soprattutto se si tratta di una lingua standard creata da qualcun altro.) Quindi è possibile avere una base di codice per i bit complessi. (Si potrebbe provare Lua, che è orientata verso l'incorporabilità.)

3) Come l'altra risposta afferma, creare una suite di test per convalidare entrambi i set di codice. Si noti che questo è davvero difficile da ottenere. Avendo fatto esattamente questo, posso dirti che ha alleggerito molti dibattiti su quale versione sia "giusta", specialmente nei casi di errore.

(2) e (3) possono essere usati insieme.

    
risposta data 26.05.2012 - 20:39
fonte
15

Crea una suite di test esterna singola in grado di garantire che entrambe le basi di codice si comportino allo stesso modo. Metto più enfasi sulla parola "singolo" perché altrimenti dovrai mantenere due suite di test che possono differire nelle loro affermazioni. Non ho alcun suggerimento su come farlo, ma sembra un modo per mantenere il vostro (e il futuro sviluppatori) la sanità mentale quando si lavora su questo tipo di base di codice.

    
risposta data 26.05.2012 - 20:30
fonte
4

potresti usare un linguaggio che può essere compilato in codice macchina e codice java byte trasformandosi prima in java e C ++ o direttamente. Ultimo ho controllato che LLVM ha back-end per entrambi

modifica: un po 'di navigazione con il wiki mi ha portato a GCJ che può compilare java al codice macchina

    
risposta data 26.05.2012 - 20:44
fonte
4

Secondo me, la regola più importante per un programmatore è "Non ripetere te stesso". Quello che suggerisci è una chiara violazione di questa regola.

Suggerirei seriamente di trovare un modo per implementare l'algoritmo solo una volta. Al momento posso pensare a due approcci diversi.

  • Utilizza un linguaggio specifico del dominio. Forse l'algoritmo può essere meglio espresso in una lingua diversa, ad es. un linguaggio di script, per il quale può esistere un parser su tutte le piattaforme su cui ci si aspetta di eseguire l'applicazione, oppure è possibile generare codice C ++ / Java basato sul codice DSL.

  • Scrivi tutto in C ++. Il C ++ può essere compilato praticamente su qualsiasi piattaforma. Se su alcune piattaforme richiedi che l'applicazione principale sia scritta in Java, suppongo che sia possibile chiamare una libreria nativa (non sono molto esperto in Java, ma presumo che possa essere fatto).

Mantenere lo stesso algoritmo su due piattaforme diverse può solo portare a problemi di dolore.

    
risposta data 27.05.2012 - 00:14
fonte
2

Oltre all'eccellente consiglio di utilizzare una suite di test esterna comune potresti voler esaminare programmazione alfabetica . Gli strumenti di programmazione literate ti danno la possibilità di produrre più file da un singolo file sorgente.

L'uso tradizionale di LP è quello di permetterti di interlacciare la documentazione con il codice in un modo che ti permetta di mantenere molto vicino la documentazione al codice sorgente. Un singolo file noweb (per esempio) potrebbe essere usato per generare un file di documentazione che potrebbe essere compilato in un documento più grande usando (diciamo) LaTex e producendo un file .cpp e .h che potrebbe essere compilato nella tua applicazione.

Nel tuo caso, potrebbe permetterti di mantenere insieme basi di codice e documentazione, producendo anche un file .java .

Mantenere la documentazione e le diverse versioni di codice in un unico file, suddiviso in sezioni logicamente equivalenti, dovrebbe renderlo molto più facile da mantenere tutti sincronizzati tra loro.

    
risposta data 29.05.2012 - 16:44
fonte
2

Questo è un buon esempio di dove i test possono essere utili.

Suggerirei di avere una singola suite di test in cui entrambi sono stati confrontati con la base di codice. Allora sai che il tuo codice si basa su entrambi le stesse specifiche!

(e, avere una buona copertura di prova!)

    
risposta data 29.05.2012 - 17:21
fonte
1

Considera il codice che genera il C ++ e Java da qualche altra lingua

    
risposta data 20.07.2016 - 16:05
fonte
0

responsabilità

Come accennato in precedenza, post, se non hai davvero altra scelta, allora.

risposta

Diversi suggerimenti pratici, invece di una singola risposta:

(1) Usa strutture comuni, anche se la stessa roba può essere fatta in modo diverso.

Esempio: dovevo avere lo stesso codice in "Object Pascal" & "C ++", dove la frase "if" esiste in entrambi, è richiesta la parentesi in "C ++", ma non in "oggetto Pascal".

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

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

Modificato per:

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

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

Aggiunti parentesi a entrambe le lingue. Un altro caso saranno spazi dei nomi opzionali rispetto agli spazi dei nomi richiesti ("pacchetti").

(3) Mantieni nomi di identificatori, case sensitive, tipi speciali, simili, usa alias, sottoclassi, wrapping:

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

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

// C++
// 
include <iostream>

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

Into:

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

...

Riepilogo

Di solito devo lavorare con diversi linguaggi di programmazione, e ci sono alcune librerie "core" personalizzate, che tengo in diversi linguaggi di programmazione.

Buona fortuna.

    
risposta data 29.05.2012 - 17:12
fonte

Leggi altre domande sui tag