代码之家  ›  专栏  ›  技术社区  ›  John V

先决条件可以表示为简单条件吗?

  •  0
  • John V  · 技术社区  · 6 年前

    我理解,在契约设计/Liskov原则的上下文中,一个前提条件是在调用代码之前应该是真的,例如调用方对此负责。此外,埃菲尔语言的作者指出,大多数人确实将另一个验证检查放进了cade中,这只是作为防御编程的一种手段。

    Some time ago I read a question with a code similar to this:
    
        void X(int value)
        {
           if (value > 100)
             {do something...}
        }
    

    一些评论者认为if语句不是一个先决条件,但我认为这是不对的——如果合同规定V必须是100,那么这是在另外验证先决条件,如果一个类是从这个类型派生的,并更改为V>200,那么这将加强先决条件,从而违反Liskov原则。还是不是这样?

    1 回复  |  直到 6 年前
        1
  •  0
  •   CodeMonkey    6 年前

    正如您所说,先决条件被定义为在继续执行代码之前必须始终为true的条件。

    这意味着,在执行其他代码之前,在函数开头检查某个条件的任何操作都将被视为先决条件。

    //We will do something cool here
    //With an integer input
    int doSomethingCool(final int input)
    {
        //Wait, what if input is null or less than 100?
        if(null == input || input < 100)
        {
            //Return a -1 to signify an issue
            return -1;    
        }
        //The cool bit of multiplying by 50. So cool.
        final int results = input * 50;
        //Return the results;
        return results;
    }
    

    在这个例子中,函数, input 在执行任何其他操作之前检查。只要满足条件,其余代码就会执行。

    //We will do something cool here
    //With an integer input
    int doSomethingCool(final int input)
    {
        //Want to make sure input is not null and larger than 100
        if(null != input && input > 100)
        {
            //The cool bit of multiplying by 50. So cool.
            final int results = input * 50;
            //Return the results;
            return results;
        }
        //Return a -1 to signify an issue because the
        //preconditions were not met for some reason
        return -1;
    }
    

    在本例中,先决条件是检查 输入 不是 null if

    前提条件应该进行检查,并且只在检查失败时返回。不应该在一个先决条件下做任何工作。

    符合Liskov替代原理,如果类型 S 是类型的子类型 T ,然后键入 T型 可替换为类型 . If类型 S码 doSomethingCool 并且改变了前提条件,那么它就违反了,因为类型 T型

    现在你来回答

    是的,简单的条件仍然是先决条件。只要它们位于使用该变量的所有其他代码的前面,条件就是程序所需要的。另外,如果函数在子类型中并且重写父类,则不应更改前提条件。

    但是,不要将需要在前提条件内运行的代码包围起来。那是坏习惯。如果 value value < 100 并在 如果