[温故知新] 编程原则和模式
写了这么多年代码,依旧做不好一个项目
做好一个项目是人力
、产品
、业务
、技术
、运营
的结合,可能还叠加一点时机的因素,就我们码农而言,工作就是搬砖,实现产品, 给业务提供支撑。
“给祖传代码加 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 Demeter | Don'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
懂得这么多道理,却依旧过不好这一生。前人总结的编程原则和方法论需要在实践中感悟,束之高阁,则始终不能体会编程的魅力和快感。
[温故知新] 编程原则和模式相关推荐
- 设计模式所遵循的原则及模式之间的关系
总原则:开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果.所以一句话 ...
- 超级干货:你应该知道的那些编程原则!!
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Mouse 来源 | http://r6d.c ...
- 程序员能力提升:你应该知道的那些编程原则!!
本文翻译自Programming Principles(http://java-design-patterns.com/principles/). 每个程序员都可以从理解编程原理和模式中受益.这篇概述 ...
- 对《敏捷软件开发:原则、模式与实践》中保龄球程序重构的一些思考
前几天看了<敏捷软件开发:原则.模式与实践>中第六章:一次编程实战,文章中主要描述了一对开发人员进行一次记录保龄球比赛成绩程序的开发过程.仔细研究之后,发现一个问题,拿出来和大家讨论讨论. ...
- 《敏捷软件开发:原则、模式与实践(C#版.修订版)》—第1章1.4节参考文献
本节书摘来自异步社区<敏捷软件开发:原则.模式与实践(C#版.修订版)>一书中的第1章1.4节参考文献,作者[美]Robert C. Martin , Micah Martin,更多章节内 ...
- python的编程模式-实例解析Python设计模式编程之桥接模式的运用
这篇文章主要介绍了Python设计模式编程之桥接模式的运用,桥接模式主张把抽象部分与它的实现部分分离,需要的朋友可以参考下 我们先来看一个例子: #encoding=utf-8 # #by panda ...
- javascript 面向对象编程(工厂模式、构造函数模式、原型模式)
javascript 面向对象编程(工厂模式.构造函数模式.原型模式) CreateTime--2018年3月29日17:09:38 Author:Marydon 一.工厂模式 /*** 工厂模式*/ ...
- 每个程序员都必须遵守的编程原则
好的编程原则跟好的系统设计原则和技术实施原则有着密切的联系.下面的这些编程原则在过去的这些年里让我成为了一名优秀的程序员,我相信,这些原则对任何一个开发人员来说,都能让他的编程能力大幅度的提高,能让他 ...
- 《.NET应用架构设计:原则、模式与实践》新书博客--试读-持续更新
新书目录: 前言 第一部分 架构与设计的原则和模式 第1章 架构与设计的流程和核心概念/2 1.1 正确认识软件架构/2 1 ...
最新文章
- windows核心编程-第二章 Unicode
- 机器学习笔记:RMSProp,Adadelta
- halcon资料链接
- mfc切换office样式_干货搬运工|计算机二级office必读,裸考也能通关的宝典
- 针对Mysql数据库服务器的优化
- android p随机mac,android设备唯一码的获取,cpu号,mac地址
- PTA 程序设计天梯赛(101~120题)
- 中国期货交易技术的逆袭之路
- 真彩色与伪彩色的概念
- 计算机ppt幻灯片设计主题,如何设置幻灯片主题样式,如何设置幻灯片主题为流畅...
- linux 服务器远程开机,Linux 下实现远程开机
- 16S rDNA测序和宏基因组测序区别
- 一个在线运行的Taro小程序完整实例
- word文档中把几个图形组合在一起
- UICollectionView基本使用详解(OC)
- 基于SpringBoot的网上电影票购买系统设计与实现
- 计算机日常英语句子,计算机英语句子
- Grpc学习之map变量
- 用1、2、3、4、5、6、7、8、9这9个数字,填入□ 中使等式□□×□□□ = □□□□ 成立,每个数字恰好只用一次。
- 浅议抖音短视频平台的利与弊
热门文章
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
- 2016福州大学软件工程第四次团队作业-系统设计成绩汇总
- 类属性和实例属性冲突
- hadoop:could only be replicated to 0 nodes, instead of 1
- 如何从USB运行Windows 8 Developer Preview
- Mysql-高可用集群[MyCat中间件使用](三)
- 构建Squid代理服务器-传统代理、透明代理、反向代理
- Serv-U服务器的管理3
- java的linux执行的shell
- thinkphp 3.2 unionall