C#的SOLID原则实践

Brannon B. King是供职于Autonomous Solution Inc.的一名软件工程师,他在MSDN杂志2014年05月刊发表了一篇题为《违背C#中SOLID原则的危险》的文章。作者指出了研发人员在C#编码中可能出现的一些常见错误,违背SOLID原则将导致代码不易扩展、难以维护。

\

King提供了计数器的示例代码,并针对SOLID每条原则给出了建议,但为了简洁起见我们只节选了开闭原则(OCP)相关的一些内容。开闭原则(OCP)规定“软件实体(类、模块、函数等)应该对扩展开放,对修改关闭”。根据King的说法,下面这段代码违背了开闭原则

\
\void DrawNerd(Nerd nerd) {\ if (nerd.IsSelected) DrawEllipseAroundNerd(nerd.Position, nerd.Radius);\ if (nerd.Image != null) DrawImageOfNerd(nerd.Image, nerd.Position, nerd.Heading);\ if (nerd is IHasBelt) // a rare occurrence\DrawBelt(((IHasBelt)nerd).Belt);\ // Etc.\}
\

因为你需要在客户每次需要显示新增内容时修改此方法,而且,客户始终需要显示新增内容。建议将绘制替换成通用程序:

\
\readonly IList\u0026lt;IRenderer\u0026gt; _renderers = new List\u0026lt;IRenderer\u0026gt;();\void Draw(Nerd nerd) \{   foreach (var renderer in _renderers)\renderer.DrawIfPossible(_context, nerd); }
\

思路是这样的:

\
\

…编写实现已知接口的绘制类(或有关绘制类的类)。呈现器必须能够决定其是否可以或应该基于输入内容绘制任何内容。例如,带式绘制代码可以移动到其自身的“带式呈现器”,用于检查接口并视需要继续执行。

\
\

基类引用继承类是违背开闭原则的另一个例子

\
\class Nerd {\public void DanceTheDisco() {\   if (this is ChildOfNerd)\      throw new CoordinationException(\"Can't\");\   ...\}\}\class ChildOfNerd : Nerd { ... }
\

作者建议“基类绝不能直接引用其继承类。”。

\

对等类中也可能存在该问题:

\
\class NerdsInAnArc {\public bool Intersects(NerdsInAnLine line) {\...\ }\ ...\}
\

King解释道:

\
\

通常情况下,对象层次结构中的弧线和直线是对等的。它们不应该知道彼此之间的非继承的详尽细节,因为这些细节通常是最优交叉算法所需的。随时修改其中一个,而无需更改另一个。这再一次违背了单一责任。存储弧线,还是分析这些弧线?将分析操作置于其自己的实用程序类中。

\
\

尽管对于小型项目来说可能不是很必要,但为了避免产生面条式代码,代码规模越大,严格执行SOLID原则的重要性就越明显。

\

原文链接:Becoming SOLID in C#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值