我如何练习更好的面向对象编程?

我已经用面向对象的语言进行了多年的编程,但是我暗中看到了一些我的同事用羡慕的方式来做的事情。 他们中的很多人似乎有一些内在的OO本能,我不知道 – 不pipe我多么努力。 我已经阅读了所有关于面向对象的好书,但仍然无法破解它。 我觉得那个让110%成为一名职业足球运动员的人只是没有天赋而已。 我不知所措,想换个职业 – 我该怎么办?

我会说更less关注面向对象编程,更多地关注面向对象的devise 。 拿一张纸和一支铅笔(或者一个UMLbuild模工具),远离屏幕。

通过练习如何devise一个系统,您将开始获得对象关系的自然感觉。 代码只是devise的副产品。 绘制图表,并以纯粹的非代码formsbuild模您的应用程序。 什么是关系? 你的模型如何相互作用? 甚至不要考虑代码。

一旦你花了一些时间devise…然后把它翻译成代码。 您会惊讶于从一个好的面向对象devise中可以写出代码的速度有多快。

经过大量的devise实践之后,您将开始看到可以被模块化或抽象化的公共区域,并且您会看到devise和代码都有所改进。

最简单的方法是学习SOLID,DRY,FIT,DDD,TDD,MVC等概念。当你查阅这些缩略词时,它会把你带到许多其他的兔子洞,一旦你完成了你的阅读,你应该有一个很好的理解什么是更好的面向对象编程!

固体播客: http : //www.hanselminutes.com/default.aspx? showID=168, http : //www.hanselminutes.com/default.aspx? showID=163

固体细分: http : //butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

干: http : //en.wikipedia.org/wiki/Don%27t_repeat_yourself

FIT: http : //www.netwellness.org/question.cfm/38221.htm

DDD: http : //dddcommunity.org/

DDD需要阅读: http : //www.infoq.com/minibooks/domain-driven-design-quickly

TDD: http : //en.wikipedia.org/wiki/Test-driven_development

MVC: http : //en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

是的,卷起袖子和编码总是一个好主意。 尽你所能地做一个小项目。 然后阅读上面的文章。 然后重构你的代码,以满足你刚刚阅读的需求。 重复,直到你已经重构了你的代码。 最后,你不仅要知道面向对象是什么,而且应该能够解释为什么它是重要的,以及如何第一次得到它们。 学习如何重构也是良好代码的关键。 现在的情况是明天不对。

我的build议是学习不同的东西。

学习函数式编程,并将您从中学到的东西应用于OOP。 如果您了解C ++,请使用generics编程。

学习非面向对象的语言。

不仅仅是因为你应该使用所有这些东西(你应该),还是因为他们应该完全取代OOP(他们可能不应该),但是因为你也可以从OOP中吸取教训。

面向对象的秘密在于,使用它并不总是有意义的 。 不是所有的都是一个class级。 不是每一个关系或行为都应该被模仿成一个class级。

盲目地尝试应用OOP,或者努力编写最好的OOP代码,往往会导致巨大的过度工程混乱,抽象程度和间接性太高,而且灵活性很低。

不要试图编写好的OOP代码。 尝试编写好的代码。 当它为这个目标做贡献时使用OOP。

在很多领域都有一个“尤里卡”的时刻,一切都融合在一起。

我记得在高中几何时感到沮丧。 我不知道哪个定理适用于certificate的每一步。 但我坚持下去。 我详细地学习了每个定理,并研究了它们在不同的示例certificate中的应用。 因为我不仅理解每个定理的定义,而且理解如何使用它,所以我build立了一个我熟悉的技术的“工具箱”,可以根据需要抽出来。

我觉得编程是一样的。 这就是对algorithm,数据结构和devise模式进行研究和分析的原因。 阅读一本书并获得技术的抽象定义是不够的。 你也必须看到它的行动。

所以请尝试阅读更多的代码 ,除了练习自己写。 这是一个开源的美丽,你可以下载大量的代码来学习。 不是所有的代码都是好的,但是研究不好的代码可以像学习好的代码一样教育。

太多人首先想到编码,最后是对象。

