首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果链接-如何删除?

如果链接-如何删除?
EN

Stack Overflow用户
提问于 2018-08-28 02:27:51
回答 3查看 114关注 0票数 0

我正在做一个应用程序,其中我有以下场景:

我有几个规则(业务类)

在那里它们都返回客户端代码。它们是单独的类,将查找代码试验和错误,如果发现客户端代码返回它,依此类推。

在调用包含特定业务规则的其他规则的类中不使用大量of或线程化of的情况下,如何使用规则?

对于特定的类,我使用了设计模式策略。

示例:主类

代码语言:javascript
复制
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 "";
    }
}

我想要什么,并且我不必在Business类中使用Ifs进行验证,无论我是否找到代码,它可以在任何条件下落在3个类的示例中,加上我有超过15个条件,并且可以增加,情况将是许多Ifs。

EN

回答 3

Stack Overflow用户

发布于 2018-08-28 02:30:27

您可以创建一个派生列表,然后对其进行迭代

如果任何给定的derivada1等于None,你只需返回它,否则你只需继续'for循环‘

如果这对你没有任何意义,我可以写一个片段。lmk!

票数 0
EN

Stack Overflow用户

发布于 2018-08-28 02:40:05

有了Linq,这就简单了:

代码语言:javascript
复制
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) ?? "";
    }
}

您可以向derivadaList添加任意数量的Geral派生类,代码将继续按设计工作。

这里发生的事情是,FirstOrDefault将在每个元素上运行Lamda表达式,返回第一个等于null的元素(虽然我不确定这是否是您想要的,但它与您的示例代码匹配)。因为它返回一个Geral对象,所以只有当它不为空时,才需要对它调用retornaCodigo。如果为null,则返回空字符串。

另一种编写方法是:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-08-28 02:43:34

还可以使用派生类列表并在循环中调用它们

代码语言:javascript
复制
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 "";
}

这是一个示例实现,但是您没有正确使用策略

一种更好的方法是构造函数注入,

代码语言:javascript
复制
public string Codigo(Geral implementar)
{
   var val=geral.retornaCodigo(arquivo);
   return "";
}

然后仅使用所选策略实例化。

否则,如果您希望链接多个验证,则使用chain of responsibility模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52045039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档