动态语言中正确的位置参数类型检查在哪里?

时间:2009-01-13 03:23:58

标签: exception typechecking

请考虑以下事项。 (伪代码)。

Class
{
    hello
    world

    public
    constructor(hello, world)
    {
        if (hello is not String)
        {
            throw Exception()
        }

        if (world is not Array)
        {
            throw Exception()
        }

        this.setHello(hello)
        this.setWorld(world)
    }

    protected
    setHello(hello)
    {
        if (hello is not String)
        {
            throw Exception()
        }

        this.hello = hello
    }

    private
    setWorld(world)
    {
        if (world is not Array)
        {
            throw Exception()
        }

        if (not this:isASafe(world))
        {
           throw Exception()
        }

        this.world = world
    }

    public
    static
    isASafe(world)
    {
        if (world is not Array)
        {
            return false
        }

        if (world.length < 1)
        {
            return false
        }

        if (world['sky'] is not 'blue')
        {
            return false
        }

        return true
    }
}
  1. 最佳做法是在构造函数中执行参数类型/有效性检查,然后再在函数处执行,或者仅在两种方法中的一种执行。 (即构造函数xor方法)。

  2. 此外,所述方法的范围(公共/受保护/私人/等)是否改变了上述答案(1)。例如,isASafe(world)是一个公共静态方法,并且只在类中封装逻辑。

  3. 构造者是否应该进行任何检查?

  4. 我对此事有自己的个人意见,但希望看到别人的想法,以及他们认为最有效/最有效的事情。

1 个答案:

答案 0 :(得分:1)

检查参数有效性对于除受保护或私有之外的所有公共功能显然更为重要。由于您的构造函数是公共的,因此清楚地检查是有意义的。

在所有情况下都无法检查有效性 - 有效性与否的问题,例如: sky == blue,在您无权访问的上下文中可能有所不同。

我更喜欢防御性代码。在检测到数据不一致之前运行的语句越少意味着断言更接近引入问题的语句 - 使得查找更容易/更快。

这意味着我的偏好是对大多数方法的参数进行一些健全性检查。我经常会忘记检查某些私有方法,尽管你冒了某些人(也许你)有一天会成为受保护或公开的风险,而且你也有机会将数据不一致性更接近来源。