We have a wide variety of customers and each has different business rules. Instead of having a single compiled code base, we are considering having different templated script files for each customer.
Direi che la premessa per questo è un po 'errata. Stai cercando una sorta di codifica modulare. Questo può essere fatto anche con altre lingue. Definisci i moduli, crea una Fabbrica che serve quello che vuoi e usalo. Probabilmente è molto più semplice che provare a tentare più volte la fonte stessa.
In addition, we need to get data into the scripts. So, we are thinking we will have variable declarations in the script, and those variables will be set to some character sequence that we will treat as a token. Then with another app, we'll process the document looking for the tokens replacing them with the actual data.
Qui è dove le cose si fanno brutte.
Hai alcuni dati in alcuni file e alcuni preprocessori (fai finta che sia gnu m4 - se lo fai ritrovati seguendo questo percorso potresti anche usarne uno buono - il tag SO associato m4 ) che legge il file, identifica le macro del modello e modifica l'origine, che viene quindi distribuita al cliente.
Quindi ora hai qualcosa di simile
site = "_SITE_"
print site, "\n"
come un codice rubino e quindi un file macro
define('_SITE_','programmers.SE')
e poi lo si esegue tramite l'applicazione m4
$ m4 main.m4 main.rb
site = "programmers.SE"
print site, "\n"
Ora inizi a ricevere molte parti mobili. Devi assicurarti che ciascun file analizzi correttamente, che alcuni siti non includano qualcosa come "
che sarebbe una macro valida, ma una variabile non valida (la prenderai prima che vada al sito del cliente?) .
Soprattutto, è meglio sperare che il codice non diverga. Una volta che hai qualcosa di più della semplice esecuzione di una macro contro il codice, ma sostituendo il codice diventa brutto. Devi essere molto rigoroso con le convenzioni di denominazione in modo che i valori utilizzati in una parte della classe template non entrino in collisione con gli altri ... e che non usi nemmeno il valori da una parte del modello in un altro (si trascina solo quella parte del modello senza la parte modello che imposta i dati). Ottiene solo BRUTTO .
Peggio di tutto, e la cosa che ti brucerà alla fine con questo, non puoi testare il codice che scrivi. Puoi testare il codice che viene generato (vero?), Ma non sarai in grado di testare realmente il codice che scrivi facendo ciò che dovrebbe.
Il difetto fondamentale in questo pensiero è il mix dei dati e del codice. In sostanza, il codice che stai scrivendo in questo modello sono i dati per un processore macro che sputa il nuovo codice.
Se vuoi variabili di template, leggi quelle di un file di proprietà di qualche tipo.
Archivia i dati come dati e caricali come dati. Ad esempio, memorizzarlo in un oggetto JSON e caricarlo in un oggetto con la libreria appropriata ( ruby python ).
Quindi stai semplicemente distribuendo i diversi dati ai diversi siti (con lo stesso codice base) che indicano i valori che sono diversi tra loro. Utilizzerai i valori nei dati per chiamare il metodo factory corretto (che funziona bene da solo senza modelli e può essere testato su unità).