我怎样才能练习更好的面向对象编程?

时间:2009-08-19 18:00:28

标签: oop

我已经使用面向对象的语言编程多年了,但我偷偷地看了一些同事们羡慕的事情。他们中的很多人似乎都有一些内心的OO本能,我没有 - 无论我怎么努力。我已经阅读了所有关于面向对象的好书,但似乎仍然无法破解它。我觉得那个让110%成为职业足球运动员但却没有天赋才能成功的球员。我不知所措,想要转换职业 - 我该怎么办?

27 个答案:

答案 0 :(得分:112)

我会说更少关注OO编程,更多地关注OO 设计。拿一张纸和一支铅笔(或者可能是一个UML建模工具),然后离开屏幕。

通过练习如何设计系统,您将开始对对象关系有一种自然的感觉。代码只是设计的副产品。绘制图表并以纯粹的非代码形式为您的应用程序建模。有什么关系?你的模型如何互动?甚至不要考虑代码。

一旦你花时间设计......然后将其翻译成代码。您会惊讶于从优秀的OO设计中编写代码的速度有多快。

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

答案 1 :(得分:36)

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

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

SOLID细分: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

是的,卷起袖子和编码总是一个好主意。尽可能利用当前的能力制作一个小项目。然后阅读上面的一篇文章。然后重构代码以满足您刚刚阅读的内容的需求。重复,直到你重构了你的代码。最后你不仅应该知道OO是什么,而且你应该能够解释它为什么重要以及如何第一次获得它们。学习如何重构也是良好代码的关键。现在的情况明天不对。

答案 2 :(得分:16)

太多人认为首先是编码,对象是最后的。

你可以阅读你想要的所有书籍,但这不会教会你如何以面向对象的方式思考 - 这需要练习和某种方法。

  1. 以下是一些方法 帮助我:当你离开时 工作和思想开放,你可以 通过将所有内容视为对象来实践。别看这些 对象并想知道你将如何前进 对它们进行编程,将其视为 仅属性和功能 他们如何联系或继承每一个 其他。例如,当你看到一个 人,他们是一个对象和 因此代表一个阶级。 他们有头发等属性 颜色,肤色,身高等 做某些功能。他们 一些人走路,说话,睡觉等等 这些人做的功能就是回报 结果。例如,他们的工作 函数返回一个美元金额。 你可以用你的一切做到这一点 看,因为一切都是对象。 自行车,汽车,明星等

  2. 在编写项目之前,请按照设计进行设计 使用便利贴和干擦 董事会。这将是一个很好的做法 直到你掌握了这一点。 想想你的具体情况 对象/功能/特性。每个 那些物品将有自己的 便利贴。将它们放置为 干擦板上的层次结构。在 这方面,功能/属性 将被放置在对象下面。如果 你有另一个对象,也一样 那个。然后问自己,做 任何这些发布便笺 (对象/功能/特性) 相互关联。如果有两个对象 使用相同的功能,创建一个 父对象(便利贴)和放 它高于其他人 新的可重用功能 注意。用线画一条线 来自两个孩子的干擦标记 对象是父母。

  3. 完成所有这些后,请担心 关于班级的内部情况 作品。

答案 3 :(得分:13)

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

学习函数式编程,并将您从中学到的知识应用到OOP中。如果您了解C ++,请使用泛型编程。

学习非面向对象的语言。

不仅因为你应该使用所有这些东西(你应该),或者因为它们应该完全取代OOP(它们可能不应该),但是因为你可以将这些教训应用于OOP也是如此。

OOP的秘诀在于使用并不总是有意义的。并非一切都是一个阶级。并非每个关系或行为都应该被建模为一个类。

盲目地尝试应用OOP,或者努力编写最好的OOP代码往往导致巨大的过度工作混乱,具有太多的抽象和间接水平以及很小的灵活性。

不要尝试编写好的OOP代码。尝试编写好的代码。并在有助于实现这一目标时使用OOP。

答案 4 :(得分:12)

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

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

我认为编程也是如此。这就是研究和分析算法,数据结构和设计模式的原因。阅读一本书并获得技术的抽象定义是不够的。你必须在行动中看到它。

所以尝试阅读更多代码,除了练习自己编写。这是一个开源的美,你可以下载大量的代码来学习。并非所有代码都是好的,但研究不良代码可能与学习优秀代码一样具有教育意义。

答案 5 :(得分:9)

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

答案 6 :(得分:7)

答案在你的问题中;)

练习,练习,练习。

查看自己的代码并从错误中吸取教训。

答案 7 :(得分:5)

TDD帮助我提高了整体技能,包括OOP。

答案 8 :(得分:4)

       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.

        }
    }

答案 9 :(得分:4)

语言设计者以不同的方式解释“面向对象的编程”。例如,看看首次使用OOP一词的Alan Kay如何定义它:

  

OOP对我来说只意味着本地消息   保留,保护和隐藏   国家进程和极端   所有事情的后期约束力。有可能   在Smalltalk和LISP中完成。那里   可能是其他系统   这是可能的,但我不知道   它们。

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

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

Erlang共有different implemntation个OOP,Scheme有另一个。 值得考虑所有这些替代观点。如果可能,学习所有这些语言!这将为您提供更广阔的视野,提供一些新的强大工具,让您成为更好的程序员。

我根据从Smalltalk,Scheme和Erlang in this article借来的想法,总结了实验OOP语言的实验。

答案 10 :(得分:4)

