是否按照代码重用交付了对象?


17

我经常听到有人说对象在代码重用方面还没有交付。你同意吗?如果您认为他们还没有,为什么不呢?


4
我从未听说过有人说过……
TheLQ'9

2
@the我不相信我曾经听到过有人说过,但是我已经读过了。
乔治·玛丽安

可重用性不是OOP的唯一优势。
没人在2010年

2
“是否在代码重用方面交付了对象?” ->仅当您相信当天的OOP销售人员时(是60年代吗?我忘记了)
Steven Evers 2010年

Answers:


18

不,不一定。

对象提供更好的语义,代码/功能的组织性以及可能的易用性。

设计良好的库可实现代码重用的承诺,而不是对象本身。


嗯,是。但是,对象是否通过向他们提供使他们的库更易于重用的选项来帮助库设计人员?我认为他们有,因此对象交付改进重用。
Jules'7

@Jules我也喜欢辩论,只是为了辩论。我不会认为对象没有使设计库变得容易。我认为正确使用您的工具才能带来正确的结果。
乔治·马里安

7

老实说,我不确定“代码重用”是否真的是任何人所追求的(或者至少应该在此之后)。我的理念是“软件组件”,这意味着可以通过良好的界面来实现更好的可维护性,并避免不必要的耦合。“代码重用”是有时可能发生的事情之一-不必要的重复代码表示您以错误的方式组织了事情,当然这是很难维护的。

为了更直接地回答这个问题,有很多不错的工具可以避免重复您自己:继承,特征,委托,高阶函数等。其中,人们倾向于将继承与整个OO混淆-以及如果您问我,他们也倾向于过度使用它。也许这就是某些“ OO糟透了”的氛围的来源:在没有自然权利的地方发现继承卡住了:)


当您可以避免牺牲代码质量时,绝对希望将代码重用作为目标
Casebash 2010年

1
尽管代码重用并不是其目标。重用是耦合的另一个词。因此,您必须谨慎处理重用。似乎很多开发人员都忘记了这一点。他们想要分离的系统,但是转过身来尝试在任何地方使用现有的类。
安迪(Andy)

5

不,“对象”并没有使代码重用变得更容易或更普遍。防止代码在模块化程序中重复使用的相同担忧(与编写一次性例程相比,设计,测试和记录通用API所需的前期工作要多得多,而所有事务的重担可能是无主-打算重用的逻辑可能无法针对其实际用途进行很好的优化)适用于OO程序,另外还担心设计不良的对象模型可能会阻碍对可重用的其他对象的重用码。

OO是许多问题的便捷抽象,但请警惕80年代至90年代的炒作:它在神奇地解决了我们交易的基本问题之外,还为您在睡眠时为您带来华夫饼。


5

我不希望所有对象都可以重用,但是我们确实有很多对象可以在许多不同的项目上重用。我们还有一些对象只能在一个项目中重用。我们经常会使用同一项目的Click-Once桌面应用程序,Web应用程序和电话应用程序使用相同的业务对象(或数据传输对象)以及业务逻辑对象。

您从哪里听说OO不能实现重用?那是什么原因呢?也许他们的物体设计迫使他们陷入那种境地。


4
各种文章。从个人经验来看,使对象可重用根本不是一件容易的事
Casebash 2010年

3

一些程序员将以任何语言和样式复制和粘贴。

真正好的程序员可以避免大多数情况下使用几乎任何语言进行复制和粘贴。

我发现OO模式倾向于鼓励重用。我见过以非OO风格编写的Java代码(由于糟糕的ORM而使数据与代码分离),并且重用确实很痛苦-但是在OO中,相同的程序员在设计方面做得更好(和重复使用)。

同样,在我们使用非oo模式或oo反模式的情况下,例如setter / getter,switch语句,匿名内部类,巨大的函数等,我已经看到代码重用下降而样板上升……显着。

ps。我知道人们会遇到上一段的问题,所以我会解释一下。

setter和getter引起OO问题,因为它们允许您对对象的成员进行操作(对象应操纵其OWN成员)。这会将在您的类上运行的代码分布到其他所有类中,这需要您在setter / getter周围复制功能。 。这也适用于“属性”,只是因为“属性”简单易用并不能使它们在所有情况下都“良好”。

匿名内部类中的代码根本无法重用,人们忘记了很多东西(例如侦听器)可以而且应该是成熟的类-这也适用于闭包!如果您使用匿名内部类来实现诸如侦听器之类的东西,则与将代码提取到方法或它自己的类中并调用它相比,您更有可能只是复制并粘贴您的实现。封闭还可以提高可重用性-仅取决于您如何使用它们。

在许多情况下,您可以使用的功能决定了代码的结构。在帮助您可视化所有代码及其交互方式时,OO甚至功能更强大,但这是另一个问题。


2

与楼梯间或其他健身设备可以减轻体重相比,对象再利用代码的能力不再强大。必须激励开发人员正确使用工具。

一旦软件团队在重用经过测试的代码上比在保留所有细节方面拥有更高的价值,您将看到更多的细粒度对象和方法,从而实现了更多的代码重用。


2

OOP为您提供了更多重用代码的方法

没有

没有银弹

这取决于

关于您投入的内容以及您期望得到的回报!


1

是。良好的面向对象编程可促进关注点分离,低耦合,高内聚和信息隐藏。这些对于可重用的代码都是至关重要的。

我认为OOP的主要好处是模块化和可修改性,而不是重用,但这是另一个问题。


4
我同意对象可以使代码更好,但是不幸的是我的对象中有很大一部分是不可重用的。通常,使对象可重用意味着过度简化了这种情况
Casebash 2010年

2
@casebase +1但是,我要说的是使对象可重用意味着情况(对象)的复杂化。
乔治·玛丽安

并非所有内容都可以重用。大多数事情不会。但是,低耦合,信息隐藏等都是重用的先决条件,而对象则促进了这一点。
Fishtoaster

2
@Fishtoaster:您不妨说开车是上班的先决条件,而倾斜的车道会促进这一点。从技术上讲,这是正确的,但在极少数情况下不大可能有所作为:如果您需要并且想要重复使用,那么就可以得到,无论是OO还是没有。如果您不这样做,那么具备先决条件就不会使它偶然发生。
Shog9

@先生。C-我不确定我是否遵循你的意思。我只是说OOP所促进的事情(模块化等)使制作类似库的事情变得更加容易。有很多方法可以通过分离关注点来使代码可重用,等等-OOP是一种,好的方法设计是另一种,适当的问题分解又是另一种。
Fishtoaster

1

对象使代码可以重新使用,但是这并不是最有效的方法。我认为代码重用是通过与对象相关的技术(例如继承,多态性,重载和模板)来促进的。


1

是的,他们的确如此,从超类clear扩展(继承)的能力有助于代码的重用,我不确定有人会反驳。您可以简单地扩展一个类并覆盖一个方法,而使用超类中的其余方法,如果这不能帮助代码重用,那么我不知道这是什么


0

到目前为止,他们是否已经实现了代码重用的承诺?是的,如果牢记OOP的程序明智地应用了设计模式。否则,大多数情况下不会。但是考虑到Adobe系统,Google等使用C ++或Java或其他OOP语言编写的大规模非琐事程序的普及,我想说OOP在逐步淘汰之前还有很长的路要走。那个时候将更适合提出这个问题,并可能有助于为新的范例提供基础工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.