Если прикован - как удалить? - PullRequest
0 голосов
/ 27 августа 2018

Я делаю приложение, где у меня есть следующий сценарий:

У меня есть несколько правил (бизнес-классы)

где они все возвращают код клиента. Это отдельные классы, которые будут искать код проб и ошибок, если найденный клиентский код вернет его и т. Д.

Как я могу использовать правило, не используя связку IF или резьбовых IF в классе, который вызывает другие, содержащие конкретные бизнес-правила?

Для конкретных классов я использовал стратегию шаблона проектирования.

EX: Основной класс

public abstract class Geral
{
    public abstract string retornaCodigo(Arquivo cliente)
    {
        var codigo = "";   // logica  
        return codigo;
    }
}

public class derivada1 : Geral
{
    public override string retornaCodigo(Arquivo cliente)
    {
        var codigo = "";  // logica  
        return codigo;
    }
}

public class derivada2 : Geral
{
    public override string retornaCodigo(Arquivo cliente)
    {
        var codigo = "";    // logica 2 
        return codigo;
    }
}

public class derivada3 : Geral
{
    public override string retornaCodigo(Arquivo cliente)
    {
       var codigo = "";  // logica 3 
       return codigo ;
    }    
}

public class Negocio
{    
    public string Codigo()
    {
        var arquivo = new Arquivo();
        var derivada1 = new derivada1().retornaCodigo(arquivo);

        var derivada2 = new derivada2().retornaCodigo(arquivo);
        var derivada3 = new derivada3().retornaCodigo(arquivo);

        if (derivada1.Equals(null))
            return derivada1;

        if (derivada2.Equals(null))
            return derivada2;

        if (derivada3.Equals(null))
            return derivada3;

        return "";
    }
}

что я хотел и что мне не нужно было использовать Ifs в классе Business для проверки того, нашел ли я код, в котором он может находиться под любым условием, привел пример 3 классов плюс у меня более 15 условий и я могу увеличить , дело будет много Ifs.

Ответы [ 4 ]

0 голосов
/ 27 августа 2018

Вы также можете использовать список производных классов и вызывать их в цикле

public string Codigo()
{
    var arquivo = new Arquivo();
    List<Geral> gerals=new List<Geral>();
    gerals.Add(new derivada1());
    gerals.Add(new  derivada2());
     ........
     ...........
   foreach(Geral g in gerals)
   {
     var val=g.retornaCodigo(arquivo);
     if(val!=null)
        return val;
    }
    return "";
}

Это пример реализации, однако вы не используете стратегию правильно

Лучшим подходом будет внедрение в конструктор,

public string Codigo(Geral implementar)
{
   var val=geral.retornaCodigo(arquivo);
   return "";
}

Тогда создайте экземпляр только с выбранной стратегией.

В противном случае, если вы хотите объединить несколько проверок, используйте шаблон цепочки ответственности.

0 голосов
/ 27 августа 2018

Это было бы просто с Linq:

public class Negocio
{

    public string Codigo()
    {
        var arquivo = new Arquivo();

        var derivadaList = new List<Geral>() {
            new derivada1(),
            new derivada2(),
            new derivada3(),
        };

        return derivadaList.FirstOrDefault(d => d.retornaCodigo(arquivo) == null)?.retornaCodigo(arquivo) ?? "";
    }
}

Вы можете добавить столько * Geral производных классов к derivadaList, сколько захотите, и код продолжит функционировать, как задумано.

Здесь происходит то, что FirstOrDefault будет запускать выражение Lamda для каждого элемента, возвращая первое, равное null (хотя я не уверен, что это то, что вам нужно, оно соответствует вашему примеру кода). Так как он возвращает объект Geral, вам нужно вызывать retornaCodigo для него, только если он не нулевой. Если оно пустое, просто верните пустую строку.

Другой способ написать это будет:

public class Negocio
{

    public string Codigo()
    {
        var arquivo = new Arquivo();

        var derivadaList = new List<Geral>() {
            new derivada1(),
            new derivada2(),
            new derivada3(),
        };

        foreach (var derivada in derivadaList)
        {
            var result = derivada.retornaCodigo(arquivo);
            if (result == null)
                return result;
        }

        return "";
    }
}
0 голосов
/ 27 августа 2018

Давайте организуем все derivada в коллекцию , скажем, массив, а затем запрос коллекцию с помощью Linq

public string Codigo() {
  var arquivo = new Arquivo(); 

  Geral[] derivadas = new [] {
    new derivada1(),
    new derivada2(),
    new derivada3(); 
  };

  //TODO: check the the condition: I guessed that you want to return first meanful codigo
  foreach (var codigo in derivadas.Select(geral => geral.retornaCodigo(arquivo)))
    if (!string.IsNullOrEmpty(codigo))
      return codigo; 

  return "";
}

Если у вас много derivada, вы можете попробовать Reflection , чтобы создать коллекцию:

using System.Reflection;

...

private static Geral[] s_Derivadas = AppDomain
  .CurrentDomain
  .GetAssemblies()                                       // scan assemblies 
  .SelectMany(asm => asm.GetTypes())                     // types within them
  .Where(t => !t.IsAbstract)                             // type is not abstract
  .Where(t => typeof(Geral).IsAssignableFrom(t))         // type derived from Geral
  .Where(t => t.GetConstructor(Type.EmptyTypes) != null) // has default constructor
  .Select(t => Activator.CreateInstance(t) as Geral)     // create type's instance
  .ToArray();                                            // materialized as array

тогда

public string Codigo() {
  var arquivo = new Arquivo(); 

  foreach (var codigo in s_Derivadas.Select(geral => geral.retornaCodigo(arquivo)))
    if (!string.IsNullOrEmpty(codigo))
      return codigo; 

  return "";
}
0 голосов
/ 27 августа 2018

Вы можете создать список производных, а затем повторить его

и если какой-либо заданный производный 1 равен None, вы просто возвращаете его, в противном случае вы просто продолжаете цикл for

Я мог бы написать фрагмент, если это не имеет смысла для вас. ЛМК!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...