Questo è un compromesso tra facilità d'uso e disaccoppiamento.
Avere una parte serialize-method
della tua classe Corpus può renderla più facile da usare, ma in questo modo la tua classe Corpus
dipende da _CorpusJsonSerializer
e viceversa, il che significa che hai una dipendenza ciclica. Questo è spesso un segno di progettazione errata, poiché rende difficile testare Corpus
, più difficile da riutilizzare in un contesto diverso, più difficile da estendere ecc.
Nella maggior parte dei casi, eviterei soluzioni con dipendenze cicliche. Ancora meglio sarebbe una progettazione in cui non è necessario uno speciale _CorpusJsonSerializer
, ma solo un generale JsonSerializer
che accetta un oggetto arbitrario (ad esempio, di tipo Corpus
) e ne determina il tipo e gli attributi serializzabili digitare in fase di esecuzione. In questo modo, elimineresti tutte le dipendenze correnti.
Un'altra opzione di progettazione, che non è così generica ma evita la dipendenza ciclica, è quella di iniettare la dipendenza dall'esterno. Significa che nel costruttore Corpus viene fornito un parametro per un oggetto "serializzatore" che viene archiviato nell'oggetto Corpus e utilizzato nel metodo serialize_to_stream
. Puoi passare qui un oggetto di _CorpusJsonSerializer
nella maggior parte dei casi, ma anche un oggetto completamente diverso seguendo le stesse convenzioni di interfaccia (cioè fornendo un metodo serialize
). In questo modo, quando a scopo di test non è necessario un serializzatore, non è necessario fornirne uno; o se hai bisogno di un diverso tipo di serializzatore, puoi facilmente cambiarlo. Ovviamente, questa opzione implicherà che _CorpusJsonSerializer
è esposto all'utente, ma puoi mantenere il metodo di convenienza in Corpus
senza gli svantaggi delle dipendenze cicliche.