KISS principle (kiss原则)

2023-10-27

Keep It Simple Stupid (KISS)

原则声明

即使解决方案看起来很愚蠢,简单的解决方案也比复杂的解决方案好。

描述

该KISS原则是关于追求简单。现代编程语言,框架和API具有强大的手段来创建针对各种问题的复杂解决方案。有时,开发人员可能会想编写使用所有这些复杂功能的“聪明”解决方案。该KISS原则指出,一个解决方案是更好的时候,使用更少的继承,多态少,少类等。

遵循KISS原则的解决方案可能看起来很无聊甚至“愚蠢”,但简单易懂。该KISS原则指出,有一个解决方案没有价值是“聪明”,但一个是很容易理解的。

这并不意味着根本不应该使用诸如继承和多态性之类的功能。相反,仅应在必要时使用它们或有一些实质性优势

基本原理

简单的解决方案比复杂的解决方案好,因为简单的解决方案更易于维护。这包括提高的可读性,可理解性和可变性。此外,编写简单的代码不太容易出错。

如果维护软件的人不是曾经编写软件的人,那么简化的优势就更大了。维护人员可能还不太熟悉复杂的编程语言功能。因此,简单而愚蠢的程序易于维护,因为维护人员需要较少的时间来理解它们,并且不太可能引入进一步的缺陷。

创建更复杂的代码的原因之一是使其更加灵活,以适应进一步的需求。但是人们不知道以什么方式使其具有灵活性,或者是否曾经需要这种灵活性。

“当您使代码比所需的更加灵活或复杂时,您将对其进行过度的设计。有些人这样做是因为他们相信自己知道系统的未来要求。他们认为最好使当今的设计更灵活或更复杂,以便能够满足明天的需求。如果您碰巧是通灵者,那听起来很合理。” -重构为模式-Joshua Kerievsky。

创建更复杂的代码的另一个原因是进行优化。优化的代码是更复杂的代码。Pareto principle.帕累托原理 也适用于代码:程序大部分时间都花在代码的一小部分上,因此将精力集中在仅优化部分代码上是明智的

另一个最佳实践是遵循“优化的三个规则”:(1. Don’t, 2. Don’t… Yet, 3. Profile before optimizing),这很有意义:仅优化存在性能问题的代码。(第一作者: Michael A. Jackson)

策略

