建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间
在我们身边的世界中,对象是什么?对象就是事物,俗称“东西”。那么,什么东西算得上是一个对象呢?对象有属性、有行为。以动物为例,比如猫(Cat)。Cat可以有Name,这就是属性;Cat有一个恶习ScratchSofa(挠沙发),这就是行为。我们把这些属性和行为结合起来,就称为一个类型:
class Cat { public string Name { get; set; } public void ScratchSofa() { Console.WriteLine("{0}在挠沙发",Name); } }
当然,类型只是规范了某类对象,它提炼出了接口、规范了协议,而真正的对象是要生产出来的。比如Tom猫,必须生产(即new)出来,才会在现实世界(可以理解为CLR运行时)中真正存在(即分配内存)。代码如下:
Cat tom =new Cat(); tom.Name = "Tom"; tom.ScratchSofa();
软件中的任何“东西”都可以用这个思路去理解。
当我们编码时,将CLR当成一个现实世界,并时刻考虑将某些具有共同属性和行为的对象抽象成一个个类型,这时我们就迈出了面向对象的第一步。
现实生活中的对象可以归类,这往往是一种树形结构。我们将生物归纳为动物和植物。
CLR中的对象也是与之相同的道理,以WinForm中的窗体为例,我们将系统中的窗体分为后台管理窗体和报表前台窗体。
在编码过程中,我们将类型用包(文件夹)管理起来,就有了“命名空间”的概念。命名空间中的每一个节点,如“后台管理窗体”,就代表一个分类。在该节点下,是属性和行为比较近的一组类型。如果不将类型分组分类,混乱马上就会出现。当然,在敏捷开发中不要求一开始就将所有的类型或命名空间都定义出来,随着每一次迭代的进行,可以通过重构将类型的组织结构整合得更加合理。
转自:《编写高质量代码改善C#程序的157个建议》陆敏技