如何解释松耦合和信息隐藏给新程序员?

时间:2009-02-27 13:19:46

标签: oop

如何解释松耦合和信息隐藏给新程序员?我有一个程序员,我为其编写设计,但似乎无法掌握松散耦合和信息隐藏的概念。

我通过函数将所有内容很好地分解为类来编写设计(数据访问是独立的,请求类,控制器,总共约5个类)。他们回来时采用了改进的设计,其中一半的类继承自另一半(并且没有“is-a”关系),以及许多公共变量。

我如何理解保持分离的想法使维护更容易?

19 个答案:

答案 0 :(得分:57)

问他是否最好让你借钱给你一会儿并自己拿钱来借10美元。

答案 1 :(得分:16)

问题在于您的期望,而不是开发人员缺乏技能。你谈论松耦合和信息隐藏,好像这些是简单的事实或机械技术 - 它们不是。软件开发是一种技术,唯一能够在技术上变得更好的方法就是实践它并慢慢地逐步改进。

您正在寻找捷径。您希望开发人员体验“ahah!”一瞬间突然看到你设计中的智慧。我说,不要屏住呼吸。

采纳导师的心态。如果你想让他提高自己的设计技巧,不要“给他”设计,让他去设计吧!然后和他一起回顾设计。这将给予他经验,更深刻的主人翁意识以及更愿意在他的实施过程中倾听你的建议。

抛开一边 - 我注意到人们一直在寻找这些捷径,而不是更多的“身体”技能。以网球为例。如果你是一名网球教练而且一名新球员长期不停地打击他的前锋,你不会只向他展示一段关于罗杰·费德勒正手的YouTube视频,并期望他“得到它”。当你学习感觉并在不同场景中使用它时,一个伟大的正手需要多年的经验 - 它不是你的肌肉学习,它是你的大脑。它与软件设计没有什么不同。你一遍又一遍地擅长这一点。你慢慢从错误中吸取教训,并更好地理解每个设计决策的后果。

答案 2 :(得分:12)

解释这些概念的最佳方法是使用类比。选择非编程相关的东西,并用它来解释抽象设计概念。

以下图片非常擅长解释松耦合的需要:

Dependency Inversion Principle: Would You Solder A Lamp Directly To The Electrical Wiring In A Wall?

尝试提出类似这样的内容,这些内容会让您的新程序员感到愉快并与之相关。

答案 3 :(得分:7)

理论只会让你到目前为止。

让他尝试为他刚才写的代码添加新功能。然后重新编写旧代码,使其松散耦合,并要求他添加相同的功能。

他一定会理解编写优秀代码的优势。

答案 4 :(得分:6)

没有什么比得上物理类比了。走出你的车,指出一切复杂,炎热和危险的东西是如何与脆弱的人隔离。坐在驾驶座上并指出一些重要的仪表;例如,冷却液温度,转速计和速度计。注意仪表是如何非常相似的:它们都采用标量值(从某处)并通过将针移动到最小值和最大值之间的位置来表示它。

但是,如果你考虑一下被测量的是什么,维持这种孤立的强烈动机(又称松耦合或信息隐藏)变得更加明显。

  • “您想如何测量冷却液温度?通过观察仪表或用手指插入接近沸腾的液体?”

  • “你想怎样测量发动机的转速?通过观察一个量规或让一个数千转的RPM曲轴从你的骨头上撕下来,当你试图用手估计它时?”

  • “你想怎样测量汽车的速度?当你在高速公路上咆哮时,通过观察一个仪表或将脚拖到地面上?”

从那里,您可以建立在“您的冷却液温度计规格。不是沸腾液体”等概念的基础上更复杂的概念。

答案 5 :(得分:3)

alt text

  • 松耦合:手表的部件可能会被其他部件更换而不会破坏整个手表。例如,你可以移开一只手,它仍然可以工作。

  • 信息隐藏:时钟指针不知道它背后是否有机器。

附加概念

  • 高凝聚力:手表“模块”中的所有元素都非常相关。在此特定方案中,电池将属于另一个模块或命名空间。

答案 6 :(得分:1)

我认为OO概念确实需要实际学习。一个人真的需要做这些事情才能理解。我上学(工程),我的大多数同事都没有真正理解这个概念。他们一般都知道松散耦合是“好”但不是原因。他们也不知道如何实现松耦合。我现在正在完成我的最后一年项目,并通过将它们作为设计过程的一部分来完成它们。 (这有助于他们真的确实理解如何为什么并且了解其重要性)

鉴于你的情况,我建议这就是:
1.让它们完全按照你的设计(至少几周)。如果他们想要偏离,让他们讨论你的原因和原因。 [时间限制可能不允许这样做] 2.与他们坐在你接下来要做的设计的任何一部分上,并举例说明你的设计选择。你可能需要向他们指出一些显而易见的事情 3.留意好的设计和糟糕的设计,并向他们展示如何更好地工作。

这里最重要的任务是授权。你必须向他们展示好的代码是什么样的,也许可以培训他们几个小时。然后你同意何时进行审查以及如何帮助他们(在你有限的空闲时间(?))完成任务。最重要的是让他们认同并理解好的设计。做这些事情将有助于他们“买进”设计。一旦他们觉得这是他们的设计,我相信他们会做得更好。

总的来说,我认为你需要放下脚步让他们正确编码,而不会扼杀他们的创造力。

我在该地区并没有太多的经验。基于对我有用的内容,我只是就这个主题发表意见。我希望这会有所帮助。

