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

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获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

对postgresql日期和时间的比较

《对postgresql日期和时间的比较》文章介绍了在数据库中处理日期和时间类型时的一些注意事项,包括如何将字符串转换为日期或时间类型,以及在比较时自动转换的情况,作者建议在使用数据库时,根据具体情况... 目录PostgreSQL日期和时间比较DB里保存到时分秒,需要和年月日比较db里存储date或者ti

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r