In questi giorni sto impiegando un TDD e mi sto davvero divertendo - tutto sembra scorrere meglio ed essere naturalmente meglio costruito e organizzato. Tuttavia, mentre scrivevo un po 'di codice IO, utilizzando System.IO.Stream
s, e mi stavo chiedendo - quando mai vale la pena non usare una fabbrica? Perché in caso di Stream
s, sicuramente sembra meglio non usare una fabbrica.
In generale, per i tipi più complessi che ho definito, come una classe che controlla l'autenticazione di qualcosa e le interfacce con un database, probabilmente si utilizzerà un contenitore di dipendenze per l'iniezione e si risolve in runtime senza mai aver bisogno di in realtà creane uno.
Tuttavia, in alcune circostanze, quando devi creare molte di queste istanze, devi creare una Factory per costruire quel tipo - come ad esempio:
class Foo
Foo(Bar bar, Foobar foobar, Fuzz fuzz)
...
end
Qui, perché non vuoi esporre come creare direttamente questo oggetto ai client che ne hanno bisogno, esponi una Factory che le creerà e le inserirà nel client. Questo ha il vantaggio di permetterti di sostituire la fabbrica in qualsiasi momento tu voglia con qualcos'altro ed è generalmente usato per creare istanze di tipi che hanno tipi derivati.
class FooFactory
void Create(Bar, Foobar, Fuzz)
end
Tuttavia, tornando al mio punto Stream
- varrebbe la pena di creare una fabbrica per un decoratore attorno a un flusso? Ad esempio, nel mio progetto ho BinaryDataStream
, che legge i miei dati da uno Streeam. BinaryData è in un formato personalizzato e accetta un argomento Stream nel suo costruttore. L'utilizzo di new
sembra violare tutto ciò che so che ho imparato da quando ho iniziato a utilizzare TDD, perché sto dando il dipendente in cui ha bisogno di sapere esplicitamente come ottenerlo è un collaboratore Tuttavia una fabbrica sembra eccessivo.
Pensieri?
EDIT: Penso di aver bisogno di chiarire. Non intendo evitare sempre new (), poiché ovviamente ha il suo uso nel legare le dipendenze e cose simili. tuttavia , intendevo nella seguente situazione (copia-pasta dai commenti):
What I meant was that I have been told it is intrinsically evil to use the new() operator to a collaborator from inside the type that uses the collaborator, and that it is better to either a) pass an injected type or b) pass a factory (if you need to create an unknown number of those types). By using new() inside the collaborator you tie how to create that object and where to create it directly to the thing that requires it, and that it is better to inject a preconfigured instance into the constructor if you need one instance of it, or inject a factory into the constructor if you need to create multiple/undetermined number of instances