作者:手机用户2502885897 | 来源:互联网 | 2024-12-22 19:50
编写了几个500行左右代码的程序,但基本上解决问题还是面向过程的思维,如何从问题中抽象出类,形成类的划分和设计,从而用面向对象的思维解决问题?有这方面的入门好书吗?最好是结合几个具体的案例分析的
编写了几个500行左右代码的程序,但基本上解决问题还是面向过程的思维,
如何从问题中抽象出类,形成类的划分和设计,从而用面向对象的思维解决问题?
有这方面的入门好书吗?最好是结合几个具体的案例分析的。或者要怎么练习?
59 个解决方案
面向对象思想很重要,不是按过程考虑问题,而是大多数都是对象。
面向对象只是一种编程思想。
再抽象的编程语言,最后不都变成汇编代码了吗?我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。
意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。
试对比
图书馆(对图书的分类够结构化了吧)
和
搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。
所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。
结构越复杂,越难修改,越难除错。
有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。
程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George
前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题;他觉得前同事们应该用这些问题来问自己;实际上不管在哪里工作的开发者们都应该经常问问自己这些问题:
◆“要保证这个问题不会再出现,我该怎么做?”
◆“要想少出些Bug,我该怎么做?”
◆“要保证Bug容易被修复,我该怎么做?”
◆“要保持对变化的快速响应,我该怎么做?”
◆“要保证我的软件的运行速度,我该怎么做?”
如果大多数团队都能不时问一下自己,必定会从中得益,因为这些都是真正强而有力的问题。
https://book.douban.com/subject/1052241/
先自己练习写写GUI,里面的各个控件都是一个对象,对熟悉面向对象会有帮助
推荐《设计模式》,了解面向对象设计常见动机,意图,目的,以及优缺点和已知应用。
想强化面向对象设计能力,却不懂设计模式,无法与他人交流。
而了解反模式的前提条件是了解设计模式。(大家可以由此推测出一些东西了,不是么?)
选择是自由的,不要附加上其它不相关的东西。
inside the C++ object
effictive C++
先看后面那本,再看前面那本
关键是要有需求,没需求你当然很难想
假如我做个计算器,这个就是需求,也是对象对吧;
首先我得能输入值吧,那么创建变量,比如2个,应付一般的没问题了吧;
还得有个接受值的地方/方法吧,这不是就是输入值的函数,称之为函数1,
然后我总得能加法吧,那么函数2就是将输入的两个值相加,然后给一个返回值;
那么也许我需要把这个返回值显示出来吧,那么函数3,用于显示返回值,顺便,可以再创建一个变量,用于储存这个返回值,于是,函数2也不要给返回值了,调用函数3就行了;
然后我得能减法吧,函数4,接受输入的两个值,减法计算,执行完后调用函数3显示;
我得能乘法吧,能除法吧,那么函数5,6也有了对吧;
我总得能判断究竟执行的是加法还是减法还是乘法还是除法吧,函数7,用于读取用户的选择,到底是哪种,然后调用对应的函数2,4,5,6;
于是,这不就是一个类,有3个变量7个方法,这个类也是一个对象对不对。
我假如需要加法,那么执行函数7,然后通过变量1和2读取输入,再根据条件,调用对应的函数2,函数2执行最后,调用函数3输出结果,这不就ok了?
没需求你自己空想,那是耍流氓
我推荐《设计模式》,这本书还是可以让我们快速的知道如果把一些常见的需求解耦,日常项目中当然也会有很多地方不用到设计模式,但是其思想和处理手段还是值得学习的。
我个人觉得,面向对象最大的好处就在于解耦, 如何把不同的逻辑解耦,使得操作更方便,使用更灵活,扩展性更强。
就是现在很多主流框架做的事情。
莫非想要的是面向对象分析与设计,入门级的?
《深入浅出面向对象分析与设计》(Head First Object Oriented Analysis and Design)
head first特色,呵呵。
听你描述应该是刚入门,现在看设计模式恐怕会很痛苦,虽然实践是最好的老师,但必要的基础还是要有。有很多人都喜欢拿着各种模式下意识的去套,这样很累也不一定真的适用,不过学习了解一下前辈的经验总是好的,我建议你可以了解一下设计模式,看不懂就算了,以后实战多了,自然会有自己的理解,在这个过程中,你就能或多或少体会到什么叫面向对象的设计。
一个Java设计模式的笑话
大意说,有个人要钉个钉子挂画框,于是去工具店买个锤子。店主说,No,我们已经不卖锤子了。锤子有很多种,大锤、拔钉锤、圆头锤等等,如果你买了一个,之后又发现你还需要另一个怎么办?多数人只想要一把锤子,所以我们推出了万能锤,可以当各种锤子使用。买者想想也是,那就买一把万能锤吧。店主说,No,万能锤已经被淘汰了。你想,万能锤虽然可以当各种锤子用,但它做什么活都没有专门用途的锤子好使。所以,我们开始卖锤子工厂,这样你可以随时制造最合适的锤子。买者说,但我并不想买个工厂……店主说,没错,所以它已经被淘汰了。我们研究发现,不是所有的用户都需要生产所有类型的锤子,所以我们开始卖锤子工厂设计图,这样用户可以根据自己的需要定制工厂。买者说,我猜这个也淘汰了吧?店主说,没错,我们研究发现,用户并不想自己建造一个工厂。于是我们推出了建造锤子工厂的工厂,来帮助用户建造锤子工厂……
看再多的书都是没有用的,简单跟你说下吧,靠的是你的想象力还有对这个程序的理解力,缺一不可。c和c++简单的打个比方的区别就是把拆分完的动作再一一的组装成一个模块。另外设计的时候注意 高内聚 低耦合
把你的代码和变量变量全部写到不同的类里面,久而久之你就习惯了用类对象来思考
过早的优化是万恶之源!
记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”
做个可能不太恰当的比喻:
人想让狗帮忙逮只兔子,可是人说话狗听不懂,于是人发明了一种介乎人言和狗语之间的语言,即口令。
人想让电脑帮忙做计算,可是人话电脑听不懂,于是人发明了一种介乎人言和汇编机器码之间的语言,即C语言。
人对狗的口令得让人容易学、也得让狗容易懂。
C语言同样得让人容易学、也得让电脑容易懂。
相比之下C++、Java就是人学得费劲、电脑也经常闹不懂。
类的划分实际上是有一些规律的,书上说需求总结里所有的名词可能作为类的候选,所有的动词可能是某个类的方法,然后再迭代。没有一定的实践经验,未必能想出合适的。
对不对用户说了算。设计的很多时间是在沟通和试错(理想情况下),所以工程界发明了不少试图降低成本的方法论。
说白了,所谓的《面向对象》,最终目的是用现实世界的思维方式,解决程序世界中的问题。