Costruire oggetti con funzionalità arbitrarie

1

Sto cercando di individuare il modello di progettazione corretto per lo scenario seguente.

Sto cercando di creare un oggetto / binario con moduli diversi, un modulo è una funzionalità che voglio fornire a quell'oggetto. Gli esempi di un modulo sono come leggere un file, scrivere un file, inviare alcune richieste al server, ecc ...

Diciamo che ho le seguenti funzioni

func readFiles(path) {
  /* */ 
}

func writeFiles(Content, Path) {
  /* */
}

func playMusic(path) {
    /*  */ 
}

func playVideo(path) {
    /* */
} 

Il programma oggetto / client di solito avrà la seguente funzionalità prendendo input dall'utente

switch input {
    case "playmusic":
       call playmusic('path') 
    case "playvideo":
       call playvideo('path') 
    case "readfile":
       call readfile('path') 
    case "writefile":
       call writefile('path') 
    default:
       /* Cannot understand your input */ 
}

L'approccio sopra funziona bene se voglio includere tutte le funzioni nell'oggetto e genererò un file binario che contiene tutte le funzioni.

Ma per ora, voglio fornire una maggiore granularità durante la generazione del file binario. Voglio che l'utente sia in grado di scegliere la funzione che desidera includere nel binario e quindi le funzioni non utilizzate non saranno incluse nel file binario. Quale modello di design sarà adatto a questo?

Ho pensato al motivo del decoratore, ma non è esattamente giusto dal momento che non sto decorando una funzione, sono tutte funzioni separate.

Ho controllato lo schema della strategia, ma non è esattamente corretto visto che includerà comunque tutte le funzioni ma semplicemente modificando la strategia in fase di runtime.

    
posta Timothy Leung 12.09.2018 - 06:39
fonte

1 risposta

1

"Includi nel binario" significa che usi un linguaggio compilato. Gli schemi di progettazione da soli non sono sufficienti per ottenere questo effetto.

3 scenari possono ottenere questo risultato, se la tua lingua lo supporta:

  • compilazione condizionale: il preprocessore esclude alcune parti del codice dal processo di compilazione. Alcune lingue ottengono lo stesso risultato senza il preprocessore identificando le espressioni costanti ed eliminando il codice non corretto.
  • meta programming: la costruzione del linguaggio genera del codice alla compilazione in base ai parametri del tempo di compilazione (ad esempio i modelli C ++). Il design basato su criteri è un esempio in cui i pattern combinati con la meta-programmazione possono fare esattamente quello che stai cercando.
  • collegamento intelligente: il linker include solo i moduli necessari. Ecco come funzionano le librerie: i moduli indipendenti sono impacchettati in una libreria; il linker includerà nel file binario solo i moduli di cui simboli (ad esempio playmusic ) che appaiono nel codice oggetto da collegare (cioè il codice compilato dal client)

Naturalmente, tutti questi mezzi richiedono che le diverse parti vengano incapsulate e disaccoppiate. Qui i modelli potrebbero aiutare.

Se la tua lingua non supporta queste possibilità, allora tutto il tuo codice potrebbe essere incluso nell'output (bytecode, codice sorgente compresso, ...). Tutto ciò che puoi fare è quindi utilizzare alcuni opzioni di attivazione e utilizzare un codice di configurazione per attivare l'interruttore e impedire alcune parti di essere invocato accidentalmente.

    
risposta data 12.09.2018 - 08:28
fonte

Leggi altre domande sui tag