向经验丰富的C ++工程师团队“引入” OOP / OOD的最佳方法


17

我正在寻找一种有效的方法来向现有团队成员介绍OOP概念,但这并不是侮辱。我的队友对OO语言并不陌生。我们从事C ++ / C#已有很长时间了,因此对技术本身很熟悉。

但是,我环顾四周,并且没有付出很大的努力(主要是以代码审查的形式),似乎我们正在生成的是恰巧在类内部的C代码。仅举几例,几乎没有使用单一责任原则,抽象或试图最小化耦合的尝试。我见过没有构造函数的类,但每次实例化时将memset设置为0。

但是每次我提起OOP时,每个人都会点头并让他们看起来好像完全知道我在说什么。知道这些概念是件好事,但在交付实际工作时,我们(比其他人更多)似乎很难应用它们。

代码审查非常有帮助,但是代码审查的问题在于它们仅在事实发生之后发生,因此对于某些人来说,我们似乎最终重写了刚刚编写的代码(它大部分是重构的,但仍然要花费很多时间)。另外,代码审查仅提供反馈给单个工程师,而不是整个团队。

我正在做一个演示文稿(或一系列)的想法,然后尝试再次提出OOP以及一些本来可以编写得更好并且可以重构的现有代码示例。我可以使用一些没有人拥有的非常老的项目,因此至少那部分不应该是一个敏感的问题。但是,这行得通吗?正如我所说的,大多数人已经做过C ++很久了,所以我的猜测是:a)他们会坐在那里思考为什么我要告诉他们他们已经知道的东西; b)他们实际上可能会将它当作侮辱,因为我告诉他们他们不知道如何做他们已经从事多年甚至数十年的工作。

是否有另一种方法可以比代码审查更广泛地吸引读者,但同时又不会像惩罚性演讲那样?

我不是一个刚大学毕业的孩子,他对理想的代码设计有着乌托邦式的理想,我不希望任何人都能做到。我之所以写这本书,是因为我只是对一个实际上在纸上有不错的高级设计的人进行了评论。但是,如果您描绘类:A-> B-> C-> D,则在代码B,C和D中都实现几乎相同的公共接口,并且B / C具有一个内联函数,因此最高级的A类绝对在做所有工作(包括内存管理,字符串解析,设置协商...)主要以4种mongo方法进行,并且出于所有目的和目的,几乎都直接调用了D。

更新:我是一名技术负责人(担任该职位六个月),并得到了小组经理的全力支持。我们正在开发非常成熟的产品,并且维护成本绝对是众所周知的。



3
您是他们的上司还是老板?如果没有,您是否得到所有人的老板的技术总监的支持?如果您只是其中的一员,并且多年来使用稳定的开发方法而没有使用深层的OOP设计,那么您将面临一场艰苦的战斗,以说服程序员认为工作代码行不通,并且管理人员也没有浪费您的时间钱花在生成代码上更好。
Patrick Hughes

在我发表这篇文章之后,弹出的相关链接听起来很像我的情况:programmers.stackexchange.com/questions/43214/…。我担心同样的事情。问题在于他们的团队有2个开发人员,我绝对可以通过代码审查来解决。我正在寻找一种适合我们的团队规模(10+)的方法,但我并没有像我想要的那样与每个开发人员进行一对一的交流。
DXM

Answers:


5

您为什么不对SOLID原理进行简短培训,并给他们进行此培训?在我目前的组织中,这似乎对我来说非常有效,而且我发现短期培训实际上很有趣(对于每个参与人员)。

当我接受培训时,我花了一些时间在(各种项目的)现有代码中搜索病理性的“不良”示例,并使用这些原理在演示文稿中逐步对其进行了重构。这表明

  1. 进行这些重构并不难
  2. 不用多久
  3. 最终结果(精心选择;-))明显优于原始代码。

5

代码审查非常有帮助,但是代码审查的问题在于它们仅在事实之后发生。

在一个项目中,我们进行了设计审查。

15分钟。在白板上。在编码之前先讨论一下设计。

最重要的部分是任何实施工作之前安排设计审查。

我们还进行了“关键设计评论”,这是一项艰巨的任务。他们涉及大量文件和冗长的演讲。它们很难调度,并且几乎总是被推出,直到编码开始后才将它们的值减小到零。

非正式的设计评审-在编码之前-没有压力-没有文档-可以更好地讨论如何分配职责以及对象将如何协作。


是的,我们已经按照您的描述进行了设计审查。问题是中型任务。如果任务足够大,我通常会花一些时间来准备初始的类图,然后由团队加以完善。如果任务很小,那么现有的高级设计已经足够了。但是,对于中等规模的任务,我没有能力在设计中投入足够的思想,因此基本规则是“使用最佳判断并遵循OOP”。如果我要自己执行这些任务,那么我将从编码开始,然后通过连续重构和混合将其混合在一起
。– DXM

