验证类型创建参数的位置

时间:2015-09-03 12:27:46

标签: oop design-patterns

我已经看到并使用了各种不同的方法来创建对象,但在验证创建同一个对象所需的数据时,还没有找到任何模式。

那就是说,首选的方式是什么?

public SomeClass(Product product, Device device, PlatformType platformType, User user, Country country)
{
    if (environment == null || environment.Id == 0) throw new ArgumentNullException("environment");
    if (device == null || device.Id == 0) throw new ArgumentNullException("device");
    if (country == null) throw new ArgumentNullException("country");
    if (userContext == null) throw new ArgumentNullException("userContext");
    if (platformType == null) throw new ArgumentNullException("platformType");

    Product = product;
    Device = device;
    PlatformType = platformType;
    UserContext = userContext;
    Country = country;
}

OR

public static class SomeClassFactory()
{
    public static SomeClass Create(Product product, Device device, PlatformType platformType, User user, Country country)
    {
        if (environment == null || environment.Id == 0) throw new ArgumentNullException("environment");
        if (device == null || device.Id == 0) throw new ArgumentNullException("device");
        if (country == null) throw new ArgumentNullException("country");
        if (userContext == null) throw new ArgumentNullException("userContext");
        if (platformType == null) throw new ArgumentNullException("platformType");
    }

    return new SomeClass(product, device, platformType, user, country);
}

根据快速失败原则,它们似乎都是正确的方法,我只是不确定第一个,因为如果您正在创建一个对象,那么您有意识地验证所有数据#39;在你尝试创建它之前重新使用,并且因为你想重用那个验证,工厂模式更有意义,但也许我们只是一个品味问题。

1 个答案:

答案 0 :(得分:0)

首先,我对这种验证并不十分熟悉。

这些是我对不同解决方案的看法:

赞成

  • 在许多实现需要相同验证的情况下,将验证重新组合在一个地方

缺点

  • 它不会阻止某人直接构造对象(不修改您提供的类)
  • 你只有一个实现,因此工厂的责任(根据一些论点提供良好的实现)是没用的

生成器

赞成

  • 允许您以“流利的方式”创建对象(它真的是专业人士吗?)

缺点

  • 这可能会打破SomeClass的潜在不变性。免责声明:我赞成不可变类
  • 由于您只有一个没有optionnal参数的构造函数,因此构建器似乎无用

验证

您可以将责任委托给包含某些规则的验证程序(在您的情况下只有一条规则:ObjectNotNull)。

拒绝责任

可能会出现向调用者提供一致参数的责任。如果SomeClass仅在内部使用,您可以认为。

也许这不是一种责任

毕竟,我的第一个假设可能是假的,并且执行一些空检查本身并不是一个责任,但你可以看到它“修补调用者代码的一些弱点,因为他太懒而不提供非空值”。因此,您的第一个解决方案似乎完全合法。

希望我的想法可以帮到你。