软件设计原则 KISS、YAGNI、DRY

news2024/9/25 3:27:12

软件设计原则 KISS、YAGNI、DRY

flyfish

设计模式、设计原则与编程惯用法综述

在这里插入图片描述图片来源SpaceX
简约至极的猛禽3(Raptor 3)火箭发动机

一、KISS (Keep It Simple, Stupid!, 保持简单)

KISS原则,即“Keep it simple, stupid!”(保持简单,傻瓜!)是一个设计原则。
在软件开发中,KISS 原则是“Keep It Simple, Stupid ”的缩写,意思是“保持简单,笨蛋”。

设计和实现应追求简单,而不是为了增加功能而使系统复杂化。简单的系统通常更易于维护和调试。
避免引入不必要的复杂逻辑和功能,聚焦于当前需求。复杂度的增加会导致更高的错误风险和维护成本。
代码和系统设计应清晰易懂,以便其他开发人员或将来的自己能够轻松理解和修改。
简单的设计通常意味着更少的依赖关系和更清晰的结构,使得系统更容易维护和扩展。

可以实践的方法

在开发过程中,优先实现产品的核心功能,而不是一次性加入所有可能的功能。随着用户反馈的到来,逐步迭代和增加新功能。
使用模块化的方法来设计系统,使得每个模块只负责一个单一的功能,模块之间的依赖关系尽量简单明了。
在设计阶段,应关注实际需求,避免为解决潜在的或未来的假想问题而过度设计系统。
在编码时,采用清晰、直接的编码风格,避免使用不必要的复杂语言特性和技巧

一些极简主义概念

这一原则可能源于类似的一些极简主义概念,例如:
奥卡姆剃刀原理;
“简约即是极致的精致”;
“简洁是智慧的灵魂”;
“少即是多”;
“让简单的任务变得简单!”;
“一个作者若制造出比实际需要更多的文字,那么他就是在给读者制造麻烦。”
“足球很简单,但简单地踢球却是最难的事情。”
“完美不在于无物可增,而在于无物可减。”
“先简化,再减轻重量”。
“尽可能使一切变得简单,但不要过于简单。”
“简化、简化、简化”
“扩张意味着复杂化,而复杂化意味着衰败;或者更直白地说——越复杂,死得越快。”

二、YAGNI(You Aren’t Gonna Need It, 你不需要它)

Gonna是一个非标准的英语口语缩写词,它来源于 “going to”,意为 “将要” 或 “打算”
YAGNI(You Aren’t Gonna Need It,即“你不需要它”)是一种软件开发原则,鼓励开发人员避免在系统中添加未明确需要的功能。其核心思想是避免过早添加不必要的功能,以免增加系统的复杂性、延长开发时间以及可能引入更多的错误。YAGNI原则来源于极限编程(Extreme Programming)。

为什么开发者应该遵循 YAGNI 原则

通过只实现当前需要的功能,开发人员可以避免浪费时间和资源,进而提高开发效率、减少复杂性并提高代码的可维护性。

全是成本原因

构建不必要的功能会消耗时间、精力和资源,包括计划、编码和测试。如果这些功能最终被证明是不需要的,那开发成本就成了浪费。
开发不必要的功能会占用时间,从而延迟更重要功能的实现,导致错失商业机会或其他收益。
不必要的功能会增加软件的复杂性,给后续开发和维护带来额外的负担。
添加多余的功能可能会引入错误或糟糕的设计决策,后期的修复和调整会产生额外的时间和资源成本。

可以实践的方法

获取必要需求:明确项目需要的功能,将其分类为“必须有的”和“可以等待的”,专注于当前所需。
与团队讨论:与团队分享计划和目标,确保大家步调一致。
制定简单计划:将大目标分解为小任务,保持计划的简单性。
拒绝不合适的功能:面对新的功能请求,除非是很小的改进,否则要学会说“不”,以免偏离重点。
记录进度:保持对项目进度的记录,帮助追踪和验证项目方向的正确性。

三、DRY(Don’t Repeat Yourself, 不重复自己)

为什么要遵循 DRY 原则

DRY(Don’t Repeat Yourself)原则 是软件开发中重要的设计理念,旨在通过减少代码的重复,提高软件的效率和可维护性。

