转载地址:http://www.cnblogs.com/zhuqil/archive/2010/09/07/about-region-preprocessor-directive.html

public void DoSomething() { bool shouldIDoSomething; #region Decide if I should do something if(needToDoSomething && haventDoneSomethingThisDay) shouldIDoSomething = true; else { // do some other logic to decide and set shouldIDoSomething to some value } #endregion if(shouldIDoSomething) { done++; } }

当然这段代码很简单。在实际项目中,你可能看到上百行甚至更多的代码在一个#region中。如果把它折叠起来。看起来就会很整洁。是吧?

public void DoSomething() { bool shouldIDoSomething; [Decide if I should do something] if(shouldIDoSomething) { done++; } }

只是把一些代码和一些变量组合起来放在#region中。如果你在仔细想想,其实我们相当与创建了一个新的函数,只是将这些方法内置到当前函数中。一个函数只做单一的一件事情,这是Clean Code这本书的一个原则。为什么我们不把它提取为一个函数呢,这样一来,一个函数就只做一件事情了。

public void DoSomething() { if(ShouldIDoSomething()) { done++; } } private bool ShouldIDoSomething() { if(needToDoSomething && haventDoneSomethingThisDay) shouldIDoSomething = true; else { // do some other logic to decide and set shouldIDoSomething to some value } }

上面看起来就清楚很多,因为我们降低了之前的DoSomething函数的复杂度。两个函数可以分开测试,确保没有逻辑错误。
小段总结1:  #region 不适合在大方法中使用,当你在一个方法中使用#region 的时候,停下来想想你刚刚写了什么代码?大多数时候,你可以将这些代码段独立成一个函数。

看看下面这段非常漂亮的代码:

#region Get Customer public void GetCustomer() { // code to get the customer } #endregion #region Save Customer public void SaveCustomer() { // code to save the customer } #endregion

将它折叠之后,变成下面这样:

[Get Customer] [Save Customer]

这样做很容易阅读吗?这样做的目的是什么,我不明白?代码折叠就会变得更好?我觉得这样做只会让代码更难以阅读,因为你每次要看region中的代码,你都要展开一次。

小段总结2:不要因为你能,你就使用#region 。

再看下面这个例子

public class PriceCalculator { public decimal CalculatePrice() { decimal price = 100m; decimal discount = CalculateDiscount(); return price * (1m - discount)); } #region Discount Calculation private void CalculateDiscount() { decimal discount = 0m; if(CanApplyDiscount()) discount = 0.05m; return discount; } private void CanApplyDiscount() { // some logic, other method calls } // some other discount calculation methods ... #endregion }

如果你将这个例子和本文中的第一个例子做下比较,你可能会看到它们的共同点。他们是相同的,不过一个是在类中,一个是在函数中,层级不同而已。这里在提一个原则:单一职责原则,一个类应该只有一个职责。看上面的类,你可以很容易看出它有两个职责:价格计算和折扣计算。折扣计算的方法被放到一个#region中。同样,可以将它们提取出来做为一个新类。

    小段总结3:可以将一组相关的函数提取到一个职责单一的新类中。

那我们到底怎么使用 #region 呢。将东西用它来分组,它是非常有用的。在我写的类中或多或少有几个#region,用来对类中不同的结构进行分组。比如: fields, properties, methods, events, types等。如果你打开我写的类文件,你会看到结构如下:

public class SomeClass { [Events] [Fields] [Properties] [Methods] }

    总的来说:我将#region看成能控制阅读源代码的复杂度的一种方式。因为你可以将一些相关的代码放在一个区域(#region)里面。但是,这不是你随便就创建新方法或者新类的借口。其实Region并不能消除复杂度,它只是在你阅读代码的时候,隐藏了部分代码。你必须通过写出小巧,清晰,重点突出的方法和类,才能控制代码的复杂度。当你做到这些的时候,你甚至会发现#region是不必要的。

本文翻译:About #region preprocessor directive

作者:朱祁林 出处:http://zhuqil.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

如何正确地使用#region指令相关推荐

  1. 必须正确理解的---ng指令中的compile与link函数解析

    这个绝对是深入的知识,但看完之后,对NG的理解就很利害啦. http://www.ifeenan.com/angularjs/2014-09-04-%5B%E8%AF%91%5DNG%E6%8C%87 ...

  2. armv8 汇编 绝对地址赋值_详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系...

    @[TOC] 为什么要有相对跳转和绝对跳转? 顺序执行:指令一条一条按照顺序往下执行,比如变量的定义和赋值都是按照顺序执行的.跳转执行:当指令执行到当前位置后跳转到其他位置执行.比如,在主函数中调用其 ...

  3. 密码学专题 非对称加密算法指令概述 RSA

    非对称加密算法也称为公开密钥算法,其解决了对称加密算法密钥需要预分配的难题,使得现代密码学的研究和应用取得了重大发展. 非对称加密算法的基本特点如下: 加密密钥和解密密钥不相同; 密钥对中的一个密钥可 ...

  4. BCD码指令 AAA DAA AAS DAS AAM AAD

    2019独角兽企业重金招聘Python工程师标准>>> 十进制数(BCD码)运算指令 在计算机中十进制数是用BCD码来表示的,BCD码有两类:一类叫压缩型BCD码,一类叫非压缩型BC ...

  5. 抗去除花指令(一)——花指令基础

    转自 http://blog.csdn.net/yangbostar/article/details/6194133 入门知识,高手勿读 一. 概述 花指令是对抗反汇编的有效手段之一,正常代码添加了花 ...

  6. [ctf逆向002]:修改二进制文件中汇编指令的三种方法(OD、IDA、C32asm)

    文章目录 一.IDA中修改汇编指令 二.OD中修改汇编指令 三.C32asm中修改汇编指令 为对二进制文件进行破解,常常面临修改汇编指令,重新保存二进制文件的工作,以<加密与解密>第四版3 ...

  7. VB.Net - 指令

    VB.Net编译器指令给编译器指令,以便在实际编译开始之前预处理信息. 所有这些指令以#开头,并且在一行上的指令之前只能出现空格字符. 这些指令不是语句. VB.Net编译器没有单独的预处理器; 然而 ...

  8. jnz和djnz_8051的指令

    布林指令集包含ANL和ORL运算但没有XRL(Exclusive OR)运算,但是XRL运算很容易地由软体模拟,例如:想要作两位元的互斥或C=bit1 XRL bit2可以用如下的软体加以达成: MO ...

  9. 《汇编语言》第5章 [BX]和loop指令

    1.[bx]和内存单元的描述 [bx]是什么呢?和[0]有些类似,[0]表示内存单元,它的偏移地址是0.比如在下面的指令中(在debug中使用): mov ax,[0] 将一个内存单元的内容送入ax, ...

  10. 汇编语言中的XLAT查表指令

    如何正确使用查表指令XLAT ? XLAT指令简介 ①功能:完成一个字节的查表转换功能.将DS:[BX+AL]指向的字节单元的内容送给AL.其中,BX存放的是DS段内表首元素的偏移地址,AL存放的是表 ...

最新文章

  1. 引导直觉解决数学猜想难题,DeepMind登上《Nature》封面
  2. linux 从行查看文件,linux 查看文件内容
  3. python生成斐波那契_python学习-生成器(generator)及斐波那契;yield
  4. Selenium自动化测试框架
  5. kotlin集合操作符——生产操作符
  6. 人脸识别的过程和算法
  7. 简述控制反转ioc_讲一下你理解的 DI 、IoC、DIP ?
  8. 这些人生经验与常识相反
  9. Spring Cloud with Turbine
  10. javascript权威指南 学习笔记之变量作用域
  11. 安装@vue/cli脚手架又又又出问题啦!!!
  12. 合肥工业大学数值分析(计算方法)满分实验代码(python实现)
  13. 环保数采仪环境污染在线监控设备 上传监控平台
  14. R和RStudio软件安装
  15. IoC与DI工厂、单例、原型模式详解
  16. 西门子1500PLC添加伺服电机
  17. 那些堪称神器的PPT制作小工具
  18. php不能使用class,php – 致命错误:不能使用stdClass类型的对象作为数组
  19. 第4章 商业蜂窝通信系统的典范-GSM
  20. 2019 让自己变的更加优秀(文末新年福利)

热门文章

  1. 【数字信号调制】基于matlab GUI FSK调制+解调【含Matlab源码 645期】
  2. Python中for循环之range、enumerate函数
  3. 例2.5 统计同成绩学生人数 - 九度教程第10题(Hash的应用)
  4. 编程求一个四位自然数ABCD,它乘以A后变成DCBA
  5. 台式计算机开机密码设置,设置台式电脑的开机锁屏密码的方法步骤
  6. 航天有关的计算机知识,这些关于神舟十二上的电脑硬核小知识,你知道吗?
  7. webpack 处理字体_不可错过的Webpack核心知识点
  8. 德国计算机博士怎样,2020年德国IT博士offer什么时候发
  9. 从零开始使用webpack 4, Babel 7创建一个React项目
  10. 高速缓存dns/ddns