`

捅破窗户纸:如何从过程到对象—For金色的海洋以及所有为面向对象而困惑的Tx

阅读更多
本来不想写这篇很挨打的Post,不过在最近几天的最热的几篇Post里面看到无数的Tx为了面向对象的争论,感触颇多,遂作此篇。
鄙视OO的也进来鄙视我吧。望OO达人多多指正。

前头有一篇关于对象持久化的。不过很多Tx,连OO都不理解,那么持久化也是空谈。
我们首先抛弃千篇一律的什么对象来源于生活,是真是对象的程序表现的屁话,空洞,对于一个一接触程序就开始过程,将严谨的过程渗透到骨髓里的工程人员来说,跟他扯这个简直是对牛谈琴。所以我们从过程来讲对象,然后来看如何将过程化的思维方式转化到对象式的方法论。以及过程抽象的弊端以及为什么要在复杂系统里OO。
我们不能否认,我们在描述一件事情的时候,可以按照过程的方式进行抽象。打个比方。
=======================
将一个表单存入数据库
=======================
按照过程的方式描述。
1.一条条读取表单上字段的值
2.根据值构建SQL语句
3.创建链接
4.创建命令
5.执行命令
6.关闭链接
基本上也就6步就完成了,没有多余的步骤。同意?

那么接下来我们把这个命题扩展到两个表单乃至N个表单,那么这个过程就会N倍的扩张。于是过程达人们就开始动脑筋了。于是开始了第一个迭代的抽象(根据怪怪的理论,我们认同过程的抽象)。我们把构建SQL语句的部分过程抽象出来成了单独的过程-[构建Sql语句]。再一看,我们其实对执行SQL都可以抽象,于是将3,4,5,6都抽象出来,于是SqlHelper诞生了。

这就是过程抽象的方式,不可否认其实我们很多人都经历过这个阶段。而且对此很为困惑。如果所做的很简单,过程很短,那么看起来过程的抽象方式确实更加容易理解。但是我们来看看过程的噩梦在那里。

我们继续扩充命题。
现在我们提交一个表单需要提交到两个数据库。于是我们的N个表单又产生更多的子过程。随着单个过程的长度增加,我们抽象出来的子过程还可能抽象出子过程,结果抽象出来的子过程呈级数增加。直到你的脑袋爆掉。
还有一个问题就是,我们抽象出来的子过程放哪里?C#是一个面向对象的语言,所有的过程(或者函数,方法)都是从属于类,于是就出现了一个巨大的类包含无数静态方法的怪胎。

那么,我们来看面向对象。面向对象和过程有什么联系呢。其实程序最终的运行还是按照过程的,类的作用就像一个框框,指定了那个过程应该属于那个类,必须在存在对象的时候才能调用还是在类中调用。之前在过程的时候抽象出的一大堆子过程杂乱无章。但是在用面向对象的方法所抽象出来的对象确实井然有序的。
对象在执行的时候是按照一定的时序和过程在执行(所以在UML里有时序图)。但是我们不能够因为计算机是按照过程在执行就否定了OO,因为OO是设计时的概念(所以只有OOA、OOD、OOP而没有OOR【面向对象执行-自我发明的词,不存在此物】),而OO的过程是在设计的时候自然而然的产生的,既然OO的语言都存在,那么在这么多年的实践中,证明OO的方法是行之有效的。

下面我们来看如何OO。
用一个很简单的例子,聊天室,不用数据库的,数据记录在内存。
 

       虽然聊天室比较简单,但是我们还是通过用例分析来构建业务逻辑的领域模型。首先我们来找用例。下面是我们对聊天室业务的描述:

       建立一个聊天系统,用户在登陆后方可发言,用户可以看到所有人的公共发言和其他用户发给自己的私聊信息,用户可以发布公共信息和单独发送私聊信息给某个用户。用户可以自己创建聊天的房间,并作为聊天的主持人拥有对房间的控制权,可以踢人出房间。用户可以加入任何一个房间开始聊天。

       我们通过上面的描述可以得到两个粗略的实体:用户,房间。然后画个用例图来看看:


 

       然后我们分别建立这几个用例的用例卡片:

创建房间的用例

用例名称

创建房间

用例描述

用户创建一个自己控制的聊天区域

事件流

(用户已登陆)用户输入要创建的房间名称后系统创建一个新房间,创建房间的用户自动进入房间

备选流1

(用户已登陆,已经创建了一个房间)提示用户一次只能创建一个房间

备选流2

(用户未登录)按钮无发点击

进入房间的用例

用例名称

进入房间

用例描述

用户选择一个聊天区域进入

事件流

用户进入一个聊天区域后获取当前公共聊天区域的信息,

发布公共信息的用例

用例名称

发布公共信息

用例描述

用户向其他所有用户发布信息,所有的用户都能够收到

事件流

(用户已登陆)用户输入要发布的信息后将信息发送给所有用户

备选流1

(用户未登录)不能发布

发布私聊信息的用例

用例名称

发布私聊信息

用例描述

用户给指定用户发送消息

事件流

(用户已登陆)用户选择要发送消息的用户和要发送的信息后将信息发送给指定用户

备选流1

(用户已登陆,要发送的用户不存在)提示用户要发送的用户不存在

备选流2

(用户未登录)不能发布

踢人的用例

用例名称

踢人

用例描述

创建房间的用户将选定用户踢出房间

事件流

(用户已登陆,是房间创建者)用户选择踢的用户,改变该用户的状态为被踢

备选流1

(用户已登陆,但不是房间创建者)看不到此功能

备选流2

(用户未登录)看不到此功能

       我们根据上面的用例描述基本覆盖了大部分业务的流程。我们在其中抽象出下面的对象:

l  聊天系统

l  房间

l  用户

l  消息

l  消息区域

 

现在我们来分析这几个对象之间的关系,首先是聊天系统,因为是多人的系统,所以比如说创建房间的行为,虽然是用户发出的,但是实际上的创建者和拥有者却是系统,我们需要一个容器来容纳所有的对象。所以其实换一个思路来说,系统对象就相当于一个大楼,而房间就应该在大楼里。因为系统里有多个房间,所以系统里应该有一个房间对象的列表。

       因为房间是有名字的,所以为了方便检索,我们需要将房间的名字作为索引。因为我们要从系统找到房间,就需要提供一个查找房间的行为,而且系统也要提供房间的列表。最后我们得到了一个类图:


       然后我们来看房间,房间包含在系统中,被用户通知系统来创建,在创建的时候要给房间一个名字,以方便用户来找到这个房间。房间里有什么呢?房间里有人,也就是在交谈中的人,所以我们要在房间里准备椅子,也就是聊天用户对象的列表。因为是不见面的聊天,所以每个人都将要说的话写下来(一个消息),然后如果是给所有人看的,就贴到公共的留言板上(消息区域),如果是发给某个人的就把消息交给某个用户,所以房间的程序(房间对象)需要两个处理消息的行为,一个处理公共消息,一个处理私人消息。最后将用户清除出房间的行为也需要房间来执行(因为用户包含在房间里,所以根据封装的原则,这个行为只能由房间来执行,当然可能不一定是房间发起的)。最后我们得到了类图:

 

接下来我们继续分析用户对象。因为很多动作都是用户主动发出的。首先用户对象必须实现所有用例上的行为:

l  创建房间

l  进入房间

l  发公共信息

l  发私聊信息

l  踢人

然后再来分析用户的属性,首先用户在一个房间内,那么用户需要有一个房间的属性,在进入一个房间就具备这一个房间的属性。然后我们还需要一个属性用来表示用户的状态。还有就是用户收到的消息需要一个地方来存,所以需要一个用户消息的存储区域,所以需要一个消息池。最后得到类图:




 

       消息池对象是属于用户和房间的,算是一个公共的结构,作用就是用来存放消息,并且从特性上来说是一个栈结构的容器,也就是FIFO队列。而由于这个类的对象的生命周期都是由房间或者用户来维护管理,所以基本上属于内部对象,这里也就不用画关系了。消息池需要几个行为:添加消息、清除消息两个方法。这两个方法主要出于封装上的需要,主要是用来提高整个对象的内聚减小耦合。类图如下:



 

最后是消息对象,消息对象基本上算是DTO对象,用来传递信息的,所以只需要值属性就可以了。

最后我们初步的通过分析整个业务逻辑的问题域得到了体现领域模型的类结构。我们在之后会继续修改完善这个模型,因为如果我们在某个过程的实现当中需要操作另外一个对象的内部成员的时候,那么我们就需要在目标对象上增加属性,或者是增加方法,这里对于值对象我们推荐用属性,而对于一些需要操作的复杂对象,比如列表,我建议使用方法。

最后我们实现这几个类就OK拉。

分享到:
评论

相关推荐

    老刘心语23如何捅破编程这层窗户纸?(下集)分享更能学好编程的建议

    老刘心语#23如何捅破编程这层窗户纸?(下集)分享更能学好编程的建议

    老刘心语23如何捅破编程这层窗户纸?(上集)分享更能学好编程的建议

    老刘心语#23如何捅破编程这层窗户纸?(上集)分享更能学好编程的建议

    快手无人直播团购超细节教程-捅破窗户纸小白也可月人过万-教程网盘链接提取码下载 .txt

    本教程旨在为有意进入该领域的创业者提供从入门到精通的全面指导。 一、快手团购无人直播 如何开启 开启快手团购无人直播,首先需要对直播平台的基本规则有充分的了解。无人直播的核心在于使用自动化工具模拟直播...

    面向对象编程 规则

    这一概念来自破窗理论,它比喻如果一栋楼的一扇窗户破了而没有及时修复,其他窗户也会很快被打破,最终导致整栋楼被破坏。在编程中,这意味着代码的整洁性非常重要。程序员应保持代码库的整洁和一致性,一旦发现不良...

    中班语言活动:金色的房子.doc

    这篇文档是关于幼儿园中班的一次语言活动,主题为“金色的房子”。活动旨在教育孩子们与朋友友好相处,同时学习和理解一些词汇和短语。以下是根据文档内容提炼出的相关知识点: 1. **教学目标**: - 社交技能:...

    SPVLoc: Semantic Panoramic Viewport Matching for 6D Camera Local

    ### SPVLoc: Semantic Panoramic Viewport Matching for 6D Camera Localization #### 概述 本文介绍了一种名为SPVLoc(Semantic Panoramic Viewport Matching)的新方法,该方法用于解决在未知环境中实现六维度...

    《海洋生物》优秀读后感.doc

    书中的内容从海洋动物到水鸟,从现存物种到已经灭绝的生物,每一个章节都像是一扇扇窗户,为我们打开了一幅幅宏伟壮丽的海洋画卷。 水鸟章节中,作者用生动的语言和详实的资料向我们展示了这些鸟类如何在海洋环境中...

    JavaScript数组对象赋值用法实例

    这里JavaScript数组对象的使用会使你的JS程序变得简洁而有效率,但是好像不少新手都不喜欢用数组,因为觉得它们抽象,不好理解,其实只要你认真领悟,它就像捅破窗户纸一样,令你豁然开朗。希望通过本实例,你对数组...

    架构探险:从零开始写分布式服务框架 程序开发书籍 RPC框架 李业兵

    《架构探险:从零开始写分布式服务框架》的初衷是希望把分布式服务框架的实现细节及分布式服务框架周边的知识点梳理清楚,为那些对分布式服务框架感兴趣的人打开一扇窗户,降低获取相关知识的门槛。所以《架构探险:...

    AutoCAD ActiveX 对象的方法一览表

    **应用场景:** 在开发过程中,如果需要批量添加相似类型的对象到AutoCAD环境中,此方法提供了高效的操作手段。 ##### Add3Dface **功能描述:** 给定四个顶点创建3DFace对象。 **应用场景:** 适用于三维建模中...

    用java编写的开窗户游戏

    1. **Java基础知识**:游戏的基础框架建立在Java的面向对象编程思想之上。每个正方形按钮可以被设计为一个单独的类,具有自己的属性(如颜色、位置)和方法(如点击事件处理)。同时,游戏的状态(如是否获胜)也...

    【《破窗户》阅读附答案】大门对窗户的破解方法.docx

    破窗户理论的关键在于其对个体行为和心理状态的启示作用,以及在个人生活、职业发展、学习态度和团队管理中的广泛应用。 首先,我们从理论的起源和实验设计入手。破窗户理论源自于一项实验研究,其中通过比较两辆...

    建筑CAD快捷键.pdf

    以下将详细介绍一些常用且重要的快捷键,分为字母类、绘图命令、修改命令、视窗缩放以及尺寸标注等方面。 1. 字母类快捷键: - ADC (*ADCENTER): 设计中心,用于浏览和插入图形资源。 - CH (*PROPERTIES): 修改...

    flash as3 擦窗户效果+回放

    在Flash AS3编程中,"擦窗户效果"是一种常见的动画技术,它模拟了真实世界中清洁玻璃的动作,通过逐步揭示隐藏的内容,使画面从模糊变得清晰。这种效果通常用于游戏、交互式应用或者动态展示中,增加视觉吸引力。在...

    建筑窗户分割系统:全面学习计划.zip

    建筑窗户分割系统:全面学习计划

    国外知名大学java入门课程讲义

    这份由澳洲知名大学提供的Java入门课程讲义,不仅深入浅出地介绍了面向对象开发的基本概念,还清晰地划分了软件开发过程中的关键活动,为初学者提供了一个结构化的学习框架。通过复习类与对象的基础知识,讲义进一步...

    AUTOcad快捷键 PKPM

    - **功能**:将块或其他组合对象分解为单个对象。 - **应用场景**:需要编辑块内部的细节时使用。 7. **TR,*TRIM(修剪)** - **功能**:修剪选定对象。 - **应用场景**:用于删除对象的部分边缘。 8. **EX,*...

    CAD和天正快捷键白金精华版.pdf

    - Copy(复制):快捷键为“CTRL+C”,用于复制选择的对象到剪贴板。 - Zoom(缩放):快捷键为“Z”,用于调整视图的缩放比例。 - Pan(平移):快捷键为“P”,用于在图纸上移动视图。 - Zoom in(放大视图):...

    手工制作剪纸.pptx

    剪刻时遵循从小到大、从左到右、由内向外、由细到粗、由局部到整体的规律,确保剪纸过程的顺利进行。 剪纸的纹样和剪法多样,常见的有: - 锯齿纹:用于表现坚硬或刺状物体,如荆棘、羽毛。 - 月牙纹:适用于表现...

    CAD绘图高级技巧+实用命令

    - **命令简介**:将对象从一个位置移动到另一个位置。 - **使用场景**:调整对象位置。 #### 旋转:RO - **命令简介**:围绕一点旋转对象。 - **使用场景**:改变对象的方向。 #### 比例缩放:SC - **命令简介**:...

Global site tag (gtag.js) - Google Analytics