这是一篇文字较多的文章,建议您仔细阅读,因为它将完整展示构建一个面向对象代码的过程,当然这个思想过程是我个人的过程,每个人有自己思考的方式方法,我的仅供参考。
一、编写面向对象,首先要构思
构思一般随意,你可以在自己脑海中构思,也可以借助专业的UML来构思,又或者借助纸笔构思,总之,一切随意,只要你喜欢。
那么下面这张图,是我在纸上画的构思:
二、形成你的思路
通过构思,你可以慢慢的理清、形成自己的代码思路。
回到“家庭”这个例子,我当时是这么思考的:
家庭,就要有家庭成员,所以,我可能会有一个IMember的接口。
然后我想到家庭成员之间存在一定的关系,比如父与子、母与子等关系,于是有了IRelation接口。
接着我就想到了家庭属性,家庭应该是独特的,自己的定义,所以就有了Family,有了Family,我就想到了应该抽象成IFamily,而IFamily很可能会有家庭名称、人员列表等属性或者方法定义。
再然后我回顾之前的思路,想到关系会有多种类型,它可能会是个枚举,所以就有RelationTypes枚举对象。
那有了关系,可能需要一个关系管理类来管理它。所以,我就有了RelationManager类。
最后我又思考到了家庭成员,每个成员都有自己的个性。而个性是复杂,不一定是单一的,比如有些成员好动而热情,比如爸爸面冷心热等。于是我想个性应该是个具有Flags标签的枚举,允许一个成员具有多重个性。
三、检查回顾,并理解你的需求是否满足
我们在工作中,对于一个功能开发项,它首要保证的是实现业务需求,所以,我们在做了简单的建模后(构思即是建模的过程),需要结合实际,看是否满足需要。
那么我们看“家庭”这个例子,由于我是举例子,所以它目前的简单建模可能是正确的。暂时也不需要加其它的需求了。
但现在觉得没有问题的建模,在实际编写代码后,可能会面临实际项目中,我们尚未考虑到的点,这时就需要不断迭代建模。直到你的思维准确为止。
四、关于对象的方法或者属性
我个人的习惯是简单建模出整体框架后,就开始写代码了。
可能有的人,做事较为细致,在构建阶段,就会想要事先定义好每一个对象的方法或者属性,这也是可以的。看您习惯和喜欢。
五、编码,我们先写关系代码
1.先定义成员关系接口
2.定义成员关系类型的枚举
3.定义关系创建接口
这里要稍微注意下,这与我的简单建模规划的关系思想有些不同,增加了关系创建接口。所以说,我们在实际编码过程中,针对业务的情况会有偏移,需要进行重构建模。
4.定义成员关系接口的实现类
这里要特别注意的是,我这里将实现类定义成internal,这就意味着,除了我们自己外,外部调用我们api的人,也就是外部程序员引用我们的dll的话,是无法直接new一个Relation对象的,因为我们把它定义成了内部类。这样就可以规范外部调用者的行为,指定了他如果想要实例化这个Relation类的话,必须通过其它途径来实现。
5.定义关系创建类
这个就是别人想要创建关系时,所必须通过的途径。因为他无法实例化Relation类,只能通过我的RelationBuilder对象的Create()方法来创建,这就规范了使用我们api的人的行为。
六、编码,我们编写家庭成员和个性的代码
1.家庭成员的接口定义
我们会看到家庭成员接口只定义了全名和性别2个属性,但是家庭成员是有个性的,为什么不放在一起写呢?这就是面向对象的接口隔离原则,你可以参考我的前面文章,有一篇单独讲“接口隔离原则”的。
2.家庭成员的个性枚举,注意个性是多重的,所以,我们的枚举要定义成Flags
3.然后我们定义一个家庭成员的个性接口
4.最后,我们来定义家庭成员的实现类Member.cs
注意看这个成员实现类,它实现了两个接口,分别是IMember和ICharacter。我们定义了它的构造函数,带有fullName和sex两个参数,所有public的公开属性都是只读的,这意味着别人只能访问而无法修改。开放了设置个性的方法SetCharacter()。
好了,由于篇幅很长了,所以,关于家庭的接口,我就不再继续写了。相信你通过上面两个例子,也已经学会了,如何去编写面向对象的代码思路了。
如果你能学会并运用这个思路,那么我很为你高兴。