让姑姑不再划拳 码农也要有原则 : SOLID via C#
何为SOLID?S.O.L.I.D.是一组面对面向对象设计的最佳实践的设计原则。术语来自Robert C.Martin的著作Agile Principles, Patterns, and Practices in C#代表了下面五个设计原则1. SRP(Single Responsibility Principle) 单一责任原则2. OCP(Open Closed Principle) 开放封闭原则3. LSP(Liskov Substitution Principle) 里氏替换原则4. ISP(Interface Segregation Principle) 接口分离原则5. DIP(Dependency Inversion Principle) 依赖倒置原则下面用C#例子来一一介绍。SSRP, Single Responsibility Principle, 单一责任原则人类学习和理解最快的方式是实践这点在编程上显得尤为突出。理解SOLID最好的方式就是先去了解它解决了什么问题。首先给大家出一道大家来找茬下面这段代码中有一个很大的问题你找到了吗(停停停不用去倒杯茶细细来看因为这段代码已经简单到没朋友了)那我们现在就抛开和华生的基情对这个作案现场来调查一番。class Customer { public void Add() { try { // Database code goes here } catch (Exception ex) { System.IO.File.WriteAllText(c:\Error.txt, ex.ToString()); } } }相信大家都发现这个问题出在哪里了一个顾客类竟然可以自主写logCustomer Class 应该是要做关于Customer Datavalidation或者访问顾客相关的数据库进行存储的相关操作实现Log的记录实际上已经超出了其责任的范围。这就像小龙女不去做个安静的美姑姑而去学划拳和人斗酒一样WTF当明日需要你改造Log记录的实现或路径的时候而你却push了一段Customer类的改动这会让人感到非常奇怪的。这也让我想起来了一个世界知名的工具-瑞士军刀。毫无疑问它很棒但当你需要改动其中一个部分的时候其余部分要一起重新来排列保证不会互相干扰到。而且你可以尝试一个场景用瑞士军刀掏耳朵那种感觉真的是醉了。倒不如我们一一拆分各司其职剪子剪纸耳勺掏耳使部件功能简单化互不影响。这个原则适用于软件架构中类和对象的设计。所以简而言之SRP就是指单个类应该有且仅有单个职能。所以我们可以对刚才案例朝这个目标进行初步改造首先将记录log的逻辑在一个单独的FileLogger类上实现class FileLogger { public void Handle(string error) { System.IO.File.WriteAllText(c:\Error.txt, error); } }现在Customer类可以欢快的抛弃“五魁首六六六”FileLogger class 来负责记录log的具体实现而customer class可以更专注的负责自己的模块。class Customer { private FileLogger obj new FileLogger(); publicvirtual void Add() { try { // Database code goes here } catch (Exception ex) { obj.Handle(ex.ToString()); } } }如果有一些SRP经验的朋友可能已经发现其实这种解决方案并不能完全解决SRP的问题。因为try catch其实并不是Customer类需要关心的功能。在记录Log这一层不同的语言和结构都会有一个类似Asp.Net中Global.asax或者WPF中App.xaml.cs这类文件可以集中来处理这些冒泡的错误这样Customer类中便不会有TryCatch的方法。其实这个程序依然可以更好也可以有更多的解决方案但此文旨在使用足够简单的例子来用C#阐述SOLID也希望可以不禁锢大家思维有好的方案可以在下面回复和交流来产出一个伟大的解决方案。在codeproject里有一个答案是很不错的具体实现就不剧透了如感兴趣可以戳http://www.codeproject.com/Articles/703634/SOLID-architecture-principles-using-simple-Csharp?msg4729987#xx4729987xxO:OCP, Open Closed Principle 开放封闭原则上一个“场景”过了SRP阶段我们要继续开始OCP阶段了, OCP简单来说就是 对扩展是开放的对修改是封闭的。在Customer类中我们现在添加一个属性来表示他是黄金用户还是银色用户。当CustType为1时为Gold用户为2时为Silver用户.根据用户类型不同来返回不同的折扣。来继续来找茬了这个节奏好像看起来大家看完本文后能在大家来找茬中无往不胜啊haha。开启福尔摩斯模式关注在getDiscount方法中的if语句class Customer { private int _CustType; public int CustType { get { return _CustType; } set { _CustType value; } } public double getDiscount(double TotalSales) { if (_CustType 1) { return TotalSales - 100; } else { return TotalSales - 50; } } }“嫌疑人”出现了当我们再添加一个用户类型时我们还需要添加修改if中的折扣逻辑也就是我们需要修改Customer Class。当我们一次次更改Customer Class我们还需要确认之前的逻辑是没错的以及引用该Class的更多的逻辑也是没问题的也就说需要一次又一次的测试。那么问题来了挖掘...不对是如何来避免多次的“Modify”而带来的恶果呢那就是“EXTENSION”(扩展).当我们每次增加一个用户类型的时候我们就增加一个Customer的扩展类因此我们也就每次只需要测试新加的类。class Customer { public virtual double getDiscount(double TotalSales) { return TotalSales; } } class SilverCustomer : Customer { public override double getDiscount(double TotalSales) { return base.getDiscount(TotalSales) - 50; } } class goldCustomer : SilverCustomer { public override double getDiscount(double TotalSales) { return base.getDiscount(TotalSales) - 100; } }这样也就解决了多次修改带来的问题通过扩展基类而不是修改。OCP原则 拥抱扩展拒绝修改保证了现有逻辑的稳定性。其实还有一张比较XXX的图来表示OCP我这边就不镶嵌到文章里了因为....好奇的小盆友可以戳戳记得留言写下感悟...戳我L: LSP Liskov Substitution Principle 里氏替换原则跨过前两个坎现在我们来到了第三个原则这次我们换一个模型。首先我们有一个Bird的Class,有一个Fly的方法class Bird { public void Fly() { // Fly Logic } }后来我们发现生物学上企鹅也属于鸟类当然这只企鹅不在深圳但它不会飞。

