Una classe helper generica, una classe specifica del progetto e il resto del progetto

1

Ho una classe helper generica (1) che può essere utilizzata anche in altri progetti. Immagina qualcosa come la gestione di base di file e cartelle, qualcosa di utile e ASCIUTTO che ti viene sempre utile.

Ho un'altra classe (2) specifica del progetto, ma usa la classe generica (1) per realizzare le cose.

La classe helper generica (1) viene utilizzata creando un nuovo oggetto in posti specifici dove è necessario nel progetto.

GenericHelperClass ghc = new GenericHelperClass();

Lo stesso vale per la classe specifica del progetto (2), viene utilizzata creando un nuovo oggetto in posti specifici dove è necessario nel progetto.

ProjectSpecificClass psc = new ProjectSpecificClass();

Ma come ho detto la classe specifica del progetto (2) usa la classe helper generica (1) per fare cose.

Quindi, ho pensato, che la classe specifica del progetto (2) dovrebbe avere la propria classe helper generica private (1) per fare il suo lavoro.

Ma aspetta, ci sarà già un'istanza di quella classe helper generica (1) nel progetto, quindi perché crearne un'altra? Passiamo solo quell'istanza di (1) sul costruttore di (2).

Quindi (2) ora viene creato come:

GenericHelperClass ghc = new GenericHelperClass();
// code and code and code
// .
// .
ProjectSpecificClass psc = new ProjectSpecificClass(ghc);

con questo ho solo un oggetto di GenericHelpClass, e ho evitato di usare static.

La domanda è: Mi sbaglio qui o sto solo creando spaghetti-dipendenze o qualcosa del genere? Qualche suggerimento?

(la selezione dei nomi GenericHelperClass / ProjectSpecificClass è solo per dimostrazione)

    
posta Sharky 01.02.2016 - 14:18
fonte

2 risposte

4

Ci sono alcuni motivi che possono rendere questo disegno l'alternativa migliore:

GenericHelperClass ghc = new GenericHelperClass();
// ...
// using 'ghc' here for other purposes
//...
ProjectSpecificClass psc = new ProjectSpecificClass(ghc);
  • se la costruzione di ghc è lenta o richiede molte risorse, potrebbe essere meglio costruire l'oggetto solo una volta

  • se dopo la costruzione di ghc l'oggetto deve essere inizializzato in un modo specifico prima che possa essere usato, è meglio fare questa inizializzazione solo una volta

  • vuoi aspettarti che il costruttore di ProjectSpecificClass un oggetto di tipo IGenericHelperClass (un'interfaccia) per rendere possibile "deridere l'oggetto" a fini di test unitario

Se nessuna delle ragioni si applica al tuo caso, mantieni le cose il più semplici possibile per l'utente di ProjectSpecificClass e costruisci l'oggetto all'interno, dove è necessario, anche quando viene eseguito due volte. La costruzione di oggetti standard in C # è molto veloce, a patto che non ci sia un codice costruttore "pesante" sul posto.

    
risposta data 01.02.2016 - 15:15
fonte
1

Il mio pensiero su questi tipi di aiutanti sta effettivamente riempiendo lacuna nella libreria standard. Dovrebbero quindi essere tenuti allo stesso tipo di standard rigorosi a cui è tenuta la libreria standard. In particolare se questa classe di helper viene utilizzata in più progetti, è essenziale convalidarla con numerosi test. Proprio come la presunta qualità elevata, stabilità e utilità generale dell'interfaccia della libreria standard giustifica l'accoppiamento più stretto rispetto ad altre interfacce prive di queste qualità, di solito è giustificabile creare un'istanza di GenericHelperClass sul bisogno.

Ovviamente la misura in cui dovresti disgiungere da GenericHelperClass dipende non solo dalla sua qualità e stabilità, ma anche dal / i dominio / i in cui viene utilizzato. Se GenericHelperClass fa parte dell'interfaccia verso sistemi esterni come database o web apis, è generalmente utile separare e programmare un'interfaccia in modo che possa essere sostituita da una doppia per i test di unità. Nella direzione opposta, se GenericHelperClass viene utilizzato per implementare funzionalità ben note e pure - pensa un encoder base64, funzioni matematiche o metodi di utilità sulle raccolte - questo sarà uno spreco di energie. In effetti, per questo tipo di utilizzo, è completamente accettabile rendere GenericHelperClass statico. (È per questo motivo che Math è generalmente una classe statica.)

Quindi, in conclusione, è difficile dire se l'accoppiamento SpecificHelperClass con GenericHelperClass sia un'idea buona o cattiva senza conoscere lo scopo di quelle classi. Una quasi-soluzione generale consiste nel fornire più costruttori per SpecificHelperClass , uno che consente un doppio di GenericHelperClass da utilizzare a scopo di test e uno predefinito che utilizza solo GenericHelperClass .

    
risposta data 01.02.2016 - 14:42
fonte

Leggi altre domande sui tag