我确信我不是唯一一个面临这个问题的人,但到目前为止我找不到解决办法。问题如下。
我已经从旧系统发布了一个Web服务(我没有任何控制权,我无法更改它),并且所有客户端都在使用它。我收到来自Web服务和对象的请求,我得到的是一个非常复杂的请求但是为了举例说明我从Web服务调用接收对象A,其中包含其他几个对象,如对象B,对象C等等。另外,对象B& C还有一些原始数据类型以及其中的一些其他对象。我的问题是我要验证整个对象A(所有包括对象和子对象),这里推荐哪种设计模式?其次,这里的要点是我可以从Web服务获得不同类型的对象A.我不同类型的对象A的真正含义是对象A依赖于客户端,即一些客户端将发送对象A而不填充包含对象B中的数据,或者甚至可以部分填充对象B然后在对象A中发送它所以我必须基于客户端验证对象A(因为一些客户端需要包含对象B,有些不会,有些将需要对象B中的少量元素等)。所以换句话说,我将有一个地方,我也将存储每个客户端的验证规则,这将告诉我这样的事情,客户端ABC希望对象B中的字段abc是字符串类型,最大长度是25个字符,它必须在该字段中包含数据。
我想要执行的一些验证是
检查某个对象的字段(比如对象B)的数据类型,特定字段的长度,是该客户端所需的字段,还是可选的等等......
任何具体的工作示例都非常有用。
此特定示例的对象A的结构如下。
public class A
{
private B objectB;
private C objectC;
// and so on
}
public class B{
private E objectE;
private String name;
private int age;
// and so on
}
public class C
{
private F objectF;
private String address;
private String country;
}
public class E
{
// Members here
}
public class F
{
// Members here
}
P.S:我已经给了班级和成员任意的名字,只是为了一般的理解。是的,我忘了提到我在这里使用java,但它并不重要,因为设计原则或模式可以应用于任何语言。希望很快能听到你们的意见.. :)
答案 0 :(得分:7)
验证是一个跨领域的关注点。有几种方法可以实现几种设计模式。
在Asp.net中,它是通过属性完成的,在Java Spring中,它通过Annotations完成,以保持代码清洁,可读和可维护。
您可以找到大量不同的方法,您需要记住的是这些框架的方法如下。即代码维护,可读性和清洁代码。
没有银弹。您甚至可以在代码中编写验证。
答案 1 :(得分:0)
每个班级都应该知道如何验证自己。您可以从具有.Validate()方法的接口(例如IValidatable)派生每个类。当你在对象A上调用.Validate()时,让它自己验证,然后在所有子节点上调用.Validate()。那些孩子可以以类似的方式验证自己。
我认为这是一个非常简单的命令模式版本。有点。
您还可以撰写一个可以附加到班级的验证器。验证器可以知道如何验证电子邮件地址,定期收件人等。这有点可扩展,因为您基本上创建了一个工具箱,可以附加到只包含所需工具的类。