你可以阅读所有你想要的书,但是这不会教你如何以面向对象的方式进行思考 – 这需要练习和一定的方法。

  1. 以下是一些帮助我的方法:当你离开工作和思想开放的时候,你可以通过把所有东西视为一个对象练习 。 不要看这些对象,不知道你将如何编程,只将它们看作属性和函数,以及它们如何相互关联或inheritance。 例如,当你看到一个人,他们是一个对象,因此将代表一个类。 它们具有头发的颜色,肤色,身高等属性,也具有一定的function。 他们走路,说话,睡觉等,这些人做的一些function返回结果。 例如,他们的工作function返回一美元的金额。 你可以用你看到的一切来做到这一点,因为一切都是一个对象。 自行车,汽车,明星等

  2. 编码项目之前,使用便笺和干擦板进行devise。 这将是一个很好的练习,直到你掌握了这个。 想想你的具体对象/function/财产。 每个项目都有自己的便条。 把它们放在干擦板上。 在这方面,函数/属性将被放置在对象下。 如果你有另外一个物体,那么做同样的事情。 然后问自己,做任何这些笔记(对象/function/属性)相互关联。 如果两个对象使用相同的函数,则创build一个父对象(便条纸),并将其放在新注释下的可重用函数的上方。 使用从两个子对象到父级的干擦标记画一条线。

  3. 当这一切都完成了,然后担心class级内部的工作。

学习一种不同的语言! 大多数仅使用Java的开发人员(仅作为示例)对OO的理解有限,因为他们无法区分语言function和概念。 如果你还不知道,请看看python。 如果你知道Python,学习Ruby。 或者select一种function语言。

aswer在你的问题;)

练习,练习,练习。

审查你自己的代码,并从错误中学习。

TDD帮助我提高了包括面向对象在内的整体技能。

您编写的代码越多,您就越会注意到某些编程实践的缺陷。 经过足够的时间和足够的代码,您将能够识别这些陷阱的警告标志,并能够避免它们。 有时当我编写代码时,我会后悔的告诉我可能有一个更好的方法来做到这一点,即使它做我所需要的。 我最大的编程缺点之一就是“过度分析”事物,以至于开始大大减慢开发时间。 我试图通过在devise上花费更多时间来防止这些“痒”,这通常会导致编写代码的时间减less很多。

我偷偷地看着同事们羡慕的一些事情。 他们中的很多人似乎有一些内在的OO本能,我没有 – 不pipe我多努力尝试…

我想你在这里回答了你自己的问题。 阅读好的代码是一个好的开始,理解好的代码甚至更好,但理解到达好代码的步骤是最好的。 当你看到一些你所羡慕的代码时,也许你可以问作者他是如何得到这个解决scheme的。 这完全取决于你的工作环境以及与同事的关系。 无论如何,如果有人问我写任何代码背后的思维过程,我毫不犹豫地告诉他们,因为我知道我会希望他们也为我做同样的事情。

语言devise者以不同的方式解释了“面向对象编程”。 例如,看看首先使用OOP这个术语的Alan Kay如何定义它:

OOP对我来说意味着只有消息传递,本地保留和保护以及对状态过程的隐藏,以及对所有事物的极端约束。 它可以在Smalltalk和LISP中完成。 有可能的其他系统,但我不知道他们。

(从http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en引用)。;

他不认为Java和C ++ OOP语言似乎很奇怪! 但作为第一个也是最好的OOP语言之一(Smalltalk)的devise者,他有自己的正当理由。 Alan Kay为什么认为Lisp是一种面向对象的语言而不是Java? 任何声称了解面向对象的人都需要认真考虑这个问题。

Erlang有一个完全不同的OOP实现, Scheme有另外一个。 值得考虑所有这些替代的观点。 如果可能,学习所有这些语言! 这会给你更广阔的视野,把一些新的强大的工具,让你成为一个更好的程序员。

我总结了我的实验, 在本文中基于从Smalltalk,Scheme和Erlang借鉴的想法来实现OOP语言。

如果您不知道如何devise面向对象的系统,请从数据开始。 找出需要跟踪的东西以及自然而然的信息(例如,汽车组模型的所有规格都很好)。

你决定跟踪的这些东西中的每一个都是一个类。

然后,当您需要执行某些特定的操作(例如,将汽车模型标记为已停用)或询问特定问题(例如,询问特定年份中某车型的销售数量)时,这个function到了它最相互作用的类上。

总的来说,在你的class级结构中,应该总是有一个相当自然的地方让一段代码。 如果没有,那就表明有一个地方需要build造结构。

有太多关于物体的信息。 最重要的是掌握基本知识,一切都更容易。

这是一种思考物体的方法。 考虑过程语言中的数据结构。 他们是一群没有行为的领域。 考虑接收指向这些数据结构的指针的函数,并操作后者。 现在,不是将它们分开,而是定义结构定义内的函数,并假定这些函数通常会接收一个指向数据结构的指针来操作。 这个指针叫做这个。 总之,将对象视为状态(数据)和行为(方法 – OOP中函数的奇特名称)的组合。

这是绝对的基本。 你必须绝对掌握三个概念:

inheritance – 这是关于代码重用的一切。

封装 – 这是关于从接口隐藏实现。 简而言之,除非事实certificate,否则所有内容都应该是私密的。

