[温故知新] 编程原则和模式

写了这么多年代码,依旧做不好一个项目

做好一个项目是人力产品业务技术运营的结合,可能还叠加一点时机的因素,就我们码农而言,工作就是搬砖,实现产品, 给业务提供支撑。
“给祖传代码加 BUG 修 BUG”,“拿起键盘一把梭”这些戏谑程序员的话,听多了真的会让程序员麻木,仿佛大家都是这么干的。
从业多年,堆过 shi 山,接手过祖传代码, 已经不能沉下气去查看、调试 shi 山代码, 说实话,很累。
本人一直推崇写流畅、自然、可自解释的代码,让优雅成为一种习惯, 给自己留个念想、给后人留个好评。

温故而知新,聊一聊现代编程几大常见的编程原则

普世原则
KISS (Keep It Simple Stupid)保持系统结构简单可信赖
YAGNI (you aren't gonna need it)当前确实需要,再去做
Do The Simplest Things That Could Possibly Work思考最简单可行的办法
Separation of Concerns关注点分离
Keep Things DRY保持代码结构清爽 Don't repeat yourself
Code For The Maintainer站在维护者角度写代码
Avoid Premature Optimization避免提前优化
Boy-Scout Rule清扫战场:清理口水话注释、无效代码

模块(类)间
Minimise Coupling低耦合
Law of DemeterDon't talk to strangers,对象方法只接触该接触的对象、字段、入参
Composition Over Inheritance组合而不是继承
Orthogonality正相关,概念上不相关的事物不应在系统中强行相关
Robustness Principle代码健壮性
Inversion of Control控制反转

模块(类)
Maximise Cohesion高内聚
Likov Substitution Principle里斯替代原则:将程序中对象替换到子类型实例,不会报错。
Open/Closed Principle设计的实体对扩展开放,对修改关闭
Single Responsiblity Principle单一责任原则
Hide Implementation Details隐藏实施细节
Curly's Law柯里定律:为确定目标编写特定代码
Encapsulate What Changes封装变化
Interface Segregation Principle接口隔离原则
Command Query Separation命令查询分离

KISS
大多数系统保持简单,会运行的很好。

  • 更少的代码消耗更好的时间,产生更少的 bug,并且容易修改

  • 复杂业务都是由简单代码堆砌而成

  • 完美并不是“没有什么东西可以再加”,而是“没有什么东西可以被去掉”

YAGNI
YAGNI 代表“you aren't gonna need it.”,不要自以为是的提前实现某些边角,直到真正需要的时候,再来做。

  • 提前做明天才需要做的工作,意味着当前迭代中需要花费更多精力

  • 导致代码膨胀,软件变得臃肿且复杂

Separation of Concerns
关注点分离是一种将计算机程序分为不同部分的设计原则,这样每个部分都可以解决一个单独的关注点。例如应用程序的业务逻辑是一个问题,而用户界面是另外一个问题,更改用户界面不应要求更改业务逻辑,反之亦然。

  • 简化应用程序的开发和维护

  • 如果关注点分离得很好,则各个部分可以重复使用,也可以独立开发和更新。

Interface Segregation Principle
接口隔离,将胖接口修改为多个小接口,调用接口的代码应该比实现接口的代码更依赖于接口
why:如果一个类实现了胖接口的所有方法(部分方法在某次调用时并不需要),那么在该次调用时我们就会发现此时出现了(部分并不需要的方法),而并没有机制告诉我们我们现在不应该使用这部分方法。
how: 避免胖接口,类永远不必实现违反单一职责原则的接口。可以根据实际多职责划分为多接口,类实现多接口后, 在调用时以特定接口指代对象,这样这个对象只能体现特定接口的方法,以此体现接口隔离。

   public interface IA{void getA();}interface IB{void getB();}public class Test : IA, IB{public string Field { get; set; }public void getA(){throw new NotImplementedException();}public void getB(){throw new NotImplementedException();}}class Program{static void Main(string[] args){Console.WriteLine("Hello World!");IA a = new Test();a.getA();       //  在这个调用处只能看到接口IA的方法, 接口隔离}}

Command Query Separation
命令查询分离: 操作方法就只写操作逻辑,查询方法就只写查询逻辑,并以明显的方法名区分自己的动作。
有了这个原则,程序员可以更加自信地进行编码:由于查询方法不会改变状态,因此可以在任何地方以任何顺序使用,使用操作方法时,也心中有数。

End

懂得这么多道理,却依旧过不好这一生。前人总结的编程原则和方法论需要在实践中感悟,束之高阁,则始终不能体会编程的魅力和快感。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA中快捷键大全+出现的问题

参照 文章目录1.Ctrl2.Alt3.Shift4.Ctrl Alt5.Ctrl Shift6.Alt Shift7.Ctrl Shift Alt8.其他idea如何将设置包名展开当出现右键,没有创建包选项时idea没有maven图标安装mysql和idea配置idea查看代码的最近修改人及时间1.Ctrl 快捷键介绍Ctrl F在当前文件进行…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八)

系列文章使用 abp cli 搭建项目给项目瘦身,让它跑起来完善与美化,Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API,包装返回模型再说Swagger,分组、描述、小绿锁接入GitHub,用JWT保护你的API异常处理和…

[数据结构-严蔚敏版]P95矩阵压缩-特殊矩阵的存储(对称矩阵,三角矩阵)

对称矩阵的存储&#xff1a; 代码如下: #include <iostream> using namespace std;int main() {int n;cin >> n;int *a;a new int[(n*(n 1)) / 2];for (int i 0; i < (n*(n 1)) / 2; i){cin >> a[i];}for (int i 1; i < n; i){for (int j 1; j…

微前端与项目实施方案研究

一、前言微前端(micro-frontends)是近几年在前端领域出现的一个新概念&#xff0c;主要内容是将前端应用分解成一些更小、更简单的能够独立开发、测试、部署的小块&#xff0c;而在用户看来仍然是内聚的单个产品。微前端的理念源于微服务&#xff0c;是将庞大的整体拆成可控的小…

ASP.NET Core分布式项目实战(集成ASP.NETCore Identity)--学习笔记

任务24&#xff1a;集成ASP.NETCore Identity之前在 Index 页面写了一个 strong 标签&#xff0c;需要加个判断再显示&#xff0c;不然为空没有错误的时候也会显示if (!ViewContext.ModelState.IsValid) {<strong>Error""</strong><div asp-validatio…

Java中关于省略作用域报错问题分析

这个是很典型的作用域问题&#xff0c;if后如果省略那么if只作用于其后面的第一行代码 这时候如果这行代码只是个变量声明语句的话&#xff0c;这个变量是没有其他任何逻辑可以访问到的&#xff0c;因为作用域问题(如果有/&#xff0c;那么声明语句中声明的变量只在这个个内可用…

C#9就这么来了,.NET开发者该做点什么?

就在上周三10号&#xff0c;.NET5.0发布了第5个预览版&#xff0c;同时支持了C#9-preview&#xff01;是的&#xff0c;你没看错&#xff0c;虽然C# 8.0还未正式发布&#xff0c;但是通往C&#xff03;9的漫长道路却已经开始&#xff0c;这发展速度简直了&#xff01;C#语言的快…

Magicodes.IE在.NET Core中通过请求头导出多种格式文件

原文作者&#xff1a;HueiFeng前言在2.2里程碑中我们增加了一些新的功能,正如标题所写通过请求头进行导出我们不同格式的文件.下面我们来看一下如何使用.通过这种方式无论是对我们的数据多用途&#xff0c;还是说对我们的数据校验都做到了轻松易配。同时我们也将在本周发布2.3版…

使用DQL查询数据

文章目录DQL语言SELECT语法制定查询字段AS 子句作为别名DISTINCT关键字的使用使用表达式的列where条件语句逻辑操作符模糊查询 &#xff1a; 比较操作符连接查询JION自连接排序和分页子查询DQL语言 DQL( Data Query Language 数据查询语言 ) 查询数据库数据 , 如SELECT语句简…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

SilkierQuartz 1.0.21 发布, 是一个 Quartz.NET 的强大且简单的Web管理工具和承载组件...

SilkierQuartz 是一个新的合并了 Quartzmin 和 QuartzHostedService的组件!Quartz.NET 是一个完整的开源的任务规划系统&#xff0c;从小应用至大型企业级应用都可以适用.Quartzmin Quartzmin 是一个 Quartz.NET 的强大且简单的Web管理工具QuartzHostedService QuartzHostedSer…

用C#在STM32上写第一个Hello world

随着微软放弃.Net MF ,通过C#编写STM32 平台上的程序变得渺茫&#xff0c; 但是&#xff0c; 别着急&#xff0c; 目前至少有两个社区在做这件事情&#xff0c; 传承了微软的.Net MF , 一家是 nanoframework,另外一家比较封闭的是 GHI Electronics 地址是: https://github.com/…

如何找到Eclipse左侧项目栏

如何找到Eclipse左侧项目栏 window --> Show View --> other --> Java–> package Explorer

深入async/await知多少

.net的async/await功能相信对很多人来说并不陌生了&#xff0c;有人感觉这功能很好&#xff0c;但也有人说这功能不好容易产生一些莫名其妙的死锁&#xff1b;有人说这些异步功能也有人说这是同步功能。其实在使用async/await的有多少人真的了解它们呢&#xff1f;接下来详细地…

微软正式发布 gRPC-Web for .NET

今年一月份的时候&#xff0c;微软曾宣布对 gRPC-Web for .NET 的实验性支持微软实验性地对 .NET 支持 gRPC-Web&#xff0c;现在它已正式发布。gRPC 是谷歌开源的高性能、通用 RPC 框架&#xff0c;支持包括 .NET 在内的多种编程语言。它面向移动和基于 HTTP/2 标准设计&#…

Java多线程(review)

文章目录线程状态线程方法线程停止线程休眠——sleep网络延时模拟倒计时与打印当前系统时间线程礼让——yield线程强制执行——Join线程状态线程优先级守护线程不安全案例死锁Lock锁线程状态 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后&#xff0c;该线…

利用Azure Functions和k8s构建Serverless计算平台

题记&#xff1a;昨晚在一个技术社区直播分享了“利用Azure Functions和k8s构建Serverless计算平台”这一话题。整个分享分为4个部分&#xff1a;Serverless概念的介绍、Azure Functions的简单介绍、k8s和KEDA的介绍和最后的演示。ServerlessServerless其实包含了两种概念&…

基于 abp vNext 和 .NET Core 开发博客项目 - 终结篇之发布项目

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

对 JsonConvert 的认识太肤浅了,终于还是遇到了问题

一&#xff1a;背景1. 讲故事在开始本文之前&#xff0c;真的好想做个问卷调查&#xff0c;到底有多少人和我一样&#xff0c;对 JsonConvert 的认识只局限在 SerializeObject 和 DeserializeObject 这两个方法上(┬&#xff3f;┬), 这样我也好结伴同行&#xff0c;不再孤单落…

.Net微服务实战之DevOps篇

技术只是基础该系列的两篇文章《.Net微服务实战之技术选型篇》和《.Net微服务实战之技术架构分层篇》都是以技术角度出发描述微服务架构的实施。如果技术选型篇叙述的是工具&#xff0c;那么架构分层篇讲的就是技巧&#xff0c;而本篇要讨论的就是原则。一直以来我会给身边向我…