架构师必须掌握的 10 条设计原则

转载自  架构师必须掌握的 10 条设计原则

01、 遵循单一职责原则

函数是程序员的工具中最重要的抽象形式。它们能更多地被重复使用,你需要编写的代码就越少,代码也因此变得更可靠。较小的函数遵循单一职责原则更有可能被重复使用。

02、 尽量减少共享状态

你应该尽量减少函数之间的隐式共享状态,无论它是文件作用域的变量还是对象的成员字段,这有利于明确要求把值作为参数。当能明确地显示函数需要什么才可以产生所需的结果时,代码会变得更容易理解和重用。

对此的一个推论是,在一个对象中,相对于成员变量,你更应该优先选择静态的无状态变量 (static stateless variables)。

03、将“副作用”局部化

理想的副作用(例如:打印到控制台、日志记录、更改全局状态、文件系统操作等)应该被放置到单独的模块中,而不是散布在整个代码里面。函数中的一些“副作用”功能往往违反了单一职责原则。

04、优先使用不变的对象

如果一个对象的状态在其构造函数中仅被设置一次,并且从不再次更改,则调试会变得更加容易,因为只要构造正确就能保持有效。这也是降低软件项目复杂性的最简单方法之一。

05、接口高于类 

接收接口的函数(或 C++ 中的模板参数和概念)比在类上运行的函数更具可重用性。点击这里查看 6 大设计原则。

06、对模块应用良好的原则

寻找机会将软件项目分解成更小的模块(例如库和应用程序),以促进模块级别的重用。对于模块,应该遵循的一些关键原则是:

1.尽可能减少依赖

2.每个项目应该有一个明确的职责

3.不要重复自身

你应该努力使你的项目保持小巧和明确。

07、避免继承

在面向对象编程中,继承 —— 特别是和虚拟函数结合使用时,在可重用性方面往往是一条死胡同。我很少有成功的使用或编写重载类的库的经历。

08、将测试作为设计和开发的一部分

我不是测试驱动开发的坚定分子,但开始编码时先编写测试代码会使得代码十分自然地遵循许多指导原则。这也有助于尽早发现错误。不过要注意避免编写无用的测试,良好的编码实践意味着更高级别的测试(例如单元测试中的集成测试或特征测试)在揭示缺陷方面更有效。

09、 优先使用标准的库

我经常看到更好版本的 std::vector或 std::string ,但这几乎总是浪费时间和精力。一个明显的事实是 —— 你正在为一个新的地方引入 bug,其他开发者也不太可能重用你的代码,因为没有被广泛理解、支持和测试。

10、 避免编写新的代码

这是每个程序员都应遵循的最重要的教诲:最好的代码就是还没写的代码。你写的代码越多,你将遇到的问题就越多,查找和修复错误就越困难。

 

在写一行代码之前先问一问自己,有没有一个工具、函数或者库已经实现了你所需要的功能?你真的需要自己实现这个功能,而不是调用一个已经存在的功能吗?

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

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

相关文章

《四世同堂》金句摘抄(六)

System.out.println("这两天还是读的《四世同堂》"); System.out.println("这本书好长啊"); System.out.println("不断的听,不断的看,才到1000多页");今天的金句摘抄: 她翻滚的闹,整桶的流泪&…

[翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Visual Studio

Visual Studio vs虽然不是全宇宙唯一的IDE,但它是.net开发人员最常用的开发工具。它自带一个性能分析工具,你可以使用它来做开发,不同的vs版本在工具上会略有差别。 VS可以分析CPU使用率,内存分配以及资源锁情况。它能在你开发与…

Java 程序员必备的 Intellij IDEA 插件

转载自 Java 程序员必备的 Intellij IDEA 插件 来源:柠檬学园 以下是我用过不错的Intellij插件,分享给大家希望能帮到大家。 1. .ignore 地址:https://plugins.jetbrains.com/plugin/7495--ignore 生成各种ignore文件,一键创建g…

表单中去掉重置和提交按钮和搜索框

去掉重置和提交按钮 <ProFormsubmitter{{// 配置按钮文本searchConfig: {resetText: 重置,submitText: 提交,},// 配置按钮的属性resetButtonProps: {style: {// 隐藏重置按钮display: none,},},submitButtonProps: {},// 完全自定义整个区域render: (props, doms) > {c…

《四世同堂》金句摘抄(七)

System.out.println("这两天还是读的《四世同堂》"); System.out.println("这本书好长啊"); System.out.println("不断的听&#xff0c;不断的看&#xff0c;才到1000多页"); System.out.println("这几天没有好好的读&#xff0c;追求了速度…

ASP.NET 开发者 开始学习ASP.NET Core 2吧

.NET Core 从2016年6月28日发布&#xff0c;过去了将近一年的时间&#xff0c;但是在工作中发现大家对.net core的接受程度并不高&#xff0c;这只是一个感觉&#xff0c;俗话说“没有调查就没有发言权”&#xff0c; 这两天通过微信小程序在微信群里做了一个调查&#xff0c;参…

Spring Boot Redis Cluster 实战干货

转载自 Spring Boot Redis Cluster 实战干货 添加配置信息 spring.redis:database: 0 # Redis数据库索引&#xff08;默认为0&#xff09;#host: 192.168.1.8#port: 6379password: 123456timeout: 10000 # 连接超时时间&#xff08;毫秒&#xff09; pool: max-active: 8 #…

《四世同堂》金句摘抄(八)

System.out.println("这两天还是读的《四世同堂》"); System.out.println("这本书好长啊"); System.out.println("不断的听&#xff0c;不断的看&#xff0c;才到1000多页"); System.out.println("这几天没有好好的读&#xff0c;追求了速度…

编写高性能 .NET 代码 第一章:工具介绍 -- Performance Counters(性能计数器)

Performance Counters&#xff08;性能计数器&#xff09; 性能计数器是监视应用程序和系统性能的最简单的方法之一。它有几十个类别数百个计数器在&#xff0c;包括一些.net特有的计数器。要访问这些可以通过系统自带的 性能监控程序&#xff08;perfmon.exe&#xff09;来实…

java后台手动分页

单个实体类 Integer pageNumber po.getPageNumber();Integer pageSize po.getPageSize();Integer last pageNumber * pageSize;if ((pageNumber * pageSize)>weekResultInfoVOS.size()){lastweekResultInfoVOS.size();}int size weekResultInfoVOS.size();List<Week…

超详细的 Redis Cluster 官方集群搭建指南

转载自 超详细的 Redis Cluster 官方集群搭建指南 今天从 0 开始搭建 Redis Cluster 官方集群&#xff0c;解决搭建过程中遇到的问题&#xff0c;超详细。 安装ruby环境 因为官方提供的创建集群的工具是用ruby写的&#xff0c;需要ruby2.2.2版本支持&#xff0c;ruby安装需…

《四世同堂》金句摘抄(九)

System.out.println("这两天还是读的《四世同堂》"); System.out.println("这本书好长啊"); System.out.println("不断的听&#xff0c;不断的看&#xff0c;才到1000多页"); System.out.println("这几天没有好好的读&#xff0c;追求了速度…

EF通用数据层封装类(支持读写分离,一主多从)

浅谈orm 记得四年前在学校第一次接触到 Ling to Sql&#xff0c;那时候瞬间发现不用手写sql语句是多么的方便&#xff0c;后面慢慢的接触了许多orm框架&#xff0c;像 EF&#xff0c;Dapper,Hibernate,ServiceStack.OrmLite 等。当然每种orm都有各自的优势&#xff0c;也有不足…

前端进行时间段筛选

传给后端参数时进行格式化 weekResultTimeStart:params.insertTime!null?moment(params.insertTime[0]).format(YYYY-MM-DD HH:mm:ss):null,weekResultTimeEnd:params.insertTime!null?moment(params.insertTime[1]).format(YYYY-MM-DD HH:mm:ss):null,注意点&#xff1a; 前…

Java中的常量池(字符串常量池、class常量池和运行时常量池)

转载自 Java中的常量池(字符串常量池、class常量池和运行时常量池) 简介&#xff1a; 这几天在看Java虚拟机方面的知识时&#xff0c;看到了有几种不同常量池的说法&#xff0c;然后我就去CSDN、博客园等上找资料&#xff0c;里面说的内容真是百花齐放&#xff0c;各自争艳&…

《四世同堂》金句摘抄(十)

System.out.println("这两天还是读的《四世同堂》"); System.out.println("这本书好长啊"); System.out.println("不断的听&#xff0c;不断的看&#xff0c;才到1000多页"); System.out.println("这几天没有好好的读&#xff0c;追求了速度…

IdentityServer4(OAuth2.0服务)折腾笔记

以下&#xff0c;称这个使用了IdentityServer4的OAuth2.0服务的项目称为Passport项目。 组件说明&#xff08;Nuget&#xff09; Passport项目所需组件 项目以Asp.net Core Identity项目模板初始化&#xff0c;集成IdentityServer4中间件&#xff1b;集成IdentityServer4.AspN…

map遍历进行展示

{userList.map((item,index)> <Option key{index} value{item.userId}>{item.realName||null}</Option>)||null}

Vue.js基础体验(一)

今天开始学习Vue.js啦&#xff0c;刚开始看起来&#xff0c;确实很难很难&#xff0c;但是经过一番“周折”&#xff0c;发现也就那样&#xff0c;没有想象的那么难。 下面是今天记录的代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"…