【问题标题】:How to develop *real life* oop skills?如何发展*现实生活* oop 技能?
【发布时间】:2010-09-21 13:19:30
【问题描述】:

我研究 OOP 已经有一段时间了,我对理论有了很好的掌握。我阅读了 Head First 关于 OOP 的书,虽然它强化了很多理论,但我发现案例研究有些琐碎。

我发现我每天都在将 OOP 原则应用于我的代码,但我不确定我是否正确地应用了这些原则。我需要能够查看我的代码并知道我是否正确使用了继承,我的对象是否足够内聚,等等。

有没有人有任何好的建议(书籍、在线指南、博客、演练等),以帮助您进一步发展扎实的 OOP 技能?

我主要在 .NET (visual basic) 中工作,但我欢迎包含各种平台的建议。

【问题讨论】:

  • 什么语言/平台?这很重要,因为您应该查看示例,如果我们了解您的语言,我们可以指导您使用示例。

标签: oop ooad


【解决方案1】:

阅读 Martin Fowler 的 Refactoring,并将其应用到您自己的工作中。

它将带您了解软件代码的一连串恶臭特征,这些特征描述了如何检测不正确构造的类,更重要的是,如何修复它们。

【讨论】:

    【解决方案2】:

    考虑研究设计模式。尽管它们似乎在企业应用程序中并不常用(我已经看到它们在 API 和框架中比嵌入到企业代码中更常用),但它们可以在很多情况下用于使软件更简单或更健壮,如果只有开发人员知道如何应用它们。

    关键是先了解设计模式,然后通过经验学习如何应用它们。

    有一个Head First book on design patterns 非常简单地教授了这个概念,但如果你想要一本真正详细介绍设计模式的书,请查看Gang of Four design patterns book,它基本上是使设计模式成为主流并且几乎被引用的原因每次提到这个话题。

    设计模式可以在某种程度上应用于几乎任何面向对象的语言中,尽管在某些情况下,有些模式可能是矫枉过正或过度工程化。

    编辑:
    我还想补充一下,你应该看看这本书Code Complete 2。在软件开发领域,这是一本非常有影响力的书。它涵盖了许多不同的概念和理论。每次阅读它,我都会学到一些新东西。这是一本非常好的书,如果我每 6 个月到一年读一次,我会从不同的角度来看待它,只要重新阅读它,我就会成为一个更好的程序员。无论你认为自己知道多少,这本书都会让你意识到你真正知道的有多么少。这真的是一本很棒的书。我无法强调你应该拥有多少本书。

    【讨论】:

      【解决方案3】:

      如果您已经具备基础知识,我相信只有经验才能让您走得更远。你说你不确定你是否正确地应用了这些原则,但没有一种正确的方法。您今天编写的代码,您将在 6 个月后查看,并想知道您为什么要这样写,并且可能知道一种更好、更清洁的方法。我还保证,10 年后,你仍然会学习新的技术和技巧。不用太担心,它会来的,尽可能多地阅读,并尝试将所阅读的内容分小块应用。

      【讨论】:

        【解决方案4】:

        我目前正在阅读以下书籍:

        http://www.amazon.com/Applying-UML-Patterns-Introduction-Object-Oriented/dp/0131489062

        我强烈推荐这本书,因为它可以在深入研究代码之前学习一种真实的、专业级的、实用的方法来起草和应用格式良好的迭代设计策略。

        我也读了“Head First”这本书,觉得读了这本书我感觉好多了。

        在工作了几年后,我现在查看了我推荐的 Craig Larman 书,这本书对我来说是完美的“下一步”。

        关于本书标题中“UML”的存在:

        无论您对 UML 表示法有正面还是负面的感觉,请不要让它影响您购买这本书 (ISBN 0131489062) 的决定。

        标题中突出显示“UML”具有误导性。虽然作者确实使用和解释了 UML 符号,但这些解释非常好地融入了相关的设计讨论,本书读起来绝不会像一个无聊的 UML 规范。

        其实这是直接摘自书中的一段话:

        重要的是知道如何在对象中进行思考和设计,这是一项与了解 UML 符号非常不同且更有价值的技能。在绘制图表时,我们需要回答关键问题:对象的职责是什么?它与谁合作?应该应用哪些设计模式?比了解 UML 1.4 和 2.0 之间的区别更重要!

        这本书有时看起来像是在与首席架构师或项目经理“交谈”。我的意思是,它假定读者对软件项目的规划和方向有很大的控制权。

        尽管如此,即使您只负责公司的一小部分项目和产品,我仍然会推荐这本书,并鼓励您将书中建议的一些“缩小”修改应用到您的项目中.

        【讨论】:

        • 我也喜欢这本书。我同意标题中的“UML”具有误导性。这本书是关于迭代开发和面向对象的分析和设计的。它只是碰巧使用 UML 进行建模——无论如何,我也认为这很重要;太多的开发人员在讨论中不知道如何为抽象概念建模。
        【解决方案5】:

        很久以前,我的 OOP 顿悟来自 Grady Booch 的书。突然我意识到为什么对象是好的。

        虽然多态性很酷,但封装是对象很酷的 75%。它有点像一个界面:你看到的是按钮,但看不到接线。在对象出现之前,只有最自律的编码人员才会让他们肮脏的手指远离其他人程序的内部部分(这被称为“结构化编程”)。

        对象使做正确的事变得容易。继承和多态是一点好处。

        了解对象的一种方法是阅读其他人的代码。通过阅读 Delphi VCL 框架的源代码,我学到了很多东西。即使只是查看 Java 的文档,也可以帮助您了解单个对象类应该做什么以及它是如何设计为供其他对象使用的。

        开始一个你自己的项目,当你想对你自己的类进行子类化并发现你必须返回并分解一些受保护的方法时要注意,这样你就可以只覆盖一个进程而不是全部替换其中。看看祖先如何通过调用抽象函数与后代对话。换句话说,去犯很多错误并从中吸取教训。

        享受吧!

        【讨论】:

          【解决方案6】:

          坦率地说,重读 David Parnas 关于信息隐藏的旧论文有助于我进入正确的心态。案例研究可能不直接适用,但您应该能够从中获得一些有用的概括。

          【讨论】:

            【解决方案7】:

            当我尝试在 VB6 中实现一个非常 OO 的问题(动态和递归地构建 SQL 语句)时,我顿悟了。理解多态性或继承的最好方法是需要它而不能使用它。

            【讨论】:

              【解决方案8】:

              从事一个著名的、受人尊敬的开源项目肯定会对您有所帮助。要么挖掘源代码,看看事情是如何完成的,要么尝试做一些添加/修改。您会发现对于大多数问题没有一种风格或一种正确答案,但是通过查看几个项目,您将能够对如何完成事情有一个广泛的了解。从那里开始,您将开始发展自己的风格,并希望在此过程中为开源做出一些贡献。

              【讨论】:

              • 有什么建议吗?我精通 .NET,但对其他平台和语言持开放态度。
              • Screwturn Wiki 和 BlogEngine .NET 在考虑开源 .NET 应用程序时会浮现在脑海中。如果您有兴趣为 C#.NET 开源项目做出贡献,那么这两个是值得一试的。
              【解决方案9】:

              我认为您必须尝试实施 OO 解决方案并失败。反正我就是这样做的。我所说的失败是指你在成功交付可行的解决方案的同时最终编写了臭代码。写完之后,您会感觉到事情不太对劲。您可能有一些顿悟,和/或您可能会去寻找其他程序员的更巧妙的解决方案。毫无疑问,您会意外地实现标准设计模式的一些变体。事后看来,一盏灯会亮起(哦!这就是访问者的目的),然后理解就会加速。

              正如其他人所说,我认为通过一些好的 OO 开源代码进行工具化是个好主意。与愿意批评您的工作的更有经验的程序员一起工作也是如此。然而,理解来自于实践。

              【讨论】:

              • 好建议。我认为这就是我现在正在经历的——提供可行的解决方案,但我想:“必须有更好的方法来设计这个东西。”
              【解决方案10】:

              您可能想尝试阅读(和编写)一些 Smalltalk 一段时间。 Squeak 是一个免费的实现,它可以向您展示完全面向对象的环境(与 java 或 .net 不同)的强大功能。包括所有库代码源。语言本身非常简单。您会发现,自 1980 年以来,java 和 c# 正在慢慢添加 Smalltalk 众所周知的功能。

              【讨论】:

                【解决方案11】:

                Tortoise HG 是一款设计精美的 OO 开源软件(用 Python 编写)。

                如果您已经了解基础知识,那么使用完全面向对象的语言从头开始构建将是充分理解 OOP 软件架构的好一步。如果您不了解 Python,Python Essential Reference 将在几天到一周内带您完整了解该语言。

                了解语言后,看看上面的软件,你会有各种各样的顿悟。

                【讨论】:

                  【解决方案12】:

                  要彻底理解任何事情,您需要对至少上一层抽象层和下一层抽象层有相当的了解。在 OO 的情况下,其他人提到设计模式是 OO 之上的层。这有助于说明为什么 OO 是有用的。

                  至于 OO 之下的层,尝试使用高阶函数/后期绑定一段时间,感受一下这些相对简单的构造是如何使用的。此外,尝试了解 OO 是如何在底层实现的(vtables 等)以及如何在纯 C 中完成它。一旦你理解了使用高阶函数和后期绑定的价值,你很快就会意识到 OO 是只是一种方便的语法,用于传递一组相关的函数和它们所操作的数据。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-03-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多