如何正确地使用#region指令
2016-05-09 10:14
190 查看
转载地址: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 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
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 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- 深度学习基础(九)—— 深度学习中的优化方法
- LeetCode.104. Maximum Depth of Binary Tree
- Missing artifact com.oracle:ojdbc14:jar:10.2.0.2.0
- 深入Java集合学习系列:HashMap的实现原理
- mongodb创建索引
- (OK) Fedora 23——CORE——docker——(7)——> dockersvc.py
- POJ 2342 Anniversary party
- linux tcpdump
- JavaScript笔记(3)---编程性能优化
- 单例模式
- python第四讲
- CodeForces 590A Median Smoothing
- spark安装文档
- ant批量打包android_apk(一步一艰辛)
- 使用icomet 实现长轮询(续)
- STM8L151 使用硬件SPI驱动VS1003B MP3解码芯片
- 我敢保证,面试官想在简历里看到的其实是这些
- 。net用lamda实现属性的优雅操作
- 梦断代码阅读笔记2
- python基础set