Problemi con le facciate e quindi l'evoluzione nel software

1

Inizialmente ho iniziato un progetto con Facades and Polymorphism come modo per creare un design semplice ed estensibile seguendo Principi SOLID . Ecco un codice di esempio:

public interface IInterface
{
    void FillList(List<InputPocoObject> listOfInputObjects, out List<OutputPocoObject> ListOfOutputObjects);
}

public class SampleClass : IInterface
{

    public void FillList(List<InputPocoObject> listOfInputObjects, out List<OutputPocoObject> ListOfOutputObjects)
    {
        //some data layer code 
        //and a for loop to fill OutputPocoObject object and add it to list
    }
}

Ho un numero di classi come sopra che sono create in runtime con l'aiuto di factory (non mostrato qui per semplicità)

Recentemente dopo un paio di mesi vedo che ci sono diverse esigenze emergenti nel mio progetto, che ho tentato di risolvere con l'aiuto di Polymorphism e vedo che sono bloccato a violare DRY .

Ecco un esempio di codice di questa situazione:

public class SampleClass2 : IInterface
{

    public void FillList(List<InputPocoObject> listOfInputObjects, out List<OutputPocoObject> ListOfOutputObjects)
    {
        //some data layer code 
        //and a for loop to fill OutputPocoObject object and add it to list
        // there is a property in OutputPocoObject which is set to 1
    }
}


public class SampleClass3 : IInterface
{

    public void FillList(List<InputPocoObject> listOfInputObjects, out List<OutputPocoObject> ListOfOutputObjects)
    {
        //same code as above 
        //with only one difference that  property in OutputPocoObject is set to 5 here
    }
}

Una soluzione semplice sarà aggiungere un parametro di controllo all'interfaccia come:

public interface IInterface
{
    void FillList(List<InputPocoObject> listOfInputObjects, out List<OutputPocoObject> ListOfOutputObjects, int controlParameter);
}

ma non so se sia un'idea così migliore? O se potrebbe introdurre qualche complessità nella mia progettazione?

    
posta shankbond 24.11.2013 - 17:56
fonte

3 risposte

1

Crea una classe che converta InputPocoObject in OutputPocoObject (una classe adattatore) e passala (o più istanze di essa) nel metodo FillList .

    
risposta data 24.11.2013 - 18:10
fonte
1

Ci sono molti modi per risolvere il tuo problema. Il più ovvio è creare una classe base astratta sotto SampleClass2 and 3 . Questa classe astratta implementerà FillList in un modo che è comune tra questi due e chiamerà anche il metodo GetNumberX() abstract, che restituirà il numero da assegnare e quindi verrà implementato di conseguenza in SampleClass 2 and 3 .

Ma sto notando che ti stai ripetendo ancora una volta: in realtà dover scrivere il ciclo. Perché non solo avere:

public interface IConverter{
    void InitializeData(); //some data layer code 
    OutputPocoObject Convert(InputPocoObject in); // called for every converted object
}

E avere il loop da qualche altra parte.

    
risposta data 24.11.2013 - 19:21
fonte
1

Oltre alla risposta di Konrad .

Ho creato un nuovo incapsulamento di classe la parte comune di SampleClass2, SampleClass3 ...

    public class CommonClass
    {
        public void CommonMapper_FillList(List<InputPocoObject> listOfInputObjects, out List<OutputPocoObject> ListOfOutputObjects)
        {
            //some data layer code 
        }
    }

Quindi con l'aiuto di Composizione ho rimosso la duplicazione in SampleClass2, SampleClass3 ...

    public class SampleClass2 : IInterface
    {
        private readonly CommonClass _commonClassInstance;
        public SampleClass2()
        {
            _commonClassInstance=new CommonClass();
        }
        public void FillList(List<InputPocoObject> listOfInputObjects, out List<OutputPocoObject> ListOfOutputObjects)
        {
            //for loop to fill OutputPocoObject object and add it to list
            //_commonClassInstance.CommonMapper_FillList method to fill common functionality
            // set property in which is different OutputPocoObject to 1
        }
    }
    
risposta data 18.02.2014 - 17:16
fonte