经常有人问什么是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 为主,在语言上以 C++、Java 和 C#为主。全书寓庄于谐,深入浅出,既可开阔眼界,又能引发思考,值得编程爱好者品读。
《冒号课堂》以课堂对话的形式,借六位师生之口讲述...下篇侧重阐发软件设计思想,其中在范式上以OOP为主,在语言上以C++、Java和C#为主。全书寓庄于谐,深入浅出,既可开阔眼界,又能引发思考,值得编程爱好者品读。
内容概要:该PDF包含了一系列关于Python基础知识的学习笔记整理与总结,涵盖了Python核心概念及其应用,包括数据类型详解、控制结构的运用、模块的使用技巧,OOP思想的理解等方面的内容,并且深入剖析各类主题之间的...
2. **面向对象编程(OOP)**:类是面向对象编程的核心,它是一个自定义的数据类型,可以包含数据(属性)和行为(方法)。在这个阶段,孩子们将学习如何定义类、实例化对象,并了解类与对象之间的关系,如继承和多态...
除了上述主要内容之外,《软件工程思想》还包含了一个有趣的附录——“大学十年”,这部分内容更像是作者个人经历的分享,既是对过去时光的回顾,也是对未来职业发展的思考。这种独特的编排方式不仅增加了书籍的...
在非C程序员转向C++语言学习的过程中,首先要理解面向对象编程(Object-Oriented Programming,简称OOP)的基本概念。面向对象编程是一种编程范式,它使用“对象”来设计软件。对象可以包含数据,以字段(通常称为...
编程不仅是技术活,更是思考的艺术。编程过程中,思路比代码更重要。良好的编程习惯、对英语的掌握以及持续实践是快速入门的关键。通过看教程、读程序、验证代码,不断进行项目实践,才能提升编程技能。 在Web应用...
这本书深入浅出地介绍了面向对象编程(OOP)的概念和设计原则,是许多程序员入门和进阶的必备读物。在第四版中,作者不仅更新了原有的内容,还引入了更多现代编程语言的例子,如Java、C#和Python,以帮助读者更好地...
### 易语言入门学习知识点详解 #### 一、易语言简介 易语言是一种基于汉语的编程语言,旨在降低编程门槛,使更多的人能够理解和使用。它由“易语言.飞扬”系统为代表,提供了面向对象的编程支持。面向对象编程(OOP)...
1. 面向对象(Object-Oriented Programming,OOP):面向对象编程是一种编程范式,它基于“对象”而非“过程”进行思考。在Java中,一切皆为对象,这使得程序设计更加灵活且易于理解和维护。 2. 封装:封装是面向...
面向对象编程(Object Oriented Programming,OOP)是本书的一个核心概念,它强调通过“对象”来思考程序设计,使得程序能够更好地模拟现实世界中的事物和行为。C++支持封装、继承和多态等OOP核心概念,这些概念是...
C++编程思想:这一标签强调了本书对OOP思想的阐述。在C++中,OOP是通过类、对象、继承、封装和多态等机制实现的。Eckel在书中不仅解释了这些概念,还展示了如何将它们应用到实际编程问题中,帮助读者建立强大的设计...
第1章 对象入门 “为什么面向对象的编程会在软件开发领域造成如此震憾的影响?” 面向对象编程(OOP)具有多方面的吸引力。对管理人员,它实现了更快和更廉价的开发与维护过程。对分析与设计人员,建模处理变得...
本书不仅是一本面向初学者的编程入门书籍,更是一部引导读者理解计算机科学核心思想的作品。 #### 二、Python编程简介 Python是一种高级编程语言,以其简洁易读的语法而著称,被广泛应用于Web开发、数据分析、人工...