“过于面向对象”


21

我具有强大的OO背景,并且我最近开始在一个组织中工作,尽管该代码是用Java编写的,但与过去相比,我对良好的OO设计的重视程度要低得多。有人告诉我,我引入了“太多的抽象”,而我应该以一直采用的方式编写代码,这是Java中的一种过程样式。

TDD在这里也不太常用,但是我想拥有可测试的代码。在大型“神类”(这似乎是该团队的常态)中以静态私有方法掩埋业务逻辑不是很可测试的。

我很难向同事清楚地传达自己的动力。有谁对我如何说服我的同事使用OO和TDD导致更容易维护的代码有任何建议?

这个问题有关技术债务是关系到我的问题。但是,我试图避免首先产生债务,而不是在另一个问题所涵盖的事实之后偿还债务。


17
您的角色是什么?发脾气的开发商?您被搞砸了-找到更好的工作。首席开发人员?您也许可以有所作为...
Matthew Flynn

2
与其说技术欠佳,不如说是应对糟糕的设计和不会改变的人们
ozz 2013年

1
我知道技术和业务方面的争论,我在问如何最好地将这些知识带给我的同事,他们似乎对此一无所知。他们看到了很多课程,我看到了一个可测试的,可扩展的系统
ThuneGrill

5
抱歉,您必须离开。您正在谈论同事的头脑。在项目变得不可维护之前,它不会改变。如果您不喜欢手动测试和死亡游行,最好去别的地方。
凯文·克莱恩

4
没有看到有问题的代码(是的,很难提供足够的样本,因此我们只能在这里信任您的判断),很难判断是否确实缺乏OO,或者您是否在推动过度设计的货运方式OO抽象没有充分的理由。我想大家已经看到在工程OOP,其中抽象停留在抽象的生产工厂等抽象工厂层的例子
Kromster表示支持莫妮卡

Answers:


32

您并没有抱怨它无法维护,只是不喜欢您。如果这是故意选择的样式,则可能只是创意差异不可调和,您应该调整样式以适合自己,或在某个地方找到适合自己偏好的样式。

人们可以并且确实始终以程序方式编写模块化,高效,抽象性强,相对无缺陷的代码。对于这样的商店来说,Java是一种奇怪的语言选择,但是我可以看到,如果外部因素决定了这种语言,比如说需要为Android开发,它就会发生。

每个人都是天才。但是,如果您通过鱼类爬树的能力来判断它,那么它会终生相信它是愚蠢的。- 艾尔伯特爱因斯坦

如果这一个故意的选择,则不能真正通过它们遵循良好的面向对象设计原则的程度来真正地判断它们,应该通过它们遵循良好的过程设计原则的表现程度来进行判断,并相应地进行重构。Java不允许您在类之外编写代码,因此仅存在一个类并不意味着他们打算使模块成为面向对象的。

另一方面,如果代码在任何一个范例中都是一团糟,那么您可能应该减少损失。


3
这是程序上的,而且很混乱。但是我正在谈论的是我写的被称为“面向对象的新代码”
ThuneGrill 2013年

5
毕竟,用OO代码扩展凌乱的过程代码可能并没有改善,只是增加了混乱。
wirrbel

7
@ThuneGrill,您假设他们是出于对面向对象设计的无知而选择了他们的编码样式,因此,如果您可以对他们进行培训,他们将会看到曙光。如果有人用高度面向对象的语言来赚钱的软件业务到现在还没有研究OOD的好处,那么“新人”就不可能说服他。请相信我的话,以及其他评论者的话。如果您不能或不会调整样式以使团队更容易阅读,则应该减少损失。
Karl Bielefeldt

3
@ ThuneGrill:卡尔是对的。坚持务实的理由,而不是宗教的理由。OOP当然是个好主意,但我已经看到它具有极端的荒谬性。结果是使山区摆脱了困境。可以用1000行代码完成的工作最终是galore类的10,000行代码。然后,Gee,很难维护,而且性能糟透了。(无论使用什么收集类。)
Mike Dunlavey

1
我不一定会放弃您可以说服人们的想法。这很艰难,但可以做到-我已经做到了。由于这个问题似乎关闭,见workplace.stackexchange.com/questions/9703/...
艾米布兰肯希普

7

在阅读您的问题时,我想起了《实用程序员》一书的一个技巧。

其提示之一是Be a Catalyst for Change

您可能处在确切知道需要做什么以及如何做的情况。整个系统只是出现在您的眼前-您知道这是正确的。但是,请允许您解决整个问题,您会遇到延误和茫然的表情。人们将组成委员会,预算将需要批准,而且事情将会变得复杂。每个人都将保护自己的资源。有时这被称为“启动疲劳”。

是时候煮石汤了。算出您可以合理要求的东西。好好发展。掌握之后,向人们展示,让他们惊叹不已。然后说:“当然,如果我们添加……会更好。” 假装这并不重要。请坐下,等待他们开始要求您添加最初想要的功能。人们发现更容易加入持续的成功。向他们展示未来,您将使他们团结起来。

因此,我认为,如果您开始凭借自己的OO和TDD知识做好工作,那么他们很快就会开始寻找并询问您的工作。


试图成为,但是uber-architect(不编码的人)将一无所有。
ThuneGrill

一旦他注意到TDD的好处和更好的OO(可靠性,生产率……),您就会得到您的关注!
罗德里戈

3

要销售新的工作方式,您需要显示出明显的好处。编写更多的抽象层,没有明显的好处,但却含糊其词:“对将来可能是有益的”是行不通的。

在工厂制造的地方制造一种以上类型的物体。使用依赖注入,它立即显示出好处。制作实际上将由一个以上类实现的接口。

我在“真正的面向对象”中经常看到的是,先进的技术被用来以过于复杂的方式解决非常简单的问题。

如果工厂只会制造相同的对象,那么如何显示工厂的好处?在代码中找到一个可以从高级技术中受益的问题,并从中显示您的观点和工作。

战争一次赢得一场战斗。


1

您只能说服一小段代码,并在其上实现TDD和更好的OO实践以实现收益,才能说服他们。您已经将他们带到了应许之地,而不仅仅是显示漂亮的明信片。

当然,我认为当今许多代码库中都存在过度抽象的情况。仅放入您需要的内容,其中还包括抽象。


1
刚刚做了,这就是引起整个讨论的原因。我仅在现有功能之上介绍了3-4个抽象概念
ThuneGrill
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.