1 如果代码在不同地方多次出现,一旦需要修改,就必须在所有地方都进行修改,否则容易导致不一致和错误。将重复的代码提取成一个函数或模块,只需在一个地方进行修改即可,减少出错的可能性。

2 代码中的重复部分少了,维护起来就更容易,修改代码时不需要担心遗漏某个重复的地方。没有重复的代码,逻辑更加清晰,开发者能够更容易地理解和更新代码。

3 精简的代码更容易阅读和理解,其他开发者能够快速掌握代码的功能和目的。通过模块化设计消除重复代码,逻辑层次更加分明。

4 将通用的功能提取成模块,可以在多个项目中重复使用,节省开发时间。
不需要为类似的功能编写多段代码,可以复用已经写好的模块。

可以实践的方法

实践 DRY(Don’t Repeat Yourself)原则主要涉及在软件开发过程中识别和消除代码的重复。

1. 抽取公共代码

函数/方法提取 :将重复出现的代码块提取到单独的函数或方法中。这样,如果需要修改这段逻辑,只需在一个地方进行更改。

# Before DRY
result1 = a + b + c
result2 = d + e + f

# After DRY
def add_three_numbers(x, y, z):
    return x + y + z

result1 = add_three_numbers(a, b, c)
result2 = add_three_numbers(d, e, f)

2. 使用模块和类

模块化设计 :将相关的功能封装到模块中,方便在不同项目中复用。
面向对象编程 :通过类和对象来封装数据和行为,将相似的逻辑集中到一个类中。

# Before DRY
def calculate_area_circle(radius):
    return 3.14 * radius * radius

def calculate_circumference_circle(radius):
    return 2 * 3.14 * radius

# After DRY
class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

    def circumference(self):
        return 2 * 3.14 * self.radius

3. 参数化配置

使用参数化 :通过参数化来消除硬编码的重复代码,使得代码更加灵活和可配置。

# Before DRY
def greet_user_english():
    print("Hello!")

def greet_user_spanish():
    print("¡Hola!")

# After DRY
def greet_user(language):
    greetings = {
        'english': "Hello!",
        'spanish': "¡Hola!"
    }
    print(greetings.get(language, "Hello!"))

等等例子

其他的包括使用库和工具,利用现有的库和工具来减少重复开发。通过定期的代码审查,识别和消除代码重复。
在开发过程中,持续关注代码的重复,及时进行重构,以保持代码的简洁和高效。
在生成重复性的文档、代码块或 UI 组件时使用模板,避免重复劳动等等

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

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

相关文章

鸿蒙(API 12 Beta3版)【AVCodec Kit简介】 音视频编码服务

AVCodec kit(Audio & Video Codec Kit,音视频编解码,封装解封装原子能力)是媒体系统中的音视频的编解码、媒体文件的解析、封装、媒体数据输入等原子能力。 能力范围 媒体数据输入:媒体应用可以传入文件fd、或者…

力扣面试150 反转链表 II 三指针

Problem: 92. 反转链表 II 👨‍🏫 参考题解 特殊情况 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val…

【区块链+医疗健康】健康管理平台 | FISCO BCOS应用案例

如今,医疗数据的共通共享依然存在一些难点: 1. 数据碎片化,分散在各个机构和公司,难以整合和共享。 2. 数据不完整,缺乏全面的患者信息,导致决策质量下降。数据的可扩展性不足,难以长期跟踪患…

“Mutation Observer:让DOM变化尽在掌握

Mutation Observer(变动观察者) 定义 Mutation Observer是一种JavaScript API,用于异步监测DOM树的变动,包括元素的添加、删除、属性变化等。当DOM发生变动时,它可以触发回调函数,允许你对变动作出响应。 …

Ubuntu14.04安装网卡驱动

1,lspci 查看网卡型号 2,到官网下载解压,进入文件目录 3,新装的服务器会报错,提示我们没有安装make,下载缺少的gcc和make依赖,记得先执执行一下系统更新 sudo apt update && sudo apt upgrade -y sudo apt …

【css】使用CSS绘制奥运五环--巴黎奥运

使用CSS绘制奥运五环 在2024年巴黎奥运会期间,本文来使用 CSS 来画一个奥运五环。奥运五环由五个相互交叠的圆环组成,分别代表五大洲。 奥运五环是相互连接的,因此在视觉上会产生重叠效果,这也是实现五环最有挑战性的部分 HTML结…

