RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 858650
Accepted
A K
A K
Asked:2020-07-22 05:06:45 +0000 UTC2020-07-22 05:06:45 +0000 UTC 2020-07-22 05:06:45 +0000 UTC

OOP 中的不变量是什么?

  • 772

很多时候在 OOP 的文章中有一个词是不变的:

  • ...不允许模型提供自己的不变量
  • 您可以根据先前调用的后置条件和不变量来验证是否满足前置条件
  • 顺便说一下,这被称为不变原理。实际上封装并允许您保存不变量。
  • 也就是说,无论同时有多少消费者,它都将保留其不变量并遵守合同。
  • 每个聚合都有一个根(Aggregate Root)和一个边界,在该边界内必须始终满足不变量。

这个词是什么意思?不变量在代码中是什么样的?

我找到了术语“循环不变”的描述:

循环不变量是在循环之前为真、在循环执行时为真、在循环退出时为真的关系。这一切都由 Dijkstra 在《编程学科》一书中描述,并由 Gris 在《编程科学》一书中详细解释。

我想了解不变量是什么意思

  1. 在合同编程和
  2. 纯OOP(据我了解,这与封装有关)
c#
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Best Answer
    Pavel Mayorov
    2020-07-23T15:28:26Z2020-07-23T15:28:26Z

    数学中的不变量是保留其值的表达式。在编程中,不变量也称为始终为真的谓词。

    因此,OOP 中的对象不变量要么(更常见)是在以任何顺序调用对象的任何方法后保持为真的条件,要么(不太常见)是在调用任何方法后保留其值的表达式。

    在代码中,不变量通常不以任何方式表示,但有时会设置保护性检查来检查它们。


    不变量的例子。

    List<>: 0 ≤ _size ≤ _items.Length

    List<>.Enumerator: list.version = 常量 = 版本;有一个安全检查

    List<>.Enumerator: 0 ≤ 索引 ≤ list._size+1

    ArraySegment<>: 数组 = null && 偏移量 = 0 && 计数 = 0 || Array != null && 0 ≤ Offset && 0 ≤ Count && Offset + Count ≤ Array.Length; 这个不变量在代码中表示为 Contract.Assert 构造

    • 15
  2. Monk
    2020-07-22T09:32:58Z2020-07-22T09:32:58Z

    代码中的不变量通常如下所示:

    1. 作为事务 - 一些完全或完全回滚的更改。

    2. 就像保存前的验证一样 - 它可以让您保存更改,或者因状态不正确而出错。

    3. 一般来说,任何异常都可能是维护不变量的结果——完整性保证,一种特殊情况——ObjectDisposedException。

    4. 函数式程序通常是不变的,因为 不要改变原始对象的状态。

    5. 只有对象本身才能更改的对象的私有字段,加上每个公共方法将它们从工作且一致的状态更改为工作且一致的状态。

    • 9
  3. tym32167
    2020-07-22T05:15:51Z2020-07-22T05:15:51Z

    面向对象编程中的不变量是定义对象的一致内部状态的表达式。(维基百科:不变)

    • 6
  4. Jeka Yaroshenko
    2022-01-29T18:08:15Z2022-01-29T18:08:15Z
    <?php
    declare(strict_types=1);
     
    class Minute{
         
        private $seconds;
        
        public function __construct(int $value){
             if(!$this->invariant($value)){
                 throw new Exception("Нарушен инвариант. 
                 Значение должно быть не меньше 1 и не больше 59");
             }
             // Гарантия учтенных инвариантов !
             $this->seconds = $value;
        }
        
        public function invariant(int $value):bool{
             if ( 1 <= $value && $value <=59 ){
                return true;
             }
             return false;
        }
        
        public function addSecond(){
             if(!$this->invariant( $this->seconds+1)){
                 throw new Exception("Нарушен инвариант. Минута переполнена");
             }
             // Гарантия учтенных инвариантов !
             $this->seconds++;
            // Нет необходимости проверять после этого метода инварианты
        }
        
        public function show(){
            // Гарантия учтенных инвариантов !
           
             echo $this->seconds;
           // Нет необходимости проверять до и после этого метода инварианты
        }
    
    }
      
    try{
        $minute = new Minute(58);
        $minute->addSecond();
        $minute->addSecond();
    }catch(Exception $e){
        echo $e->getMessage();
    }
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5