您编写的代码越多,您就会越注意到某些编程实践的缺陷。经过足够的时间和足够的代码,您将能够识别这些陷阱的警告信号并能够避免它们。有时候,当我编写代码时,我会在脑海里发出这样的痒,告诉我可能有更好的方法来做到这一点,即使它做了我需要它。我最大的编程弱点之一就是“过度分析”事情,以至于它开始大大减慢开发时间。我试图通过在设计上花费更多时间来防止这些“痒”,这通常会减少编写代码的时间。

  

......我偷偷地看着同事们羡慕的一些事情。他们中的很多人似乎都有一些我没有的内在本能 - 无论我怎么努力......

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

答案 11 :(得分:3)

如果您对如何设计面向对象的系统感到迷茫,请从数据开始。弄清楚你需要跟踪哪些东西以及哪些信息自然地结合在一起(例如,汽车组模型的所有规格都很好)。

您决定跟踪的这些事情中的每一种都会变成一个类。

然后,当您需要能够执行特定操作(例如,将汽车模型标记为已退役)或询问特定问题时(例如,询问给定年份中出售的汽车数量有多少) ,您将该功能加载到与其交互最多的类上。

一般来说,应该总是有一个非常自然的地方可以让一些代码存在于你的类结构中。如果没有,则表明存在需要构建结构的地方。

答案 12 :(得分:3)

关于对象的信息太多了。最重要的是掌握基础知识,一切都变得更加容易。

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

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

继承 - 这就是代码重用。

封装 - 这是关于从接口隐藏实现的全部内容。简而言之,除非另有证明,否则一切都应该是私密的。

多态性 - 引用变量的类型无关紧要,但要知道调用哪个行为(方法)的实际实例的类型。 Java并不容易让这个概念非常明显,因为根据定义,一切都是多态的。 .Net让您更容易理解,因为您决定什么是多态和什么不是,因此注意到行为的差异。这是通过虚拟和覆盖的组合来实现的。

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

最后一个最后的提示:你提到了最好的书。你有没有读过Bruce Eckel的“ Thinking in Java ”?我甚至向那些刚开始使用.Net的人推荐这本书,因为OOP概念已经明确规定。

答案 13 :(得分:2)

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

另外......不要过多地使用OOP ......随着时间的推移它会有所不同。担心开发功能齐全的应用程序。

答案 14 :(得分:2)

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

关于Self的一些有趣的论文是Prototype-Based Application Construction Using SELF 4.0(自学教程),Self: The Power of SimplicityOrganizing Programs Without Classes。此外,Self: The Video (Randall B. Smith; Dave Ungar)非常棒,有两​​位语言设计师解释了Self的想法。

这几乎适用于任何概念,实际上,至少对我而言:找到最纯粹体现您想要了解的概念并使用它的语言。

答案 15 :(得分:2)

变得更敏捷,学习junit测试并研究域驱动设计。我推荐这本书Domain-Driven Design: Tackling Complexity in the Heart of Software虽然在某些方面有点难度。

答案 16 :(得分:2)

在我尝试编写一个类似银行的程序来处理交易,计算兴趣并跟踪所有内容之后,OO终于点击了我。我在学习Java时做到了。我建议你尝试一下,完成它,然后当你完成后再去看一个好的解决方案,看看你能做得更好。

答案 17 :(得分:2)

我也认为OOP技能主要依靠练习。如果你去过那里超过3年,考虑改变你的公司。当然,这不适用于所有工作,但通常一个人习惯于公司的项目和实践,并随着时间的推移停止前进。

答案 18 :(得分:1)

您是否阅读过第一版Scott Meyers“Effective C ++”一书中有关OO的章节?它不适用于以后的版本,但这是一个很好的解释。标题基本上是“说出你的意思,意味着你所说的”关于合适的惯例。

实际上,您可能希望看到我对here上类似问题的回答。

HTH

欢呼声,

答案 19 :(得分:1)

你自己说答案:练习。对此的最佳解决方案是开发游戏。使用你在书中学到的概念。

答案 20 :(得分:0)

计划好事。问问自己,你希望你的对象如何与彼此联系,并寻找如何改变和模块化的东西。

以这样的方式对事物进行编码:如果您想要更改1段代码,则只需要更改1段代码而不是50段代码。

答案 21 :(得分:0)

通过阅读数以千计的书籍,你不能掌握OOP。相反,你必须感受内在的概念。阅读任何内容,但试着去感受你所读到的内容在您的脑海中构建一个概念,并在面对新场景时尝试匹配这些概念。在探索新事物时验证并更新您的概念。

祝你好运!

答案 22 :(得分:0)

啤酒有帮助。认真。躺在沙发上,配有A3尺寸的涂鸦垫,笔和啤酒。将狗,猫和妻子锁在外面。在放松的同时思考问题。甚至不敢在它上面绘制API!

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

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

答案 23 :(得分:0)

卷起袖子和密码!

答案 24 :(得分:-1)

放弃!你为什么需要那个OOP?只需写一些可用的应用程序没有使用OOP,程序或功能方法。

您选择的多种方法Python语言应该可以实践。

答案 25 :(得分:-1)

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

这些简单的小规则将使您成为更好的OO程序员。在编码时遵循规则,你会发现你的代码比原本更好。

您还需要学习固体原则:http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

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

你可能已经用这种方式编写代码而不知道它 - 如果是这样,很好。但如果你需要一个努力的目标,这些都是黄金标准。

答案 26 :(得分:-2)

你是我的目标受众。看Building Skills in OO Design

也许这会有所帮助。