`
kgd924
  • 浏览: 43069 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

OOP 思想入门思考

 
阅读更多

经常有人问什么是OOP思想?为什么要用OOP?OOP那些东西写function(方法)也可以实现啊?设计模式要多写代码,那么繁琐为什么还要用?

不想用学术理论和方法论来解释了,因为越来越多的人喜欢‘快餐’,懒得去思考理论推演。那就举一个例子吧,可能不是很恰当,要是能让入门者理解OOP那就行了。

面向对象和面向的过程的区别?

开发一个系统,就像在一个大的敞房里面做装修一样。 面向过程注重功能性,实现了效果就好了。东面放一个煤气灶可以做饭了。 煤气灶南面,放两个凳子摆一个桌子,可以吃饭了。  靠西边放一个床,就有睡觉功能了。 北面来一个放一个马桶就可以满足洗澡和上厕所的功能了。大致效果图如下:

 

好吧,这个就是满足,煮饭,吃饭,睡觉,上厕所所有功能性的装修。 中间还用了struct (窗帘) 这个结构性来隔离一下功能块。 可以住人么? 可以完全可以,这样的功能性住房,至少有几千年历史吧。 或许很长时期都是相当不错的住房了。今天的你愿意去住这样的房子么?

那面向对象的装修是什么样子呢?放煤气灶的地方,用墙隔离起来,叫厨房。放桌子的地方,叫餐厅,桌子边上放一个电视,叫客厅。 放床的地方,叫卧室。有马桶的地方叫洗手间。

这个是用面向对象,分装了几个类(洗手间,厨房,卧室)。客厅和餐厅很奇怪吧,明明就在一个大敞房(一个类)里面,一会儿叫餐厅,一会儿叫客厅。这个就是一个类里面实现了2个接口。

功能性没用太大增加,方便性还有所下降,起床要走到客厅,在到洗手间,以前窗帘一掀就可以过去上厕所了。在厨房吃饭的人,都不知道厨房下个菜煮什么了。为啥这么不方便,今天的人还愿意这么装修房子呢?

那面向对象的装修,方便性下降了,限制也多了, 开发成本也上升了,主要不同房间还要不同的装修方式,地砖,墙砖都不一样。太麻烦了!!!为啥大家都还用这种方式呢?这个岂不是社会的退步!!!

需求在增加啊!

厨房,里面要抽油烟机,冰箱,橱柜,等等。

客厅,要电视,沙发,茶几,音箱,等等

卧室,衣柜,卸妆台,什么的

洗手间, 热水器,淋浴,洗漱台,等等。

要是这些东西都放到一个敞房(大类里面是什么样子).

 

用了类就是面向对象的思想了么?懂得房子分了小房间,我就能做装修设计师了么? 

在代码里面用了类,和有面向对象思想还相差很远。还需要学习软件界的规范和大众化的概念。就像装修里面的厨房,放什么方向,卧室床放什么位置之类。很多东西只能遵循规范,才能让人理解,具有适用性。对应到代码里面就是类,方法,变量的命名。

例如:

洗手间,大家一听就知道是什么。要是说成“具有排泄和洗漱功能的房间”, “洗间”,“三急房”, “茅房” 等。就不具有现代社会的大众化,增加了沟通成本。

对应到代码:

DataModel, 要命名成,“SQLInsertUpdateDeleteClass”, “MyData”, “DataSql”, 等。都会给其他阅读代码的人造成麻烦和困难。增加了沟通成本。

 

不要轻易的创造新的名词,而是尽可能多的利用业界通用的命名方式。这个就是学习设计模式的必要性。设计模式不是神器,就像装修房子,知道了很多欧式风格,日式,美式,古典。但是怎么装一个让用户满意的房子呢?这就需要和用户的深入沟通。

 

什么是抽象呢、什么又是封装呢,还有动态特性是什么?

抽象很难,也很简单。难得是你要抽象一个大众认知的模型和结构。简单就是你可以参考现实世界的模型。

回到前面装修的例子,设计师在洗手间, 放上三个盒子贴一个标签“洗手液”、“沐浴露”、”洗头液”,就完成抽象了。他不关心房子主人,用什么牌子的洗手液,或要不要用洗手液。但是设计师完成了洗手间的装修设计了。现在看来放三个盒子,是很简单的设计。其实这里面包含了很多东西,这需要对用户认知的把握,功能性需求的理解。(回到30年前,大家都用肥皂的年代,这三个盒子还简单么)

写代码例子:

1
2
3
4
5
6
7
8
9
class DataModel {

public int insertData(Object obj);

public int updateData(Object obj);

public int selectData(String sql);

}

 

这样就完成设计了。管他是否需要update功能呢,先根据一般的规范。放上去再说。不需要就不去实现这个方法。也不关心用Oracle,还是Mysql,或是KvDB来保存。

好的抽象和不好的抽象?没有固定的准则,只有一个业界普适的参考。 

例如:

1
2
3
4
5
class DataModel {

public int dataOperate(String sql);

}
 

这样把三个方法统一成一个方法。看起来更方便了,更灵活了。但是不具有普适性了,和业界理解的DataModel不一样了,功能性其实是一样的。这就像把洗手液,沐浴露,洗头液,换成一个肥皂盒。 肥皂功能强啊,洗手,洗澡,洗衣,洗头,什么都可以用的。但是现在都不这么装修了。

 

哦,要分散是吧,这样更专业。那这样呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class DataModel {

public int insertHatData(String sql);    //插入帽子

public int insertShoesData(String sql);  //插入鞋子

public int insertDressData(String sql);  //衣服

public int updateHatData(String sql);

public int updateShoesData(String sql);

public int updateDressData(String sql);

public int selectHatData(String sql);

public int selectShoesData(String sql);

public int selectDressData(String sql);

}
 

这就是把,洗手液,沐浴露,洗头液,分层老人,小孩,成人使用了。不能说这个不对,够不够好,具不具有普适性。各有各得体会。

抽象就是,设计的时候放上几个盒子贴一个标签。客人或主人,只要看到盒子上标签就知道可以用哪个盒子了。

封装就是,把合适的盒子放到合适的房间。把沐浴露封装到厨房肯定就不合适。 但是洗手液呢?有点不好决策了,那就参考规范吧。

动态性就是,盒子里面既可以放田七洗手液,也可以放超能。(前提是需要了解一点盒子大小的工业标准)

 

怎么学习面向对象开发? 

和学习装修房子一样,多画设计图。 多画UML 图绝对是学习的最好方法。  但是画来画去,就只能分几个大房间。 里面进一步怎么设计。还是不知道啊。那就多看时尚杂志,多出去串串门。画出来的图纸别人一起来讨论讨论那就能进入了。 代码里面: java的:Tomcat, structs, hibernate 的源代码学学, php的:CodeIgniter,Drupal, joomla 代码好好阅读一下。 怎么读呢? 边看代码,边画图,类的命名, 方法的命名, 变量的命名, 类里面放了些什么方法。把整个大的风格体系画出来就好了。 不要太关注具体的细节。

就像多看看别人的装修,感受其中的风格。老是关心材料的价格,什么地方买的,回扣是多少。那是以后高级进阶的时候学习的了。

 

一点经验

在没有足够经验,对软件行业了解不深入的情况下。不要太特立独行的设计,风险很大。例如:在大家都在用香皂洗澡的年代,推出沐浴露是一个真得很危险的决策。

全面的平衡一个系统,比局部的优化重要。 例如:装修一个经济适用的房子,在洗手间却用ipad 摄像头成像代替镜子功能。

软件开发其实不能工程化,因为无法定义一个真正的验收标准。只有用户心理才能感受。

OOP设计其实很难,不像装修房子那样可以看得见,摸得着。 先要从心里上接受这种思想。才能向这个方向去思考。就像你首先要有小资的情调,会把心思花在家的装修上。不然随便毛坯贴个砖,刷个墙。功能性上可以住人了,但这是一个温馨的家么?

只有先具有追求做“小资程序员”的心态,才会不断的打磨自己的代码,已达到满足功能性之外的美感。对于只想做“小市民程序员”的心态,是很难接受功能性之外的改进。就像捡矿泉水瓶为生的人,无法理解洗手液、沐浴露,比香皂好在什么地方?

最后OOP真得需要了解哲学, 模型是(道,实),产品是(形,名)程序员是找到形与道的联系和规律, 再用大众认知的语言描述出来。

分享到:
评论

相关推荐

    冒号课堂——编程范式与OOP思想

    本书以课堂对话的形式,借六位师生之口讲述编程...下篇侧重阐发软件设计思想,其中在范式上以 OOP 为主,在语言上以 C++、Java 和 C#为主。全书寓庄于谐,深入浅出,既可开阔眼界,又能引发思考,值得编程爱好者品读。

    冒号课堂:编程范式与OOP思想

    《冒号课堂》以课堂对话的形式,借六位师生之口讲述...下篇侧重阐发软件设计思想,其中在范式上以OOP为主,在语言上以C++、Java和C#为主。全书寓庄于谐,深入浅出,既可开阔眼界,又能引发思考,值得编程爱好者品读。

    JAVA面向对象编程(孙卫琴)03.pdf

    读过的读者都知道,孙卫琴老师的书中,内容都是自己深刻思考过,并通过通俗易懂的语言表述出来,最大限度的易懂,易学,这是一本适合新手入门,掌握良好java开发习惯,开发思想的好书,希望大家多多从简单的示例中...

    C++游戏编程快速入门视频教程 高清不加密

    第1部分 入门 第1章 学习开发游戏的基础知识 1.1 认识视频游戏 1.1.1 为什么人们如此沉迷于开发视频游戏 1.1.2 视频游戏的类型 1.2 学习游戏设计的要素 1.2.1 提出基本思想 1.2.2 整理剧情 1.2.3 可视...

    java编程思想

    第1章 对象入门 “为什么面向对象的编程会在软件开发领域造成如此震憾的影响?” 面向对象编程(OOP)具有多方面的吸引力。对管理人员,它实现了更快和更廉价的开发与维护过程。对分析与设计人员,建模处理变得...

    数据结构与算法分析java语言描述

    本书在编写过程中特别考虑到了面向对象程序设计(OOP)的思想与Java语言的特性。它不是从基于另一种程序设计语言的数据结构教材简单地“改编”而来的,因此在数据结构的实现上更加“地道”地运用了Java语言,并且...

    数据结构与算法分析 java语言描述(原书第3版)

    本书在编写过程中特别考虑到了面向对象程序设计(OOP)的思想与Java语言的特性。它不是从基于另一种程序设计语言的数据结构教材简单地“改编”而来的,因此在数据结构的实现上更加“地道”地运用了Java语言,并且...

    数据结构与算法分析Java语言描述(原书第3版)精装修订版

    本书在编写过程中特别考虑到了面向对象程序设计(OOP)的思想与Java语言的特性。它不是从基于另一种程序设计语言的数据结构教材简单地“改编”而来的,因此在数据结构的实现上更加“地道”地运用了Java语言,并且...

    Think Python

    Think Python 中所涉及的问题在深度上要更胜一筹,具有一定的难度,能让人静下心来真正思考问题的解决方案,而且书中的不少章节所解决的问题也具有实用性,例如 Case study: data structure selection 这一章中就...

    JAVA基础课程讲义

    面向对象思想初步(OOP初步Object Oriented Programming) 53 面向对象编程的语言的三大特征简介 56 对象和类的概念 56 类和对象初步 57 测试类的定义方式 57 简单的学生类编写示例 58 内存分析 59 属性(field,或者...

    asp.net知识库

    DbHelperV2 - Teddy的通用数据库访问组件设计和思考 也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典...

Global site tag (gtag.js) - Google Analytics