重构-断言

现象:某一段代码需要对程序状态做出某种假设
做法:以断言明确表现这种假设
动机:
常常有这种一段代码:只有某个条件为真是,该改名才能正常运行。
通常假设这样的假设并没有代码中明确表现出来,必须阅读整个算法才能看出。
有时程序员会注释这样的代码。
而现在这种重构介绍一种更好的技术:使用断言明确标明这些假设。
断言是一个条件表达式,应该总是为真。如果他失败,就是bug。
因此断言的失败应该是一个非受控异常,断言绝对不能被系统其它部分使用。实际上,程序最后的成品往往将断言系统统统删除,因此,标记某些东西是个断言是很重要。
断言作为调试和交流的辅助,在交流角度,断言可以帮助程序阅读者理解代码所做的假设;在调试的角度,断言可以在距离bug最近的地方抓住它们。
做法:
如果程序员不犯错,断言就不会对系统造成任何影响,所以加入断言永远不影响程序的行为。
如果发现某个条件始终为真,就加入一个断言说明这种情况。
可以引入一个assert类,用于处理各种情况下的断言。
不要滥用断言,请不要用来检查你认为应该为真的条件,请只用来检查一定为真的条件。滥用断言可能会造成难以维护的重复逻辑。
在一段代码中引用断言是有好处的,他迫使你重新考虑这段代码的约束条件。
如果不满足这些约束条件,程序也可以正常运行,断言就不能带来任何帮助,只会把代码变得混乱,并且可能妨碍以后的修改。
如果断言的所指示的约束条件不能满足,代码是否正常运行?如果可以就把断言拿掉。
还需要注意断言中重复的代码。
C# 断言代码
  1. Boolean b1 = false;
  1. System.Diagnostics.Debug.Assert(b1);

断言(Assert)与异常(Exception)

断言是被用来检查非法情况而不是错误情况,即在该程序正常工作时绝不应该发生的非法情况,用来帮助开发人员对问题的快速定位。异常处理用于对程序发生异常情况的处理,增强程序的健壮性、容错性,减少程序使用中对用户不有好的行为,不让(通常也不必)用户知道发生了什么错误。

  实际开发中,我们通常将Assert与异常混淆, 不知道什么时候使用Assert,什么时候使用异常处理。或者不用Assert,将一切情况都归为异常。这样一来,就掩盖了问题,当问题发生的时候,很难进行定位,而这些问题本该是在开发的时候就解决掉的。同时,也增加了开销(在c#中,debug.Assert()编译成release版本时,不会产生任何代码,而try/catch在debug/release版本中都是有代码产生,运行时需要开销)。

C#中的断言(Assert)的更多相关文章

  1. Java中的断言assert

    Java陷阱之assert关键字   一.概述   在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多.   二.语法   在J ...

  2. Java中的断言 Assert

    今天正好遇到了,就记一下 一.作用: 用与编写单元测试 二.assert 关键字 assert 理论上和 if类似, 但是assert 仅仅用于测试, 不能用于业务 如果发现断言无效, 则可能时ide ...

  3. 理解和正确使用Java中的断言(assert)

    一.语法形式:    Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion),它的语法形式有如下所示的两种形式:1.assert conditio ...

  4. python中那个断言assert的优化

    Python Assert 为何不尽如人意# Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常. Copy >>> assert ...

  5. Java中的断言assert的用法

    Java陷阱之assert关键字 一.概述 在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多. 二.语法 在Java中,ass ...

  6. java 中的断言assert的使用

    一.assertion的意义和用法 J2SE 1.4在语言上提供了一个新特性,就是assertion功能,它是该版本在Java语言方面最大的革新. 从理论上来说,通过 assertion方式可以证明程 ...

  7. android中单元測试中的断言assert的使用与扩展

    首先看一组对照,比方说我们要測试的结果是一个Linearlaout AssertJ Android: assertThat(layout).isVisible() .isVertical() .has ...

  8. 断言(assert)简介

    java中的断言assert的使用 一.assertion的意义和用法 J2SE 1.4在语言上提供了一个新特性,就是assertion功能,他是该版本再Java语言方面最大的革新. 从理论上来说,通 ...

  9. C语言中断言ASSERT

    我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错". 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种&qu ...

随机推荐

  1. day 07 预科

    目录 异常处理 字符串内置方法 1.索引取值 2.切片 3.成员运算 4.for循环 5.len() 6.strip(): 默认去掉两端空格 7.lsteip()/rstrip(): 去左端/右端 空 ...

  2. LXC容器

    1.    LXC简述 Linux container是一种资源隔离机制而非虚拟化技术.VMM(VMM Virtual Machine Monitor)或者叫Hypervisor是标准的虚拟化技术,这 ...

  3. Linux设备管理——sysfs、udev

    What is the use of Sysfs sysfs is a pseudo file system provided by the Linux kernel that exports inf ...

  4. Luogu P2280/ACAG 0x03-1 激光炸弹

    Luogu P2280/ACAG 0x03-1 激光炸弹 这道题要用到二维前缀和. 首先读入时,令$a[x][y]=val$: 然后不难递推出$s[i][j]=s[x-1][y]+s[i][j-1]- ...

  5. github配置SSH proxy

    在windows users 用户目录下生成config文件,如在C:\Users\your_user_name\.ssh 目录下,找到config文件,如果没有新建一个,写入如下内容: Host g ...

  6. 大数据之路week07--day07 (修改mysql默认编码)

    在Sqoop导入或者导出,我们在查看mysql的时候会出现中文乱码大部分乱码会是?这样的问号,那么该怎么处理呢? 1.打开my.cnf文件  vim /etc/my.cnf 2.找到对应需要修改的地方 ...

  7. 用python做数据分析pandas库介绍之DataFrame基本操作

    怎样删除list中空字符? 最简单的方法:new_list = [ x for x in li if x != '' ] 这一部分主要学习pandas中基于前面两种数据结构的基本操作. 设有DataF ...

  8. crc计算工具推荐

    比较好的crc计算工具,32位64位系统都可以用的.crc的校验方法也很多.推荐使用 下载地址

  9. 思科ASA对象组NAT

    ACL对象组NAT配置 ciscoasa#conf t ciscoasa(config)#hostname ASA ASA(config)#domain-name asa.com ASA(config ...

  10. 洛谷 P1226 【模板】快速幂||取余运算 题解

    Analysis 快速幂模板,注意在最后输出时也要取模. 快速幂模板 inline ll ksm(ll x,ll y) { ll ans=; ) { ) { ans*=x; ans%=k; } x*= ...