BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

C#的SOLID原则实践

| 作者 Abel Avram 关注 10 他的粉丝 ,译者 雷慈祥 关注 1 他的粉丝 发布于 2014年6月4日. 估计阅读时间: 4 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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<IRenderer> _renderers = new List<IRenderer>();
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#

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

这种老生常谈的东西为什么隔上一年半载就出现一次呢?随便看一本面向对象的书就可以了。 by Li Haiyuan

这种老生常谈的东西为什么隔上一年半载就出现一次呢?随便看一本面向对象的书就可以了。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT