Qual è il modo migliore per gestire una grande classe multi-file in Javascript?

3

Ho una classe molto ampia di 59 metodi e circa 3000 linee di codice. So che è molto più grande di quanto la maggior parte della gente vorrebbe, ma la classe rappresenta una macchina virtuale, e la maggior parte dei metodi sono funzioni di runtime, quindi penso che questa sia una delle volte in cui una grande classe è garantita.

La domanda che ho è come posso organizzare al meglio il codice sorgente di questa classe, poiché mi piacerebbe dividerlo in più file.

Inizialmente ho utilizzato il modello di classe di John Resig . Esporterei un oggetto letterale da ogni file, unirli insieme e quindi creare la classe. Funziona in modo molto adeguato, ma voglio passare alle classi ES.

Ho sperimentato il pattern Mixin da MDN . Ogni file può esportare una funzione, quindi posso combinarli insieme con reduce .

export default Base => class extends Base { ... }
const inherit = ( ...fns ) => fns.reduce( ( v, f ) => f( v ) )

const Glk = inherit( GlkAPI, DateTime, Fref, Misc, Stream, Style, Window )

Questo è funzionale, ma è convoluto e aggiunge molti livelli all'albero di ereditarietà, il che non è positivo per le prestazioni.

Quindi mi chiedo se ci sono delle opzioni migliori.

Cose che ho considerato:

  1. Esecuzione di una concatenazione del tempo di costruzione. Il file risultante potrebbe essere molto bello, come se fosse un singolo file con cui iniziare, ma perderei la possibilità di filtrare il codice sorgente, poiché l'interno di una classe non è valido al di fuori di quel contesto. Oppure potrei aggiungere un involucro di classe fittizio attorno a ciascun file, ma poi dovrei eliminarlo durante la combinazione, e questa non è una semplice concatenazione.

  2. Utilizza la dichiarazione di dattiloscritto che unisce . Questo suona bene in linea di principio, ma non penso che sia possibile unire le classi insieme e l'unione di una classe con uno spazio dei nomi non funzionerebbe in quanto le proprietà dello spazio dei nomi diventerebbero proprietà di classe statiche.

  3. Crea una classe semplice e quindi aumenta manualmente prototype con le funzioni esportate dagli altri file. Immagino che questa sia la mia opzione principale, ma mi chiedo quali altri progetti hanno fatto con le grandi classi.

posta curiousdannii 22.09.2018 - 06:21
fonte

1 risposta

5

In situazioni come questa, quando ho una parte del mio programma che deve essere isolata come un singolo modulo autonomo ma contiene molte migliaia di linee di codice, preferisco adottare un approccio compositivo per mantenere le cose pulite e gestibile.

Invece di cercare di mantenere tutte le funzionalità in una classe, perché non suddividerla in più classi "interne" che la classe principale di VirtualMachine istanzia nel suo costruttore e le delegate? Ogni classe si trova nel proprio file e puoi assegnare alla classe VirtualMachine un'interfaccia facciata per astrarre il fatto che essa delega a più oggetti internamente per fare ciò che deve fare (cioè puoi mantenere la sua interfaccia come è ora anche se la sua funzionalità è suddivisa in più classi internamente).

So che hai detto che è logico che tutto il codice in questione sia in una classe, ma anche classi così grandi hanno spesso sottosistemi discreti che sono responsabili di cose specifiche. Forse gli esempi che hai fornito (Stream, Style, Window, ecc.) Trattano problemi specifici nella tua classe VirtualMachine più ampia? A mio parere, va bene suddividerli in classi separate che devono essere solo istanziate e utilizzate insieme nella tua classe principale.

Se le tue classi hanno tutti bisogno di accedere ad alcuni stati condivisi, suddividili in una classe separata, crea un'istanza nel costruttore della classe VirtualMachine e passali a tutte le altre classi tramite i loro costruttori quando li crei.

Il vantaggio principale di adottare questo approccio rispetto agli altri che hai citato è che può essere fatto con un costrutto linguistico semplice e ben compreso (una classe) e schemi di progettazione comuni (delegation e composizione ), invece di affidarsi alla magia di costruzione o all'esoterismo funzioni linguistiche per lavorare.

    
risposta data 17.10.2018 - 23:31
fonte