这是一个非常通用的原则,因此在很大程度上取决于给定的设计问题,有很多可能的策略可以更严格地遵循该原则:

  • 避免继承,多态,动态绑定和其他复杂的OOP概念。使用委派和简单的if-constructs代替。
  • 避免对算法进行低级优化,尤其是在涉及汇编器,位操作和指针时。较慢的实现将正常工作。
  • 使用简单的暴力解决方案而不是复杂的算法。较慢的算法将首先起作用。
  • 避免使用大量的类和方法以及较大的代码块(请参阅“MIMC”)
  • 对于功能稍微不相关但很小的功能块,请使用私有方法,而不要使用其他类。
  • 避免需要参数化的常规解决方案。一个特定的解决方案就足够了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KISS principle (kiss原则) 的相关文章

  • JavaScript的设计模式解析——工厂模式

    这几天一直在看 JavaScript高级程序设计 在第六章面向对象的程序设计中 自我感觉对于小白而而言 会一定程度的难以理解 什么意思啊 根本不明白哇等等 注意 大神请略过 小小码农 不敢妄言 首先 我们开门见山 什么是工厂模式 工厂模式能
  • c++享元模式

    享元模式 1 享元模式简介 享元模式在 设计模式 可复用面向对象软件的基础 一书中是这样说的 运用共享技术有效地支持大量细粒度的对象 本质就是对大量细粒度的对象进行共享 不是每个对象都要通过new的方式去创建 而是通过区分对象的内部状态和外
  • C++ 装饰器模式

    什么是装饰器模式 装饰器模式是一种结构型设计模式 实现了在不改变现有对象结构的的同时又拓展了新的功能 装饰器本质上是对现有对象的重新包装 同时装饰器又称为封装器 如何理解装饰器模式 以笔记本电脑为例 当我们购买了一台新笔记本电脑 但我们发现
  • C++设计模式(二)观察者模式

    1 观察者模式知识点 1 定义 定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变的时候 所有依赖它的对象都得到通知并自动更新 2 动机 将一个系统分割成一系列相互协作的类有一个常见的副作用 需要维护相关对象间的一致性 我们不希望为
  • 设计模式——原型模式

    原型模式顾名思义 就是指以某个实例为原型 copy出一个新的实例 该实例属性与原型相同或者是类似 很多时候 我们需要创建大量的相同或者相似的对象 如果一个个用new 构造函数的形式去创建的话比较繁琐 就像孙悟空要想变出成千上万个猴子猴孙总不
  • 设计模式--组合模式

    组合模式 又叫部分整体模式 属于结构型模式 基本原理 以树形的结构将相似的对象组合起来 主要流程 1 创建对象 2 在对象中设置用来存放下一级相似对象的数据结构 3 在对象中设置增删改查等功能 注意 这种模式和数据结构中的树形结构相似 in
  • 计算资源合并模式——云计算架构常用设计模式

    背景 云计算的解决方案中 最初设计可能有意遵循关注点分离的设计原则 把操作分解为独立的计算单元以便可以单独托管和部署 然而 虽然这种策略可以帮助简化解决方案的逻辑实现 但是在同一个应用程序中要部署大量的计算单元 这会增加运行时的托管成本 并
  • 简单工厂模式

    简单工厂模式 一 概念 从设计模式的类型上来说 简单工厂模式是属于创建型模式 又叫做静态工厂方法 StaticFactory Method 模式 但不属于23种GOF设计模式之一 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 简
  • Java并发编程之设计模式

    同步模式之保护性暂停 1 定义 即 Guarded Suspension 用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程 让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线
  • 设计模式七大原则

    1 设计模式的目的 编写软件过程中 程序员面临着来自耦合性 内聚性以及可维护性 可扩展性 重用性 灵活性 等多方面的挑战 设计模式是为了让程序 软件 具有更好 1 代码重用性 即 相同功能的代码 不用多次编写 2 可读性 即 编程规范性 便
  • 设计模式-2--工厂模式(Factory Pattern)

    一 什么是工厂模式 工厂模式 Factory Pattern 是一种创建型设计模式 它提供了一种创建对象的接口 但是将对象的实例化过程推迟到子类中 工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象 而无需暴露对象的实例化逻辑 工厂
  • 单例模式的八种写法比较

    单例模式是最常用到的设计模式之一 熟悉设计模式的朋友对单例模式都不会陌生 一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式 但是除了这两种方式 本文还会介绍其他几种实现单例的方式 让我们来一起看看吧 简介 单例模式是一种常
  • Tomcat 系统架构与设计模式之工作原理篇

    本文以 Tomcat 5 为基础 也兼顾最新的 Tomcat 6 和 Tomcat 4 Tomcat 的基本设计思路和架构是具有一定连续性的 Tomcat 总体结构 Tomcat 的结构很复杂 但是 Tomcat 也非常的模块化 找到了 T
  • 组合型模式

    概述 对于这个图片肯定会非常熟悉 上图我们可以看做是一个文件系统 对于这样的结构我们称之为树形结构 在树形结构中可以通过调用某个方法来遍历整个树 当我们找到某个叶子节点后 就可以对叶子节点进行相关的操作 可以将这颗树理解成一个大的容器 容器
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • 设计模式详解---策略模式

    1 策略模式简介 策略模式 Strategy Pattern 是一种行为型设计模式 用于在运行时根据不同的情境选择不同的算法或策略 该模式将算法封装成独立的类 使得它们可以相互替换 而且可以独立于客户端使用它们的方式 1 1 主要角色 上下
  • 设计模式—迭代器模式解析

    本文参考学习了 图解设计模式 中的代码实现和原理解释 迭代器模式 简介 Iterator 模式用于在数据集合中按照顺序遍历集合 就类似于我们的循环 一个个去遍历一个集合中的所有元素 示例代码 首先我们思考一个书本和书架的关系 显然 书架可以
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • 【设计模式之美】 SOLID 原则之五:依赖反转原则:将代码执行流程交给框架

    文章目录 一 控制反转 IOC 二 依赖注入 DI 三 依赖注入框架 DI Framework 四 依赖反转原则 DIP 一 控制反转 IOC 通过一个例子来看一下 什么是控制反转 public class UserServiceTest
  • C++设计模式 --1.工厂模式和单例模式

    文章目录 1 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 2 单例模式 懒汉式 饿汉式 1 工厂模式 简单工厂模式

