Estrai la tua logica incapsulata in classi più piccole. Continuate a farlo finché non ottenete classi che aderiscono al principio SRP e ne avete una e una sola responsabilità. Scrivi test su quelle classi per verificare che eseguano la piccola responsabilità che hanno correttamente. Componi le tue classi più grandi da queste classi piccole, finché non hai l' ComplexProjectFacade
che è composto da classi più piccole e così via.
In questo modo, crei classi piccole, mirate e facili da capire. Il fatto che abbiano metodi pubblici e possano quindi essere testati è un felice effetto collaterale dal fatto che ora hai un codice che è facile da capire . Ogni volta che sento qualcuno discutere sull'opportunità di rendere pubbliche classi o metodi puramente a scopo di test, cerco di far loro capire che stanno anche aderendo più chiaramente ai principi che portano a un codice migliore (es. SOLID ).
Il modo in cui lo fai al di là di questo è più legato alle preferenze personali:
- Mettere i test accanto al codice nello stesso assembly inquina il codice rilasciato con i test. Saranno nella stessa DLL che aumenta la dimensione e così via. Probabilmente non vuoi rilasciare il tuo codice di test compilato con la tua applicazione, ma se non hai problemi con questo, è un approccio valido. Richiede comunque che ogni classe sia contrassegnata come Interna
- Mantenere pubbliche le classi significa che l'interfaccia esposta della DLL diventa più complessa. Gli utenti che desiderano utilizzare la DLL vedranno una vasta gamma di classi e potrebbe non essere immediatamente evidente quale classe utilizzare per eseguire qualcosa. Un uso corretto degli spazi dei nomi potrebbe impedirlo, in quanto è possibile limitare lo spazio dei nomi di root alla facciata e mettere tutte le altre classi in spazi dei nomi (sotto) separati, rendendo più ovvio ciò che gli utenti devono osservare.
- InternalsVisibleTo ti permette di mantenere tutte le tue piccole classi interne all'assemblaggio, limitando l'interfaccia esposta della tua DLL a cose che intendevi davvero aver esposto, ma richiede di mantenere tutte le classi interne e ti limita a dover ricompilare il tuo libreria con un nuovo attributo InternalsVisibleTo se si desidera aggiungere un nuovo assieme di test.