多态性 – 引用variables的types并不重要,但实际实例的types知道调用哪个行为(方法)。 Java并不容易让这个概念非常明显,因为根据定义,所有东西都是多态的。 当你决定什么是多态的,什么不是多的时候,.Net会让你更容易理解,因此注意到行为的不同。 这是通过虚拟和覆盖的组合来实现的。

如果这些概念很好理解,你会没事的。

最后一个提示:你提到最好的书。 你读过Bruce Eckel的“ Thinking in Java ”吗? 我把这本书推荐给那些刚刚开始使用.Net的人,因为OOP的概念是清晰的。

public void MasteryOfOOP() { while(true) /* My suggestion is: */ DO: find a lot of well-written object oriented code and read it. Then try to use the insights from it on your own coding. Then do it again. Then have a colleague who is a good OOP look at it and comment. Maybe post a chunk of your code on SO and ask for how it could be improved. Then read some more of those books. Maybe they make a little more sense now...? Now go back to the top of this post, and do it again. Repeat Forever. } } 

变得更敏捷,学习junittesting和研究域驱动devise。 我build议本书“ 领域驱动devise:解决软件中心的复杂性”,虽然在某些方面有些困难。

OOP技能随着时间的推移而来。 阅读1,2 … 10本书不会削减它。 练习写一些代码。 如果您正在编程环境中工作,那可能会有所帮助。 如果不尝试进入一个。 提供免费开发一些应用程序。 你必须弄脏你的手。 请记住,没有任何应用是完美的,这就是为什么要重新考虑因素。

另外…不要被OOP带走太多…随着时间的推移。 担心开发function完备的应用程序。

在Self中尝试一些编程,这是最纯粹的OO语言之一。 事实上,它甚至没有类,只有对象。 它也没有variables,字段,静态,属性,只有方法。 同样有趣的是,系统中的每个对象也是屏幕上的一个对象,反之亦然。

关于Self的一些有趣的论文是基于原型的应用程序构build,使用SELF 4.0 (自学), Self:简单的力量组织程序没有类 。 另外,“ 自我:video”(Randall B. Smith,Dave Ungar)非常出色,有两位语言的devise师解释了自我的想法。

这几乎适用于任何概念,实际上,至less对我来说是这样:find最能体现你想学习的概念的语言,然后使用它。

我也认为面向对象的技能主要是通过练习来加强。 考虑改变你的公司,如果你已经在那里超过3年。 当然,这对所有的工作都是无效的,但是一个人经常习惯公司的项目和实践,并且随着时间的推移而停止前进。

卷起你的袖子和代码!

你自己说出了答案:练习。 最好的解决scheme是开发一款游戏。 使用你在书中学到的概念。

计划一下。 问问自己如何让自己的物体与对方相互联系,寻求事物如何改变和模块化。

以这样的方式编码,如果你想改变1个代码,你只需要改变1个代码而不是50个实例。

您是否阅读过Scott Meyers“Effective C ++”第一版的面向对象的章节? 它没有到后来的版本,但这是一个很好的解释。 标题基本上是“说出你的意思,就是说你所说的”。

其实,你可能想看看我对这个类似问题的回答。

HTH

干杯,

面向对象不是你可以通过读成千上万的书籍来掌握的东西。 而是你必须感受到内在的概念。 阅读任何东西,但尝试去感受你读的东西。 在你的脑海中build立一个概念,当你遇到一个新的场景时,试着去匹配这些概念。 在探索新事物时validation并更新您的概念。

祝你好运!

在我试图编写一个处理交易,计算利息和跟踪这一切的类似银行的程序之后,OO终于点击了我。 我是在学习Java的时候做的。 我build议你试试,完成它,然后当你完成了,看看一个好的解决scheme,看看你可以做得更好。

啤酒帮助。 认真。 躺在沙发上,用A3大小的涂鸦笔,一支笔和一杯啤酒。 锁在外面的狗,猫和老婆。 一边放松一边思考问题。 甚至不敢在上面画一个API!

stream程图,责任卡(CRC)和啤酒(但不是太多)走了很长的路要走。

重构代码的最简单的方法是不必首先。

http://misko.hevery.com/code-reviewers-guide/

这些简单的规则将使你成为一个更好的面向对象的程序员。 在你的代码中遵循规则,你会发现你的代码比其他代码更好。

你也想学习固体原理: http : //butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

尽pipe这些原理和编程方式引起争议,但它们是真正编写出色代码的唯一方法。

你可能已经这样编写代码,而不知道它 – 如果是这样,很好。 但是,如果你需要一个奋斗的目标,这是金标准。

放弃! 为什么你需要那个OOP? 只需写一些可用的应用程序 不使用面向对象,程序或function方法metter。

你selectPython语言的方法应该是可以修改的。

你是我的目标受众。 在OOdevise中看build筑技能

也许这可以帮助。