Solo un metodo di creazione classifica una classe come fabbrica?

1

Nel mio progetto attuale, trovo le mie fabbriche che fanno auto, ma per due motivi ben distinti:

Motivo n. 1 : per aiutare il mio contenitore IoC se una determinata classe ha bisogno di un parametro noto solo quando viene creata la classe. Ciò potrebbe includere anche la lettura di dati da una configurazione. Questo tipo di fabbrica non contiene logica aziendale, solo logica di inizializzazione.

Motivo n. 2 : la creazione di un'entità richiede una logica di convalida complessa e voglio mantenere questa logica fuori dal mio costruttore in modo che rimanga semplice. Questo tipo di fabbrica riguarda solo la logica aziendale attorno alla creazione di una nuova entità.

Inoltre, quando creo una fabbrica per il motivo n. 2, mi ritrovo tentato di mettere anche la logica di cancellazione, poiché la cancellazione dell'entità è spesso complessa e va oltre lo scopo dell'entità che viene cancellata; tuttavia, sarebbe difficile chiamare una classe con un metodo di eliminazione di fabbrica.

Motivo n. 1 Esempio:

class WidgetRepositoryFactory
{
    IUserRepository Create(userType)
    {
         int configValue = int.Parse(Config.get("ConfigValue"));
         IUserRepository repo = userType == "user1" : new User1Repo(configValue) : new User2Repo(configValue);
         return repo;
    }
}

Motivo n. 2 Esempio:

class WidgetFactory
{
     Result<Widget> Create(var1, var2)
     {
          Result r = new Result();
          if (var1 < 0)
          {
              r.AddError("var1 too low!");
              return r;
          }

          if (var1 > var2)
          {
              r.AddError("var1 too high!");
              return r;
          }

          r.Obj = new Widget(var1, var2);
          r.Success = true;
          return r;
     }
}

Quando creo una fabbrica per la ragione # 2, è davvero corretto chiamarla fabbrica? C'è un termine migliore per questo tipo di lezione? Esiste una terminologia preesistente per descrivere questi due casi ben distinti?

    
posta TheCatWhisperer 21.06.2018 - 18:06
fonte

2 risposte

1

Quando si crea o elimina un'entità, in cui la logica per entrambi non è banale, il codice che convalida le condizioni ha più a che fare con un Use Case e dovrebbe andare nel livello dell'applicazione dove si usa i casi sono gestiti.

Per architetture simili a Onion Architecture, questo sarebbe il livello di servizio.

    
risposta data 21.06.2018 - 19:47
fonte
2

I find myself tempted to put deletion logic there as well

Questo è un segno che dovresti inserire la logica di validazione in un metodo di inizializzazione; allora puoi anche controllare la logica di cancellazione.

When I create a factory for reason #2, ...

Il motivo n. 2 potrebbe indicare dove; Penso che questa logica extra dalla ragione # 2 debba essere spostata nella classe come un altro membro o spostata da un'altra parte, ad esempio se stai leggendo una configurazione, la validazione può appartenere a questa.

is it really correct to call it a factory?

Nel tuo esempio potrei chiamarlo SpecialWidgetFactory; supponendo che questo codice non appartenga al chiamante.

    
risposta data 21.06.2018 - 18:53
fonte

Leggi altre domande sui tag