...让代码决定最终设计的外观。但是,当我将这些任务留给某些团队成员时,有时在代码审查中会发现我在最初的帖子中描述的东西。
DXM

1
@DXM:什么?你在干嘛?还是不这样做?如果很大,那么您不是在进行设计审查-您是在为其他人进行设计-谁会在您进行设计时学习?如果很小,那么您就没有在进行设计审查了-“现有的设计已经足够好”了-当您忽略设计时谁会倾斜?如果是中等级别,则您不进行设计,也不审查其设计?听起来您实际上并没有进行实际的设计审查。为什么您说自己是,然后举三个例子说明您不是?
S.Lott

@洛特:反思您的回答后,我唯一的结论就是您绝对正确。我想我应该说的是,我至少提出了8次确切的想法,并且每个人都始终同意,但是,是的,如果我回顾一下我们确定的节奏,我们实际上并没有做任何事情。我想进一步讨论这个问题,但是由于在严格的问答站点上进行讨论,我已经受到mods的约束。我们可以聊天吗?我想进一步解释一下情况,也许可以动一下脑子(或想加入的其他人)。从未进行过聊天,您知道它如何工作吗?
DXM

@DXM:聊天很简单。并没有太大的帮助。如果您还有其他问题(比该初始问题更详细),则应提出这些更详细的问题。这才是重点。在某些情况下,“进一步讨论”等于“由于以下原因,我不喜欢您对我的问题的回答...”,这很愚蠢。不喜欢答案就是不喜欢答案,不需要任何讨论。在少数情况下,讨论相当于“我的问题不明确,您无法阅读。” 没用,真的。问你的问题。作为问题。
S.Lott

4

我假设您比某些开发人员还年轻,但在食物链中更高。

冒着被选票埋葬的风险,这可能是“经验丰富的工程师”实际上在做正确的事-或由于这是一种已经存在了数十年的成熟产品,曾经是正确的事。

较旧的代码往往已经过优化,可以在当时的硬件上快速运行。除其他外,这意味着降低继承级别并避免对琐碎运算的函数/方法调用。

多年来,编译器变得更加聪明,因此并不是所有曾经的事情都是正确的-例如,编译器可能选择内联一个小函数。

前进的道路也许是采用另一种方法-让开发人员解释他们的方法为何/为什么比您所教的理论更好-并对此持诚意。


0

对于每个新的/更改的方法,要以100%的分支覆盖率推动单元测试,不会导致方法之间的耦合最小化。


UT是个好主意,但我不相信这会达到预期的结果。此外,OO的基本原理之一是函数之间的耦合是不可避免的,因此您最好使该耦合函数显式并将其分组在一个类中。
MSalters 2011年

我同意“不可避免地在功能之间进行耦合”。但是好的设计也减少了每个功能耦合的其他功能的数量。(上课只是为此目的的一种手段)
Ian

0

您可能想从“四人帮”中挑选“设计模式”书。它不是特定于C ++的,因此您在引用它时不会公开批评同事的C ++知识。但同时,它确实解决了您认为相关的主题。而且,该书被广泛认为具有相关性,因此他们不能轻易将其视为理论上的或不切实际的。

另一方面,无论是在设计上还是在实践中,都认为C ++不是纯OO语言。整个构造函数/内存集的故事听起来都应该介绍RAII,它根本不是OO技术,而是C ++特有的(不幸的是-.Net的IDispose显示了RAII是事后想法时会发生的情况)。这里的相关书籍是(更多)有效的C ++和(更多)杰出的C ++。


2
但是作者清楚地指出,设计模式通常不是OOP / OOD的介绍!在进入硬编码设计模式目录之前,读者应该首先熟悉OOP提供的技术!“ Head First设计模式”将作一个很好的介绍。
猎鹰

2
从OP描述中可以看出,他们确实了解OOP / OOD,只是不使用OOP / OOD(也许是因为担心它太复杂了),在这种情况下,一本解释为什么有用的书可能比代码示例更能激发人的兴趣。
wildpeaks 2011年

@wildpeaks:OP则相反。他们不知道OOP / OOD。他们以程序方式对OOP进行编程。他们需要一些东西来向他们介绍设计技术,而GoF书不适合这种情况。
猎鹰

我指的是句子But every time I bring up OOP, everyone always nods and makes it seem like they know exactly what I'm talking aboutMy teammates are not new to OO languages,但是我可以看到它确实有点含糊,因为当OP与他们交谈时,他们可能只是想知道OOP。
wildpeaks 2011年

1
@MSalters-设计模式的序言:“这本书不是面向对象技术或设计的简介。许多书已经很好地做到了这一点。这些书假定您相当精通至少一种面向对象的编程语言,并且您在面向对象设计方面也应该有一些经验。” 这本书不符合要求。他们应该阅读一些入门级OOD资料。
猎鹰
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.