相关新闻

Python+Pygame开发经典飞机大战游戏教程

Python+Pygame开发经典飞机大战游戏教程

1. 项目概述:用Python打造经典飞机大战游戏最近在整理Python游戏开发的教学案例时,我决定复刻这个80后程序员集体记忆中的经典——飞机大战游戏。不同于简单的教学Demo,这次我们要实现一个包含完整游戏循环、碰撞检测、得分系统的可玩版本。使…

2026/7/4 1:38:00阅读更多 →
UE坐标系转换与正交化实战指南

UE坐标系转换与正交化实战指南

1. 自定义坐标系转换的核心概念在Unreal Engine开发中,坐标系转换是一个基础但极其重要的技术点。很多开发者第一次遇到需要自定义坐标系的情况时都会感到困惑 - 为什么世界坐标系不够用?什么情况下需要建立自己的坐标系系统?根据我的项目经验…

2026/7/4 1:38:00阅读更多 →
Python 3环境下Robot Framework自动化测试框架完整搭建与实战指南

Python 3环境下Robot Framework自动化测试框架完整搭建与实战指南

1. 项目概述:为什么要在Python 3.X下搭建Robot Framework?如果你是一名测试工程师、自动化爱好者,或者正在寻找一个既能做Web/API测试,又能玩转桌面应用甚至移动端自动化的工具,那么Robot Framework(后文简…

2026/7/4 1:38:00阅读更多 →
胰岛素泵品牌全解析:2026年7月主流产品客观对比

胰岛素泵品牌全解析:2026年7月主流产品客观对比

胰岛素泵品牌全解析:2026年主流产品客观对比胰岛素泵作为糖尿病强化治疗的核心设备,其选择直接关系到患者长期的血糖管理效果与生活质量。目前市面上主流品牌包括移宇科技、美敦力、微泰、Omnipod、丹纳、艾派乐等,在技术路线上大致分为两大类…

2026/7/4 2:53:06阅读更多 →
Kadowaki-Woods 关系的两条普适化之路

Kadowaki-Woods 关系的两条普适化之路

一个比值,两个维度。自 1986 年 Kadowaki 和 Woods 发现重费米子化合物的 A/γ 比值具有普适性以来,这一关系一直是费米液体理论最有力的实验证据。然而,随着实验数据跨越七个数量级,越来越多的体系偏离了这一"普适"关系…

2026/7/4 2:53:06阅读更多 →
2026最新2款AI编程工具基础版免费平替之选权威实测合集

2026最新2款AI编程工具基础版免费平替之选权威实测合集

一、开篇:双工具长期实测,直观梳理核心差异这次对比的起因很偶然:5 款 AI 编程工具都在同一周发布了大版本更新,我趁机做了一次同条件下的横评。 我是一名从外包转自研的后端开发者,2026年6月负责代号POINT-MALL12积分…

2026/7/4 2:53:06阅读更多 →
CSDN首页发布文章CSDN同步助手基于最优滑模控制的永磁同步电机调速系统模型研究(Simulink仿真实现)37 / 100永磁同步电机凭借高功率密度、高效率、低损耗及结构紧凑等突

CSDN首页发布文章CSDN同步助手基于最优滑模控制的永磁同步电机调速系统模型研究(Simulink仿真实现)37 / 100永磁同步电机凭借高功率密度、高效率、低损耗及结构紧凑等突

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…

2026/7/4 2:53:06阅读更多 →
AI Agent网页操作瓶颈解析:三大浏览器自动化工具深度对比与实战

AI Agent网页操作瓶颈解析:三大浏览器自动化工具深度对比与实战

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在开发一个需要自动操作网页的AI Agent项目,团队里最资深的工程师盯着屏幕,眉头紧锁。他刚刚又收到一条告…

2026/7/4 2:53:06阅读更多 →
测试转大模型:AI 测试工程师的能力跃迁,用业务场景检验技术取舍

测试转大模型:AI 测试工程师的能力跃迁,用业务场景检验技术取舍

聊《测试转大模型:AI 测试工程师的能力跃迁,用业务场景检验技术取舍》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要这篇面向想进入 AI 测试和质量工程方向的软件测试工程师&#xff0c…

2026/7/4 2:48:06阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/3 14:18:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/3 14:38:35阅读更多 →
端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

1. 项目概述:当算法工程师走进GTC26展厅,看到的不是芯片,而是“端到端”的呼吸节奏“端到端”这三个字,在GTC’26现场出现的频率,高得像NVLink带宽测试时的峰值曲线——它不再是一个论文里的技术路径选项,而…

2026/7/4 0:02:48阅读更多 →
缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考牙齿缺失是中老年人群中较为常见的口腔问题,不仅会造成咀嚼不便、进食受影响,长期还可能对营养摄入与日常社交带来困扰。义齿是改善缺牙问题的常用方式,目前市面上的义齿种类较多,…

2026/7/4 0:02:48阅读更多 →
STM32F091RC与LTC6904实现高精度方波信号生成

STM32F091RC与LTC6904实现高精度方波信号生成

1. 项目概述:LTC6904与STM32F091RC的精准方波生成方案在嵌入式系统开发中,精确的时钟信号和定时控制往往是项目成败的关键。LTC6904作为一款低功耗、高精度的可编程振荡器芯片,与STM32F091RC这款ARM Cortex-M0内核微控制器的组合,…

2026/7/4 0:02:48阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/4 1:16:56阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →