抽象与建模
来源:互联网 发布:笔记本触摸屏手写软件 编辑:程序博客网 时间:2024/06/15 19:37
也许我的要求太高,但不管理如何,抽象与建模是做为一个初级软件开发工程师,所必须了解或熟知的运用的概念。(如果不具备也顶多是个高级程序员的价)
题外话:在先进国家的软件教育的科目中甚少使用一些热门的语言进行教学,有甚者使用内部的语言进行教学,目的在于抛离形式语言上依赖,更注重编程思想的建立与发展。
在接下来的话题中,我会更多简要的说下,我自己对抽象与建模概念的理解,如果那里说的不对,我非常高兴接受大家的指教。
A。抽象
抽象这一词在面向对象的语言中经常的提到,那么,什么是抽象?
我是这样理解的,在众多的事物中,如果存在(发现)一个或多个共同点(可以是任何东西),这些共同点通过某种方式可推算或验证的(也可以假定,如果不这样就没法子开发了),
那么抽取这些共同点就成为这些事物的抽象(真理)。
从词面意思:抽取类似(象)的
这似乎与我们实际的开发没有一点联系,就算不知道抽象,还是可以进行需求分析,程序设计(建库,建类),编码... 最后还是按时按地的交付了项目;
我对这个毫不否认,事实上的确如此,可是会遇到:
*.需求与实现不相符(客户客气的说:这个软件与我想象中的有一点不一样)
*.设计过于死板,没有适当的分离(高藕合度) (客户嘲笑的说:不是这里有问题,就是那里有问题,不怪的要定期交保护费)
*.拓展有局限,或无法拓展(客户愤怒的说:什么?我只想在业务中增加多一个审核环节也不行吗? )
*.过于形式化 (客户无耐的说:自从使用上这个系统,我老是要加班)
当然以上这些问题还有其它的因素导致。
软件从了解领域知识,需求分析到程序设计,甚到一个算法(函数的定义),都会涉及到抽象的概念,
如果我们无法理解抽象,就无法做到精炼(我相信学习过开发过程的都听过这个词,我的理解就是抽象后的结果),那么如何抽取这些共同点呢?
这个问题可能用一辈子的时间也说不清楚,更重要的是本人的能力有限,我只能依据开发中自己理解的情况来简单说一下:
在整个开发过程中重点之一:我们如何把实实在在的需求转换为形式化的程序语言
许多程序员在面对复杂的问题时,都不知道如何下手,好不容易想到应该先做些什么再做什么,而在实施过程又发现缺少相关的东西支持或与相关的东西存在冲突...,最后表面上能交出来,我相信他自己心里清楚内部是很混乱的(同事说:如果在这样继续下去,我会疯掉的)
这与思维方式有很大的关系,我们一般是先想后做,如果想是无序的,不全面的,矛盾的,做的结果也好不到那里去(即使在想->做的过程中还是有一个反馈的调整行为),
而抽象就是让你的思维方式以一种有序有的层次的方式进行问题(过程)的思考,告诉自己应该如何看待事物。
需要注意的是抽象做为一种主观的意识形态存在,也就是抽象是非形式的,从非形式到形式的过程中,受个人的主观意识影响很大:
说个例子:在生活中,手机与小型计算器,在我们直观的看来很确定两样是不同的东西,为什么?因为在我们的潜意识上,已经对这两样东西按用途进行区分了,假设把这两样东西放在几百年前的古人面前,他们极有可能认为这两样东西是类似的东西,因为外型类似,又如,做为一个物品管理员,他有可能把这两样放在一起存放,因为他不是按用途进行分类的而按电子产品分类的。在开发中,这样的事常有发生,对同一个问题:一个说true , 一个说false ,如果你站在他们各自的上下文中看,都说的对。在面象对象语言中:继承,多态,封装,还有类型。。。 包括面象对象本身,这些都抽象的形式化产物(更高级的抽象),而程序设计原则,极限(敏捷)开发过程,中有很多都与抽象密不分的关系存在。(这里,我想留给后面的高人进行分析讲解,这里就不多说)
例:抽象卖场中的商品(卖场:之前想用超市,觉得针对性太强,意思:是销售商品的场所,如:超市,小商店,临时贩卖档,,,任何形式的售卖点的统称)
在卖场中有对所有商品进行分类,如家电,服装,日用品。。。,而家电又分为电视,冰箱。。。 而电视又按厂家或尺寸分类,
分析:上面是抽象后的结果,是何如得到这些结果的;
在分析初期,我们假设我们对行业,厂家等的概念一无所知, (我们刚开启一个项目时,也是如此),只知道卖场要把这些商品出售给消费者,但前提是能让消费都快速的找到它想要的商品;
假设设每个商品共有的属性:名称,型号,重量,颜色,尺寸,生产日期;而这些属性可能是我们根据实际中得到的资料(初步认知),
后来发现有一些商品的属性可能参差不齐,如:有些商品没有型号,反而额外的出现新的属性,但我们发现所有商品中都有一个“名称”的属性,
而这个名称的值(如:电视机)在很多商品中经常的出现,然后我们去追索这些最终的供应商(厂家),
发现这些生产电视机厂家所提供的此类商品的属性极其的接近,以此类推其它的商品,也发现类同的情况,(发现case过程);
这时我们可以定义原子概念:行业(电器,五金,家具,服装…)。
我们在回过来看卖场的要求:让消费者*快速找到*商品;由此,我们延伸出几个问题:
# 商品是什么?
这个问题我想通过上述的分析我们已有一个初步的概念:行业,以此方法可向下得出新的分支概念(电器->电视->32寸,40寸…或平板,背投)
# 如何才能快速?
通过分析商品,掌握了商品的抽象方法概念,可能还需要一些算法或其它理论支持,我们是有可能找到一个合适的“快速找”的方案
# 消费者是什么?
最后这个问题的答案是用来验证我们之前的抽象的结果是否“正确”(在开发中没有100%的正确,它是一个理解值,所以我们这里的“正确”是相对来说的),前两个问题最终是为第三个问题而服务的,而卖场是面向消费者的服务单位,我想只有从卖场那里才能给出答案:白领,家庭主妇...。
B。建模
我们经常在开发过程中听到或看到,对数据库建模(建表建关系...),对象建模(定义类型,定义class),常看到一些人,在书上看到一些简单建模的例子,然后不管理是什么项目都死搬硬套用到该开发中去...(无话可说)。建模的意思其实也对某事物或过程进行抽象后的形式化的表现,也就是构造抽象的模型(模型有很多种表现手法,如图形,代码,表格...)。
根据上面的抽象分析,下面给出伪代码:
//我们抽象出来最基础的,表示所有的商品所共有的属性
Class MerchandiseBase //抽象
{
名称;型号;产地,生产日期 ;
ShowInfo( ) ;
}
//电器类的商品共有的属性
Class Wiring :MerchandiseBase //抽象
{
节能等级, 保修期, 是否三包 …
ShowInfo( ) ;
}
//假设把电器类分为电视与手机下两种类别
Class TV:Wiring //实现
{
类别(平板或背投),音频系统,视频格式…
ShowInfo(){ //实现抽象 };
}
Class Mobile:Wiring //实现
{
来电功能,电话簿容量,待机时间,FM调频收音机...
ShowInfo(){ //实现抽象 };
}
虽然给出来的结果非常简单,但目的在于说明抽象思维运用,而在实际的开发中,远不止这样简单,需要分解成多个可处理的单位
最后:
抽象的概念的形成并非一日之功的事,我经常遇到一些做了四五年编程的人,他们对某语言可以说无所不知,但抽象的能力却不敢苟同;也许抽象不好掌握,但如果保持天天向上,好好学习的精神,也并非难事。设计一个良好的程序或系统,单是能理解抽象我觉得还远远不够,但总是一个好的开始。
- 抽象与建模
- 抽象建模
- 推理逻辑算法--------------问题抽象与数学建模
- 数据结构---抽象建模
- 抽象建模能力题
- 抽象类----数据建模练习
- Java设计模式菜鸟系列(五)抽象工厂模式建模与实现
- 状态树搜索算法-------------抽象问题与建模思想(三只水桶分水问题)
- 领域建模与数据库建模
- 数据建模与业务建模
- 数据建模与业务建模
- 数据建模与业务建模
- 【数据建模】数据建模方法-关系建模与维度建模
- 剑指offer 算法 (抽象建模能力)
- 数据仓库建模与数据库建模的比较
- 数据建模与范式
- 三层与建模
- UML与软件建模
- 几个有意思的C语言程序
- JSP标准标签库
- Java笔记
- 获取系统时间
- 工作小结
- 抽象与建模
- USACO Section 1.3 Barn Repair - 卡了一年的DP...
- JSTL——核心标签
- 简便更改Eclipse的Title标题/标题图标/启动画面
- 外经贸11界硕士去向
- 知名ECM厂商Open Text进军中国市场
- usb2.0驱动学习笔记
- Android 高级绘图
- 存储过程简单定义,表复习