Linux -软件包管理 下载与安装方式

1. wget下载 先下载再安装 wget命令是Linux系统用于从Web下载文件的命令行工具,支持 HTTP、HTTPS及FTP协议下载文件 当然现在更多支持用yum工具的,不过有的时候一些镜像站点不再维护一些旧版本的软件时,这时候就可以用wget可以先获取&…

Unity补完计划 之 SpriteEditer Multiple

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 1. SpriteEditer Multiple Automatic slicing - Unity 手册 这是用于裁剪图集的模式 应用之后精灵编辑器会看到Slice亮…

CSP-J 复赛 模拟题7 and 解析

1.超级素数: 题目描述 素数,又称质数,是指除 11 和其自身之外,没有其他约数的正整数。例如 2,3,5,132,3,5,13 都是素数,而 4,9,12,184,9,12,18 则不是。特别地,规定 11 不是素数(因此自然数的…

【C++进阶学习】第十二弹——C++ 异常处理:深入解析与实践应用

前言: 在C编程语言中,异常处理是一种重要的机制,它允许程序员在运行时捕获和处理错误或异常情况。本文将详细介绍C异常处理的相关知识点,包括异常的定义、抛出与捕获、异常处理的原则、以及在实际编程中的应用。 目录 1. 异常处理…

算法力扣刷题记录 六十九【动态规划基础及509. 斐波那契数】

前言 调整一下做题顺序,多个章节同步进行,穿插练习。可以在各章节的专栏中找同一类。 记录 六十九【动态规划基础】。 一、动态规划理论基础学习 参考学习链接 二、509. 斐波那契数 2.1 题目阅读 斐波那契数 (通常用 F(n) 表示&#x…

屏蔽浏览器搜索出csdn相关内容的方法

屏蔽csdn搜索结果的方法 前言 鉴于你对知识质量的渴望,以及对挖掘知识金子的欲求,你一定想在浏览器结果中去除有关Csdn的全部内容😈**(确信)**,但是当你在用bing或者google搜索有没有可以屏蔽CSDN搜索结果的方法时,通…

一套基于tailwindcss的后台管理系统模板Chakra UI + React + TS

下载地址给你们: https://horizon-ui.com/#version

算法混合杂项

基础类型 可用template 投影 是有方向的 求俩直线交点 推公式 q我们不知道,已知p1 p2,正弦定理,α可以用叉积表示出来 β同理 所以我们能求出p1q 已知piq 回归到我们上一个问题,已知方向和长度,我们就能够求出Voq …

24/8/8算法笔记 不同分类算法的差异

import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVCfrom sklearn import datasets 加载数据 我们加载的是啤酒的数据 wine datasets.load_wine() wine LR逻辑斯蒂回归…

【数据结构】数组复习-二分查找法

写这篇博客的起因: 刚开始刷力扣,发现没有一个很好的做题方法,在网络上发现了这个博主的评论,如下。感觉挺适合我,所以开始复习一下数据结构。 c基础主要是看: 1.bilibili上青岛大学王卓第02周03--2.3线…

算法 二

求中点 LR,可能溢出 除以2,等同于右移一位 递归、递归的时间复杂度 母问题的规模 子问题的规模,且都相等 调用次数 不用展开看,就看一层。 归并排序 时间复杂度降低的原因:没有浪费比较。比如选择排序&#xff…

48天笔试训练错题——day44

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 单词倒排 选择题 1. A 类 IP 地址:0.0.0.0 ~ 127.255.255.255 1 字节网络号,3 字节主机号 B 类 IP 地址:128.0.0.0 ~ 191.255.255.255 2…

服务器网络磁盘挂载

一、Ping测试 先测试磁盘网络的连通性 例如:这里申请的网络磁盘是: 127.0.0.1:/shareData ping 127.0.0.1二、挂载 确认连通后,确定需要挂载的目录,这里服务器的挂载目录为:/data/share (自主选择创建目录…

【食物链】

题目 代码 #include<bits/stdc.h> using namespace std; const int N 5e410; int n, k; int p[N], d[N]; int find(int x) {if(p[x] ! x){int root find(p[x]);d[x] d[p[x]];p[x] root;}return p[x]; } int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)…