8

我的问题很简单;是否可以过度面向对象您的代码?

多少是太多了?你在什么时候为了 OO 而放弃可读性和可维护性?

我是一个巨大的 OO 人,但有时我想知道我的代码是否过于复杂......

想法?

4

17 回答 17

28

是否可以过度面向对象您的代码

是的

于 2008-09-10T15:03:17.030 回答
3

如果您认为更多对象更面向对象,那么是的。

在进行面向对象设计时,您必须平衡一些力量。大多数 OO 设计都是关于降低和处理复杂性。因此,如果您得到非常复杂的解决方案,您并没有做太多的 OO,而是您做错了。

于 2008-09-10T15:13:32.030 回答
2

如果您发现在您的项目中完全实施 OO 所需的时间不必要地导致错过最后期限,那么是的。

必须在发布软件和完​​全 OO 保真度之间进行权衡。如何决定取决于个人、团队、项目和运行项目的组织。

于 2008-09-10T15:04:31.473 回答
2

是的,当然有 :-) 面向对象的技术是一种工具……如果您在给定的工作中使用了错误的工具,那么您将把事情复杂化(当您只需要一把刀时,想想勺子)。

对我来说,我根据项目的规模和范围来判断“多少”。如果它是一个小项目,有时它确实增加了太多的复杂性。如果项目很大,您仍然会承担这种复杂性,但它会在可维护性、可扩展性等方面为自己付出代价。

于 2008-09-10T15:04:31.940 回答
2

我的建议是不要想太多。这通常会导致做某事过度或不足(如果不是 OO)。我通常使用的经验法则是:如果它使问题更容易让我理解,我会使用一个对象。如果另一种范式比我使用一个对象更容易让我的头绕起来,我会使用它。

这个策略还没有让我失望。

于 2008-09-10T15:06:34.120 回答
1

是的,这绝对是可能的——也很常见。我曾经和一个人一起工作,他创建了一个绑定到下拉列表的数据结构——这样他就可以允许用户选择性别。没错,如果可能的性别列表发生变化,那将很有用,但他们还没有(我们不住在加利福尼亚)

于 2008-09-10T15:06:24.370 回答
1

是的,就像人们可以过度规范化数据库设计一样。

这似乎是永远不会结束的纯粹主义与实用主义辩论之一。<:S

于 2008-09-10T15:15:52.350 回答
1

许多人试图设计他们的代码以获得最大的灵活性和重用性,而不考虑这种可能性有多大。相反,根据您正在编写的程序分解您的课程。如果您只有一个特定对象的实例,您可以考虑将其合并到包含对象中。

于 2008-09-10T15:17:04.173 回答
1

我认为你的问题应该是:“你能对你的应用程序进行架构吗?”

当然,答案还没有。OO 只是一种设计方法。如果您因为“多态性摇滚!”而花时间在系统中构建不必要的复杂性。那么是的,也许你已经结束了OOing。

非常 XP 的答案是,无论您喜欢哪种方法(OO、程序等),设计都应该仅在明显必要的情况下复杂

于 2008-09-10T15:24:02.440 回答
1

是的你可以。例如,如果您发现自己在创建接口或抽象类之前创建了它们的两个子类型,那么您做的太过分了。当开发人员预先(过度)设计时,我经常看到这种想法。我使用测试驱动开发和重构技术来避免这种行为。

于 2008-09-10T15:27:02.370 回答
1

是否可以过度面向对象您的代码?

不,但是可能会使您的代码过于复杂。例如,您可以为了使用设计模式而使用设计模式。但是你不能过度面向对象你的代码。您的代码要么是面向对象的,要么不是。就像您的代码设计得很好或者不是一样。

于 2008-09-10T15:27:32.307 回答
0

我想这是可能的,但很难用抽象的术语回答你的问题(不是双关语)。举一个超过 OO 的例子。

于 2008-09-10T15:07:22.683 回答
0

是的。查看“金锤 反模式”的概念

于 2008-09-10T15:08:46.877 回答
0

我认为有时OO设计可以发挥到极致,即使在非常大的项目中也会使代码的可读性和可维护性降低。例如,可以在鞋类基类和运动鞋、正装鞋等的子类中使用。但我已经阅读/审查了人们的代码,似乎他们正在极端地为 NikeSneakers 创建低于该类的类和锐步运动鞋。两者之间当然存在差异,但是为了拥有可读、可维护的代码,我认为有时扩展一个类以适应差异而不是创建新的子类来处理差异很重要。

于 2008-09-10T15:12:08.850 回答
0

是的,这很容易。代码不会因为它是面向对象而变得更好,也不仅仅是因为它是模块化的或功能性的或通用的或生成的或基于数据流的或面向方面的或其他任何东西。

好的代码就是好的代码,因为它的编程范式设计得很好。

好的设计需要细心。

小心谨慎需要时间。

您的案例的一个例子:我见过可怕的 Java 部分,以“面向对象”的名义,每个类都实现了某个接口,即使没有其他类实现该接口。有时这是一种黑客行为,但在其他情况下,它确实是无偿的。

无论您以何种范式或习语编写代码,走得太远,参与太多好事,都会使代码比问题更复杂。有些人会说,当达到这一点时,代码甚至不再是真正的,例如面向对象的。

面向对象的代码应该被更好地组织,以便在合理独立的部分中更简单、更直接或更容易理解和消化。使用与此目标相反的面向对象编码机制不会导致面向对象设计

于 2008-09-10T15:17:14.703 回答
0

我认为明确的答案是肯定的,但取决于你所指的领域,它可能是真的,或者不太肯定。如果您正在构建高级 .Net 或 Java 应用程序,那么我认为这是后者,因为 OO 基本上是内置在语言中的。另一方面,如果您正在开发嵌入式应用程序,那么您超过 OO 的危险和可能性很高。没有什么比看到一个真正高水平的人进入一个嵌入式项目并把他们认为丑陋的事情变得过于复杂,但却是最简单快捷的做事方式更糟糕的事情了。

于 2008-09-10T15:22:32.413 回答
0

我认为任何事情都可能“过度”。我能想到的几乎所有最佳实践都是如此。我见过如此复杂的继承链,代码几乎无法管理。

于 2008-09-10T15:54:18.187 回答