注意
我想补充一点,OO概念可以从书本中学习,而他们的应用只能通过实践来学习。我已添加此说明以回应Christopher W. Allen-Poole的评论。

答案 7 :(得分:1)

如果他误解了你的设计,也许一对编程会话就足以使他们走上正轨。我不得不同意@ThomasD并将扩展它 - 这里的封装可能就是你。这可能是一个错误解释的简单案例,而不是他们不理解这些概念。

答案 8 :(得分:1)

我喜欢信用卡作为例子。

你有一张信用卡。 信用卡代表您的信用记录。它有平衡和APR。它具有权限和整个财务状态。它有一个id,一个到期日期和一个安全码。磁条总结了所有这些。

当你去当地的信用卡接受机构时,他们不需要知道这一点。他们不想知道这一点,如果他们知道这一点通常会非常危险。他们需要“知道”的是,有一个磁条可以处理所有这些,并且(有时)拿着卡的人的身份证与卡上印刷的名字相符。

给予他们更多信息要么(在最好的情况下)无用,要么(在最坏的情况下)危险。要求他们知道要检查的银行,确保他们知道如何计算您的特定年利率,或者让他们检查您的余额,这在当时是愚蠢的。

答案 9 :(得分:1)

只是不要跟他说话。这应该教他信息隐藏。 ; - )

答案 10 :(得分:1)

请他做出改变,你知道因为他的设计会很难,并告诉他如何使用你的设计。

如果他抱怨,告诉他真相:商业会提出更多奇怪的变化,他会看到这个问题。

答案 11 :(得分:1)

我会尝试与他坐下来,并通过几个代码来查看你的sholder并解释为什么你正在做你正在做的事情。我发现这通常是解释事情的最佳方式。

答案 12 :(得分:1)

告诉他this presentation。虽然它主要是关于DI,但它非常精彩而且非常重要。

答案 13 :(得分:0)

如果您进行单元测试,请按照测试编写说明。或者,抽象类和接口都使用松耦合和信息隐藏,效果很好。如果你根据他可能已经掌握的其他概念向他解释,他将更有可能迅​​速欣赏这个概念。

答案 14 :(得分:0)

如果你必须向他们解释,那么我不得不问:他们真的是程序员吗?

告诉他们他们需要“大学过来”?

这很难,因为它是一个基本概念。就个人而言,我不想处理它,因为它就像有人得到报酬,学习他们应该已经知道的东西,但生活并不总是理想的。

我通过找到一个简单到足以解决相对简单的问题来解决它。公共变量通常通过在无法查看变量变量时找到问题的根源来获得最佳处理。您可以为此设计方案。

过度继承可能不是他们的错。他们可能在90年代设计的课程中学到了“一切都必须继承”的观念。我记得Manager的旧例子扩展了Employee。这只是不好的。事情是人们被教导这个废话。仍然。

对于C ++而言,Scott Meyer Effective C ++系列可能值得他们考虑(假设他们可能会被阅读的东西困扰)。对于Java来说,Josh Bloch的Effective Java(“青睐组合”)也是如此。不确定C#。

这些类型的书提供了更好的继承与组合的方法,并提供了一些很好的例子,说明为什么继承(如Josh Bloch所说)是一个“实现细节”。我也听说它描述为“继承破坏封装”。

我看到了继承与组合之后的一个很好的例子,扩展了Java中List的功能,以及继承如何让你知道父进程的实现细节是否正确,而组合却没有。我会看看能不能找到它。

答案 15 :(得分:0)

答案 16 :(得分:0)

程序是交互部分的系统。

对于一起工作的交互部件系统,需要在这些部件之间建立连接。

连接越多,程序的成本就越高。

对于固定数量的部件,部件不必要地连接的系统比部件必须连接的系统更昂贵。

不必要的连接只能在系统中形成,其部件不必要地暴露于来自其他部件的连接。

最大限度地减少零件与其他零件连接的不必要暴露是经济高效的程序开发的基础。

松耦合和信息隐藏是连接曝光最小化的基础。

这不是程序员的可选知识。

这是基本的。

如果没有这方面的知识,你就不能成为一名注重成本的程序员。

询问如何解释松散的耦合和信息隐藏给新的程序员就像问如何向新外科医生解释手术?或者向新建筑师解释建筑?或者如何向飞行员解释飞行。

如果你的'新程序员'不知道松散耦合和信息隐藏,那么他们就不会,'新程序员;'他们是潜在的程序员。

奇怪的是,告诉他们阅读原来的两篇论文可能无济于事: i)松耦合:'结构化设计',由W.P.史蒂文斯,G.J。迈尔斯和L.L.康斯坦丁。 ii)信息隐藏:http://www.cs.umd.edu/class/spring2003/cmsc838p/Design/criteria.pdf

答案 17 :(得分:0)

就像从16位移动到32位窗口应用程序一样,在这些应用程序中,进程被赋予了自己的地址空间。这阻止了任何其他进程在“意外地”遍历您的数据时杀死您的应用程序。

将流程移动到不同的地址空间就像将每个流程视为一个类一样,并且隐藏内部内容,并通过强制进程间通信来强制进程间的解耦预期的界面(例如Windows消息)。

答案 18 :(得分:0)

松耦合意味着外部代码应该通过抽象基类使用派生的非抽象类的对象。如果在它依赖的类集合中发生任何变化,那么外部代码就不会发生变化,即外部代码确实表现出松耦合。