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

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

相关文章

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基

JavaScript时间戳与时间的转化常用方法

《JavaScript时间戳与时间的转化常用方法》在JavaScript中,时间戳(Timestamp)通常指Unix时间戳,即从1970年1月1日00:00:00UTC到某个时间点经过的毫秒数,下面... 目录1. 获取当前时间戳2. 时间戳 → 时间对象3. 时间戳php → 格式化字符串4. 时间字符