codice delle lingue annidate odore [chiuso]

3

Molti progetti combinano le lingue, ad esempio sul web con l'ubiquissimo linguaggio SQL + lato server + markup du jour + JavaScript + CSS mix (spesso in una singola funzione). Bash e altro codice shell sono mischiati con Perl e Python sul lato server, eval ed e talvolta persino passati attraverso sed prima dell'esecuzione. Molti linguaggi supportano l'esecuzione in runtime di stringhe di codice arbitrarie e in alcuni sembra essere una pratica abbastanza comune. Oltre ai consigli sulla sicurezza e separazione delle preoccupazioni ,

  1. quali altri problemi esistono con questo tipo di programmazione,
  2. cosa può essere fatto per ridurlo a icona e
  3. è mai difendibile (tranne nella situazione "PHB sulla spalla")?

Modifica: per chiarire, questo è non sull'uso di più di una lingua per il lavoro - Questa è una buona cosa per qualsiasi progetti più semplici. Il problema è mescolare le lingue nello stesso file , come le stringhe magiche per SQL, Bash & Perl eval , e simili.

    
posta l0b0 28.06.2011 - 17:16
fonte

5 risposte

8

Altri problemi

Trovo che la combinazione dei linguaggi possa causare:

  • codice per diventare illeggibile;
  • sottile "incoraggiamento" agli sviluppatori ad usare la lingua sbagliata per il lavoro sbagliato;
  • codice sorgente più lungo;
  • sottile 'incoraggiamento' della programmazione copy-n-paste.

Riducendolo al minimo

È semplicemente una questione di educazione degli sviluppatori. Sul lato frontale del web ci sono degli standard ben stabiliti per esternare JavaScript e CSS dall'HTML. Meno si può fare per quanto riguarda il codice sorgente HTML che è in realtà parte di un meccanismo di template linguistico lato server (PHP, ASP, JSF, JST, et al.), Ma anche quello può essere presentato in modo pulito.

Sul lato server ci sono modelli DAO ben consolidati che assicurano che SQL sia tutto in una volta (e speriamo che anche gli attacchi di iniezione siano mitigati).

È difendibile?

Mescolare le lingue non è sempre sbagliato di per sé, specialmente se può aggiungere chiarezza al codice sorgente in un modo sicuro (cioè, non introduce un problema di sicurezza). In genere, sto lontano dal mixaggio il più possibile, principalmente a causa di problemi di leggibilità e sicurezza.

    
risposta data 28.06.2011 - 18:02
fonte
6

Altre questioni a cui posso pensare, oltre a quelle che Martijn ha notato.

  • Svita l'evidenziazione del codice negli editor di testo
  • Rende difficile separare le attività tra i membri del team
risposta data 28.06.2011 - 18:10
fonte
2

Un altro problema che a volte vedo, specialmente nel missaggio di SQL con altri linguaggi, è che il codice annidato non è controllato dalla sintassi dall'IDE; è in qualche blocco che l'IDE sa che non è la sua lingua nativa e quindi non si preoccupa, o è in una stringa (una "stringa magica" come spesso ho sentito chiamarli) che è semplicemente dati fino a qualche caratteristica del framework lo traduce o lo trasmette in qualche forma o luogo dove può ora essere interpretato ed eseguito come codice. Questo controllo della sintassi in fase di compilazione eseguito alla fine aumenta notevolmente la possibilità di errori di runtime che possono essere rilevati solo da test completi, con copertura al 100%.

A parte questo, sono d'accordo al 100% con i problemi elencati da Martijn, in particolare la leggibilità.

    
risposta data 28.06.2011 - 18:08
fonte
1

Ci sono alcuni grossi problemi che ho potuto vedere con questo:

  • Potrebbero essere richiesti dei generalisti che abbiano tutti un certo grado di competenza in tutte quelle aree, dal momento che si tratta di diversi tipi di design mescolati insieme, un DB relazionale, OO e UI. Potrebbe non essere facile trovare le poche brave persone a fare il lavoro.

  • La manutenzione di un tale sistema può essere problematica se tutto è insieme in un codice spaghetti o kludge in quanto ottenere un po 'di correzioni potrebbe richiedere più tempo rispetto al caso in cui le cose fossero suddivise in una soluzione meglio organizzata.

  • Potrebbero verificarsi problemi di prestazioni in quanto l'ottimizzazione del codice potrebbe non essere eseguita come se tutto fosse strutturato in modo diverso.

Per minimizzare questi:

  • Comunicare i compromessi con lo sponsor del progetto di fare la soluzione rapida e sporca rispetto a quella ben costruita che potrebbe richiedere un po 'più di tempo, ma fornire un valore migliore nel lungo periodo.

  • Suddividi i progetti in modo che avvengano le separazioni.

Difesa di tale pratica:

Il lavoro di dimostrazione del concetto ci viene in mente di un caso in cui mescolare le cose può essere meglio difeso in quanto ciò dimostra semplicemente che qualcosa è fattibile. Sfortunatamente, alcune persone non tecniche possono pensare che il prototipo debba essere usato in produzione e sia robusto senza rendersi conto di quello che avrebbero concordato.

    
risposta data 28.06.2011 - 18:13
fonte
0
  • Se mischi PHP (o altro linguaggio lato server) con JS, il tuo JS non sarà memorizzabile nella cache (se il tuo PHP non lo è).
  • Le lingue annidate sono come generatori di codice, molto difficile da capire il codice generato

La mia soluzione è minimizzare l'accoppiamento tra lingue diverse non generando mai codice, usando JSON come trasferimento di dati tra le lingue

Esempio PHP (strettamente accoppiato)

var arr = [];
<?php  
foreach($value in $phpArray) {
    echo "arr.push('$value');\n";
}
?>

Esempio PHP (liberamente accoppiato)

var arr = <?php echo json_encode($phpArray) ?>;

Nota che con json_encode non devi preoccuparti di eseguire il escape di stringhe o altri valori.

    
risposta data 24.04.2013 - 18:14
fonte

Leggi altre domande sui tag