随机推荐

  • 关于安装pytorch、cuda对应GPU显卡算力问题(记录贴)

    贴几个链接 ngc pytorch容器版本对应关系 CUDA Toolkit版本及可用PyTorch对应关系 NVIDIA英伟达GPU显卡算力表 总结 安装torch时会安装对应的cuda版本 目前来看cuda10对应的是7 5的算力 适用
  • LLVM基本概念入门

    入职新公司以后 开始着手基于LLVM开发编译器 之前在前东家那里主要做gcc的开发 所以也算是有点基础 但拿到LLVM后 除了知道clang a c o a之外 好像其他的都有点差异 现在经过了小一个月的学习 也算有点收获 因为网上关于LL
  • 抖音矩阵系统-60+自媒体平台一键发布-短视频获客系统

    当老板做企业的 想在抖音上做生意的 一定一定要开通蓝V企业号线索版来做矩阵 看看我每天的线索都是999 客服都接待不过来 现在还有300个客资未分配 抖音都在推了企业员工号的玩法 你还在质疑什么 在抖音上做矩阵 真的能将你的生意放大100倍
  • rabbitmq使用mqtt协议

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 rabbitmq是什么 二 mqtt协议是什么 三 配置步骤 1 启用 rabbitmq的mqtt协议 2 mqtt 客户端依赖包 总结 前言 在网上学习
  • JavaScript undefined 属性

    定义和用法 undefined 属性用于存放 JavaScript 的 undefined 值 语法 undefined 说明 无法使用 for in 循环来枚举 undefined 属性 也不能用 delete 运算符来删除它 undef
  • linux各文件夹的作用是什么,linux各目录的作用

    关键字 linux 目录 linux各目录的作用 linux下的文件结构 看看每个目录都是干吗用的 bin 二进制可执行命令 dev 设备特别文件 etc 系统管理和设置文件 etc rc d 启动的设置文件和脚本 home 用户主目录的基
  • 剑指Offer第八和第九题:跳台阶和变态跳台阶以及拓展

    由于题目类似 这里总和一下 并进行拓展 目录 1 跳台阶 2 变态跳台阶 3 拓展篇 疯魔版跳台阶 题目一 题目二 1 跳台阶 题目描述 一只青蛙一次可以跳上1级台阶 也可以跳上2级 求该青蛙跳上一个n级的台阶总共有多少种跳法 先后次序不同
  • 苹果手机锁屏后无线重新连接服务器,iphone11锁屏自动断开wifi怎么办 苹果11手机热点自动断开解决方法...

    目前有着很多用户都在使用最新的iphone11这款手机 但是对于手机上的wifi热点网络却出现了不少的问题 比如iphone11锁屏自动断开wifi wifi热点自动断开 当遇到这些问题应该怎么办 如何才能解决呢 下面就和小编一起来看看吧
  • 基于SpringBoot 的报销系统

    视频展示 基于springboot的报销系统 项目定制 报销系统 哔哩哔哩 bilibili 技术 SpringBoot Html css 个人制作模块介绍 权限模块 前端权限模块 后端权限模块 登录监听 监听器 拦截器 业务流程 接口设计
  • nnU-Net团队新作MedNeXt:新一代医学图像分割之王,刷新多项榜单记录!

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 医疗影像和Transformer 微信技术交流群 转载自 CVHub Title MedNeXt Transformer driven Scaling
  • clamav的病毒库文件的文件头的信息说明(clamav版本号等)

    Author Samson Date 01 04 2022 在开源病毒检测工具clamav中 是通过对病毒库中的病毒特征值来进行对比的 病毒库文件存放于 var lib clamav目录下 主要是三个cvd文件 如下 bytecode cv
  • httpservletrequest_HttpServletRequest详解 外加请求转发和重定向口述讲解(五)

    点击上方 IT咸鱼 星标公众号 每天分享技术栈 开发工具等 续前篇 咳 今天家里停电电继续更新 每天坚持 前面我们说到response对象的用法和案列 接下来再说说Servlet Request对象用法和案例 1 ServletReques
  • Some Laws in IT

    Moore s Law 摩尔定律是由英特尔 Intel 创始人之一戈登 摩尔 Gordon Moore 提出来的 其内容为 当价格不变时 集成电路上可容纳的元器件的数目 约每隔18 24个月便会增加一倍 性能也将提升一倍 换言之 每一美元所
  • JUC-7. 线程池

    想了解更多JUC的知识 JUC并发编程合集 1 概述 线程池做的工作主要是 控制运行的线程数量 处理过程中将任务放入队列 然后在线程创建后启动这些任务 如果线程数量超过了最大数量 超出数量的线程排队等候 等其他线程执行完毕 再从队列中取出任
  • 全套增删改查(链接数据据库)

    使用Drud连接池连接数据库 完成对数据的增删改查 了解所需要实现的功能 1 综合练习 1 简单功能 1 列表查询 2 登录 3 添加 4 删除 5 修改 2 复杂功能 1 删除选中 2 分页查询
  • ajax怎么给日历日期上做标记,可以做标记的日历?

    原标题 可以做标记的日历 我们很多人一天要做的事情是比较多的 除了工作中的一些任务外 还要照顾好整个家庭 事情多了就难免会有疏忽 所以有不少网友都想要使用一款直观的添加日程的软件 如果可以直接在日历软件中添加日程做标记就更好了 那么有可以做
  • 剑指offer——对称的二叉树

    题目描述 请实现一个函数 用来判断一颗二叉树是不是对称的 注意 如果一个二叉树同此二叉树的镜像是同样的 定义其为对称的 本题知识点 树 解题思路 采用递归的方式 先判断左子树和右子树是否相等 再递归判断左子树的右子树和右子树的左子树以及左子
  • 【101】NLP 自然语言处理14种分类算法】

    内容目录 一 数据集介绍二 解压文件明确需求三 批量读取和合并文本数据集四 中文文本分词五 停止词使用六 编码器处理文本标签七 常规算法模型1 k近邻算法2 决策树3 多层感知器4 伯努力贝叶斯5 高斯贝叶斯6 多项式贝叶斯7 逻辑回归8
  • locust基础使用

    locust基础使用 前言 最近接到一个需求 压测一个接口稳定性 瞬间脑海浮现了jmeter 然后接着看了是那个接口 瞬间分析了下接口里身份验证的加密算法 加上由于时间有限加上jmeter的BeanShell PreProcessor不是很
  • KISS principle (kiss原则)

    Keep It Simple Stupid KISS 原则声明 即使解决方案看起来很愚蠢 简单的解决方案也比复杂的解决方案好 描述 该KISS原则是关于追求简单 现代编程语言 框架和API具有强大的手段来创建针对各种问题的复杂解决方案 有时