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:
-
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.
-
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.
-
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.