Argomenti del costruttore di wrapping

3

Data una classe base con circa 25 sottoclassi, ho trovato che aggiungere un argomento al costruttore base è doloroso.

protected AbstractController(Service1 s1, Service2 s2, Service3 s3){ ... }
public Concrete1Controller(Service1 s1, Service2 s2, Service3 s3) : base(s1, s2, s3)
public Concrete2Controller(Service1 s1, Service2 s2, Service3 s3) : base(s1, s2, s3)

Ora che ho bisogno di un altro oggetto passato al mio controller di base, sto discutendo di introdurre una classe wrapper e refactoring in modo che sia richiesto un solo parametro nei costruttori delle (più) istanze concrete.

public class ServiceLayer
{
    public Service1 S1 {get; private set; }
    public Service2 S2 {get; private set; }
    public Service3 S3 {get; private set; }

    public ScheduledReportServices(Service1 s1, Service2 s2, Service3 s3)
    {
        S1 = s1;
        S2 = s2;
        S3 = s3;
    }
}

Che mi permetterà di pulire un bel po '.

protected AbstractController(ServiceLayer sl){ ... }
public Concrete1Controller(ServiceLayer sl) : base(sl)
public Concrete2Controller(ServiceLayer sl) : base(sl)

Dato l'ammontare che questo riduce il disordine, sono una droga per non farlo all'inizio o c'è un argomento valido contro questo tipo di approccio.

Sarei interessato a) sapere come si chiama questo "modello" eb) se me ne pentirò e, in caso affermativo, perché?

    
posta Joe 15.07.2014 - 17:33
fonte

2 risposte

4

a) Stai eseguendo un refactoring "Introduci / Estrai oggetto parametro" .

b) Non posso dire se te ne pentirai o no. Se ogni singola istanza di questo richiede servizi s1-s3 senza eccezioni, questo sembra un buon refactoring.

Questo può aprire il gate a dipendenze indesiderate se non si presta attenzione al proprio oggetto parametro. Cerca di evitare di combinare riferimenti non correlati che impediscano che questo diventi una grande palla di dipendenza.

    
risposta data 15.07.2014 - 18:02
fonte
1

Non c'è niente di intrinsecamente sbagliato in questo. In passato, ho avuto diversi casi in cui è stato più logico aggiungere una classe SomeClassCreateInfo all'immagine, piuttosto che passare i parametri.

Quindi quando farlo?

Questa è una domanda intrinsecamente più difficile a cui rispondere, e diventa in gran parte situazionale. Di solito diventa ovvio quando è necessaria una classe Parameter-Wrapper / CreateInfo. Ma anche, a volte, potrebbe essere un segno che le cose non vanno nel design. Nel tuo caso, il controller astratto ha bisogno di accedere a una serie di servizi. C'è un altro modo per fornire queste informazioni?

    
risposta data 15.07.2014 - 17:57
fonte

Leggi altre domande sui tag