我正在做一个应用程序,其中我有以下场景:
我有几个规则(业务类)
在那里它们都返回客户端代码。它们是单独的类,将查找代码试验和错误,如果发现客户端代码返回它,依此类推。
在调用包含特定业务规则的其他规则的类中不使用大量of或线程化of的情况下,如何使用规则?
对于特定的类,我使用了设计模式策略。
示例:主类
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。
发布于 2018-08-28 02:30:27
您可以创建一个派生列表,然后对其进行迭代
如果任何给定的derivada1等于None,你只需返回它,否则你只需继续'for循环‘
如果这对你没有任何意义,我可以写一个片段。lmk!
发布于 2018-08-28 02:40:05
有了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) ?? "";
}
}
您可以向derivadaList
添加任意数量的Geral
派生类,代码将继续按设计工作。
这里发生的事情是,FirstOrDefault
将在每个元素上运行Lamda表达式,返回第一个等于null
的元素(虽然我不确定这是否是您想要的,但它与您的示例代码匹配)。因为它返回一个Geral
对象,所以只有当它不为空时,才需要对它调用retornaCodigo
。如果为null,则返回空字符串。
另一种编写方法是:
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 "";
}
}
发布于 2018-08-28 02:43:34
还可以使用派生类列表并在循环中调用它们
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 "";
}
然后仅使用所选策略实例化。
否则,如果您希望链接多个验证,则使用chain of responsibility模式。
https://stackoverflow.com/questions/52045039
复制相似问题