我最近阅读了一篇关于OOP相关question的有趣评论,其中一位用户反对创建“经理”课程:
请删除管理员一词 谈话时从你的词汇 关于班级名称。的名字 上课应描述其' 目的。经理只是另一个词 用于倾倒场地。任何 功能适合那里。这个单词 一直是许多极端事业 糟糕的设计
此评论体现了我成为一名优秀的面向对象开发人员的努力。我一直在一个只有程序编码人员的组织里做过程序代码。看起来我们生成的相对较少的OO代码背后的主要策略是将问题分解为容易可识别为离散单元的类,然后将左侧/广义位放在“Manager”中类。
如何打破我的程序习惯(比如Manager类)?大多数OO文章/书籍等使用本质上易于转换为对象组的问题的示例(例如,Vehicle - > Car),因此没有为分解更复杂的系统提供太多指导。
答案 0 :(得分:15)
首先,我会停止表现得像程序代码是错误的。这是一些适合某些工作的工具。 OO也是一些工作的正确工具。功能也是如此。每个范例只是计算的不同观点,并且存在是因为它对某些问题很方便,而不是因为它是唯一正确的编程方式。原则上,所有三个范例在数学上都是等价的,因此请使用最佳映射到问题域的任何一个。恕我直言,如果使用多范式语言,如果不同的世界观最好地模拟不同的子问题,甚至可以在模块中混合范例。
其次,我会阅读设计模式。没有一些现实世界问题的例子很难理解OO它有利于解决。 Head First Design Patterns是一个很好的阅读,因为它回答了很多OO的“原因”。
答案 1 :(得分:9)
擅长OO需要多年的实践和学习优秀的OO代码,理想情况下是导师。请记住,OO只是达到目的的一种手段。话虽如此,这里有一些适用于我的一般指导原则:
答案 2 :(得分:8)
single responsibility principle帮助我将对象分解为有意义的可管理类。
每个对象应该做一件事,并且做得好,而不会在内部对其他需要使用它的对象进行公开。
答案 3 :(得分:7)
'经理'课程通常会:
作为一种解药或对比,面向对象的设计会鼓励你设计类API,你可以“告诉不要问”类本身自己做事(以及封装自己的状态):更多关于“告诉别问”看例如here和here(也许其他人对“告诉不要问”有更好的解释,但这些是Google为我找到的前两篇文章)。
似乎我们生成的小OO代码的主要策略是将问题分解为易于识别为离散单元的类,然后将左侧/广义位放在“Manager”类中。
即使在最好的时候也许如此。 Coplien在他的高级C ++:编程风格和成语书的结尾处谈到了这一点:他说在一个系统中,你倾向于:
以飞机为例(我很抱歉给你另一个车辆示例;我正在解释他):
例如,“向右转”交易包括:
所以我认为你的交易是真实的,它可以跨越或使用各种相对被动的“对象”;例如,在应用程序中,“whatever”用户命令最终将由每个层(例如UI,中间层和DB层)实现(并因此调用)各种对象。
所以我认为在某种程度上你将留下'比特'是真的;但这是一个程度问题:也许你应该希望尽可能多的代码是自包含的,封装的,以及所有内容......以及剩下的部分,使用(或依赖)其他所有东西,应该给予/使用尽可能隐藏的API,尽可能多地使用,并因此尽可能地承担尽可能多的责任(实施细节)所谓的经理。
不幸的是,我只在一本书中读到了这个概念( Advanced C ++ ),并且无法将你链接到网上,以获得比我的这个解释更清晰的解释。
答案 4 :(得分:6)
阅读然后练习OO原则对我有用。 Head First Object-Oriented Analysis & Design通过示例为您提供OO解决方案,然后提供更好的解决方案。
答案 5 :(得分:5)
通过研究design patterns,您可以学习良好的面向对象设计原则。 Code Complete 2是一本关于这个主题的好书。当然,将良好的编程原则融入到您的脑海中的最佳方法是通过将它们应用于您自己的编码项目来不断地实践它们。
答案 6 :(得分:4)
如何打破我的程序习惯(比如Manager类)?
为管理器管理的内容创建一个类(例如,如果您有ConnectionManager类,请为Connection创建一个类)。将所有内容都移到该课程中。
“经理”在OOP中名不大的原因是OOP的核心思想之一是对象应该自行管理。
不要害怕上小班。从程序背景来看,你可能认为做一个课不值得,除非它是一千行代码而且是一些您域中的核心概念。想得更小。十行课程完全有效。在你看到它们有意义的小课程(一个日期,一个邮件地址),然后通过组合这些课程来提升你的工作。
当你开始将代码库的一小部分分成类时,剩下的程序代码汤会缩小。在那个缩小的池中,你将开始看到其他可以成为课程的东西。继续直到游泳池为空。
答案 7 :(得分:3)
更换灯泡需要多少OOP程序员?
没有,灯泡会自行改变。
)
答案 8 :(得分:3)
您可以使用具有非常糟糕的程序支持的OO语言,如Smalltalk。消息发送范例将迫使你进入面向对象的思考。
答案 9 :(得分:1)
我认为你应该以一个好的计划开始。 使用CLASS图计划将是一个良好的开端。
您应该确定申请中所需的ENTITIES, 然后定义每个权利的ATTRIBUTES和METHODS。 如果有重复的,您现在可以重新定义您的实体 以一种可以完成继承的方式,以避免冗余。 :d
答案 10 :(得分:1)
我理解面向对象设计的时刻是我阅读Eric Evans的书"Domain-Driven Design: Tackling Complexity in the Heart of Software"。或者"Domain Driven Design Quickly"迷你书(如果您便宜或不耐烦,可以在线免费获得PDF)。 :)
每当你有一个“经理”类或任何静态单例实例时,你可能正在构建一个程序设计。
答案 11 :(得分:1)
我有一个三步过程,这是我自己成功完成的过程。后来我遇到了一位前教师转为程序员(现在非常有经验),他向我解释了为什么这种方法运作得很好,有一些心理参与,但它基本上都是关于在你学习的同时保持控制和自信。这是:
了解测试驱动开发(TDD)是什么。您可以使用过程代码轻松完成此操作,因此如果您不想这样做,则无需开始使用对象。第二步取决于此。
获取Martin Fowler的Refactoring:改进现有代码设计的副本。它本质上是一个可以对现有代码进行少量更改的目录。但是,如果没有测试,你无法正确地重构。这允许你做的是弄乱代码而不用担心一切都会破坏。测试和重构消除了偏执狂,并感觉到你不知道会发生什么,这是令人难以置信的解放。你离开了基本上玩。随着你开始探索模拟以测试对象之间的交互,你会越来越自信。
现在,大多数人错误地开始,这是很好的东西,但它应该真的排在第三位。在这一点上,您可以阅读有关设计模式,代码气味(对Google来说是一个好的)和面向对象的设计原则。还要了解用户故事或用例,因为这些在编写新应用程序时为您提供了良好的初始候选课程,这是“我从哪里开始?”的一个很好的解决方案。编写应用程序时出现问题。
就是这样!证明了善良!让我知道它是怎么回事。