极客时间-左耳听风-软件开发与架构设计的原则

2024-01-23 22:28

本文主要是介绍极客时间-左耳听风-软件开发与架构设计的原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

软件开发与架构设计的原则

PS:内容为左耳听风的读书笔记,该节内容多为作者职业生涯的总结,平时需要反复提醒自己,细看内容其实有很多需要慢慢体会。

软件开发

不重复性

只要相似的代码出现不止一处,就必须将其共性抽象出来,形成唯一的方法

KISS原则

大道至简原则,例如宜家简约且高效的设计和生产方式

面向接口而非实现原则

  1. 注重接口而非实现,依赖接口而非实现
  2. 组合优于继承

命令查询分离原则

当一个方法通过返回一个值来响应一个请求的时候,就具有查询的性质
当一个方法要改变对象状态的时候,就具有命令的性质
在设计时应该尽量使接口单一化,保证方法的行为严格限于命令或者查询

按需设计的原则

只设计必需的功能,避免过度设计;只实现目前需要的功能,以后需要的功能以后再添加

迪米特法则

最少知识原则,概括为不要和陌生人讲话

正式表述为:对象O中的一个方法M,应该只能访问以下对象中的方法:

  • 对象O
  • 与O直接相关的组件对象
  • 由方法M创建或实例化的对象
  • 作为方法M的参数的对象

SOLID原则

  1. 单一职责原则:一个类应该只承担一个职责,并且应该把这个职责尽可能地履行好,是高内聚低耦合原则的引申
  2. 开闭原则:模块应该可扩展但不可修改,模块对扩展开放,而对修改封闭
  3. 里氏代换原则:子类型必须能够替换父类型
  4. 接口隔离原则:在接口中而不是在类中实现功能,而且使用多个专门的接口比单一的总接口更好
  5. 依赖倒置原则:高层模块不应该依赖于低层模块的实现,而应该依赖于高层的抽象

共同封闭原则

一个包中所有的类应该对同一种类型的变化关闭。简单而言,一起修改的类应该组合在同一个包中

共同重用原则

不应该将未被重用的类和重用的类组合在一起

好莱坞原则

控制反转或依赖注入DI

高内聚低耦合

约定优于配置原则

约定优于配置原则倡导一些公认的配置方式和信息作为内部的默认规则来使用

关注点分离

在软件开发中通过各种手段将问题的各个关注点分开。一个问题被分解为独立且较小的问题时往往更容易得到解决。

契约式设计原则

对于类的一个方法,其契约中都存在一个前提条件以及后续条件

前提条件用于说明方法接受什么样的参数数据
后续条件说明这个方法完成时的状态
即:期望的是什么,要保证的什么,要保持的是什么?

无环依赖原则

解决了包之间的关系耦合问题

架构设计

关注收益而不是技术

  • 降低技术门槛,加快整个团队的开发效率
  • 让整个系统运行得稳定 → 需要对有计划和无计划的宕机提出相应的解决方案
  • 通过简化和自动化来降低成本

如果系统架构不能在以上三点发挥作用,就没有意义了

以服务和API为视角

公司存在运维和开发两个角色,需要有统一的视角和目标即从服务和API的角度看问题(作为后端开发需要学习并掌握K8s)

选择主流和成熟的技术

大部分情况下选择Java没错

完备性比性能重要

  • 优先使用科学,严谨的技术模型,只以不严谨的模型作为补充,例如用ACID的关系数据库,然后用NoSQL做补充
  • 不必过分担心性能问题

制定并遵循标准规范

  • 服务间调用的协议标准和规范:Restful API路径,状态码等等
  • 一些命名的标准和规范
  • 日志和监控的规范:日志格式,监控数据,采样要求,日志报警等等
  • 配置的规范:操作系统配置,中间件配置,软件包配置等
  • 中间件使用规范
  • 软件和开发库版本最好在整个组织架构内每年升级,然后在团队内保持统一

重点强调:

  1. Restful API的规范非常重要
  2. Zipkin链路追踪,监控系统宁愿瘫痪也不干扰业务应用
  3. 每年至少要有一次软件版本升级的评审

重视可扩展性和可维护性

  1. 通过服务编排来降低服务之间的耦合
  2. 通过服务发现或服务网关来降低服务依赖带来的运维复杂度
  3. 遵循软件设计原则和最佳实践 → SOLID,SOA或Spring Cloud等架构的实践

对控制逻辑全面收口

控制逻辑:是用来决定程序是多线程还是分布式,使用数据库还是文件,以及如何实现配置,部署,运维,监控,事务控制,服务发现,弹性收缩,灰度发布,高并发等。

不要迁就技术债务

  1. 使用老旧技术
  2. 不合理的设计
  3. 缺少配套设施

不要依赖经验

  1. 用足够多的时间查找相关资料
  2. 收集,对比各家公司或开源世界的做法
  3. 比较各种方案的优点后形成自己的决策

提防与应对X-Y问题

实际上遇到的问题是X,却误认为需要解决Y,追问原始需求可以帮助我们找到真正的问题。

对新技术激进胜于保守

这篇关于极客时间-左耳听风-软件开发与架构设计的原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/637717

相关文章

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时