写点什么

C#的 SOLID 原则实践

  • 2014-06-03
  • 本文字数:984 字

    阅读完需:约 3 分钟

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#****

2014-06-03 20:263023
用户头像

发布了 27 篇内容, 共 89879 次阅读, 收获喜欢 4 次。

关注

评论 1 条评论

发布
用户头像
借博主宝地一用,给大家推荐一个最近很火的接口管理工具apipost,很好用,有时间可以试试
2022-04-13 20:58
回复
没有更多了
发现更多内容

2024年了,居然还有人不知道git worktree?

秃头小帅oi

国资委认可!优秀品牌!

天翼云开发者社区

云计算 天翼云

人工智能如何改变 API 的未来

幂简集成

AI API

Rainbond 携手 TOPIAM 打造企业级云原生身份管控新体验

北京好雨科技有限公司

云原生 k8s rainbond 企业号 5 月 PK 榜

共筑产业生态丨焱融科技加入长三角人工智能生态联盟

焱融科技

ByConity真的可以替换ClickHouse吗?

ClkLog

低代码开发:助企构建数字化应用平台

不在线第一只蜗牛

低代码

EMQX Enterprise 5.7 发布:新增会话持久化、消息 Schema 验证、规则引擎调试与追踪功能

EMQ映云科技

云原生 数据 mqtt emqx mqtt broker

全国节能宣传周来了!天翼云电脑为绿色低碳注入科技动能!

天翼云开发者社区

云计算 云电脑

以文会友,IoTDB 社区专属六一礼物派送!

Apache IoTDB

向量数据库引领 AI 创新——Zilliz 亮相 2024 亚马逊云科技中国峰会

Zilliz

AI AWS Zilliz 向量数据库

海外云手机改变全球社交营销方式

Ogcloud

云手机 海外云手机 云手机海外版 国外云手机 跨境云手机

百度文库发布行业首个“查阅创编”一体化产品“橙篇”,AI创作领域诞生“超级物种”

极客天地

SQL查询太慢?实战讲解YashanDB SQL调优思路

YashanDB

数据库 SQL调优 yashandb 崖山数据库

观测云产品更新 | DCA、异常追踪、日志、场景、监控等

观测云

监控

C#的SOLID原则实践_C#_Abel Avram_InfoQ精选文章