ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。

其核心目标是避免复杂过度设计,遵循“让事情保持简单”的原则,同时满足当前的需求,而不过分关注遥远、不确定的未来需求。

在这里插入图片描述

Simple Design 应遵循的核心原则

Simple Design 通常与“XP(Extreme Programming,极限编程)”中的四个原则密切相关:

  1. 通过所有测试(Passes all tests)

    • 代码应该是正确的,能够满足当前的功能需求。
    • 示例:如果需要实现一个用户注册功能,设计的代码必须能够通过所有相关的单元测试和功能测试,确保注册逻辑无误。
  2. 具有清晰表达力(Expresses intent clearly)

    • 代码应该清晰易懂,能直观地表达开发者的意图。
    • 示例:变量命名、函数命名都应该有意义,一个名为 calculateTotalPrice 的函数比 doStuff 更清晰地说明其用途。
  3. 没有重复(No duplication)

    • 消除代码中的重复内容。重复会让代码臃肿,且随着需求变化,重复代码可能导致更多维护成本。
    • 示例:如果你在多个地方实现了类似的日期转换逻辑,应该提取为一个通用的工具函数,不必重复编写。
  4. 最少的类和方法(Minimal classes and methods)

    • 避免臃肿的类和方法设计。代码应保持最少的结构来实现功能,而不是过度设计复杂的层次。
    • 示例:除非业务逻辑明确需要,尽量避免创建过多的小类来过早抽象或拆分逻辑。

软件开发中应考虑的方面

在实践“Simple Design”时,我们需要从以下几个方面考虑以确保落地效果:

1. 避免过早优化
  • 优化是有成本的,尤其是过早优化可能使代码变得复杂,且可能优化的地方并非性能瓶颈。
  • 示例:如果目前系统用户并不多,不需要设计一个复杂的缓存系统。在需要时,再进行优化即可。
2. 聚焦当前需求
  • 避免“设计未来”的诱惑,仅为当前需求服务。在实际需求发生变化之前,不要为“可能发生”的需求特意设计。
  • 示例:如果当前只有“商品展示”功能,不需要为未来可能的“商品对比”功能提前设计复杂的结构。
3. 寻求代码易读性
  • 代码写给人看,最终由机器执行。确保同事能够快速理解、扩展或者维护代码。
  • 示例:一个复杂的算法实现,可以通过添加注释、拆分方法或引入中间变量名称来提升其可读性。
4. 小步迭代和持续重构
  • 通过小步迭代验证代码的有效性,并定期重构来保持代码的简单性和清晰性。
  • 示例:使用 TDD(测试驱动开发),先通过精确的测试定义需求,然后一步步补充实现,并随着复杂度增加,拆分为更清晰的模块。
5. 尽量依赖高抽象工具
  • 充分利用框架、库和通用抽象,而不是从头造轮子。
  • 示例:如果需要处理 JSON 数据,可以使用现成的成熟库(如 Java 的 Jackson 或 Python 的 json 模块),而不是自己实现底层序列化和反序列化逻辑。

示例:用户注册功能中的 Simple Design 实践

假设我们需要实现一个用户注册功能,我们可能的初步需求是:

  1. 用户提交用户名和密码进行注册;
  2. 系统验证用户名未被占用;
  3. 将用户信息存储到数据库。
实现 Simple Design 的做法
  1. 初始设计代码以尽量满足需求为目标,不做过度设计:

    def register_user(username, password):if is_username_taken(username):raise ValueError("Username is already taken")hashed_password = hash_password(password)save_to_database(username, hashed_password)
    
  2. 避免重复:如果散布多处都实现了密码加密逻辑,可以在单独的工具模块中实现:

    def hash_password(password):# 使用已有的成熟密码哈希库,如 bcryptimport bcryptsalt = bcrypt.gensalt()return bcrypt.hashpw(password.encode('utf-8'), salt)
    
  3. 明确表达意图:为代码命名赋予明确语义,避免含糊的实现,比如:

    • is_username_taken 而不是 check_user
    • save_to_database 而不是 add_user
  4. 聚焦当前需求:考虑到需求变更的可能性,我们应暂时忽略复杂的扩展比如“用户邮箱验证”或“多语言支持”,这些不是现阶段的核心需求。

  5. 定期重构:随着需求扩张,比如加入用户邮箱验证、用户名生成策略时,可以逐步通过重构来保持设计的简单性:

    class UserService:def register_user(self, username, password):if self._is_username_taken(username):raise ValueError("Username is already taken")hashed_password = self._hash_password(password)self._save_to_database(username, hashed_password)def _is_username_taken(self, username):# 逻辑...passdef _hash_password(self, password):# 逻辑...passdef _save_to_database(self, username, hashed_password):# 逻辑...pass
    

总结

Simple Design 强调在软件开发中,以实现当前需求为目标,采用清晰、简洁的方式完成设计。通过持续的小步迭代重构,逐步优化软件结构,保证系统可维护、可扩展而没有冗余复杂性。

牢记这四个原则:“通过所有测试、清晰表达意图、没有重复、最少的类和方法”,它们是 Simple Design 的主旋律,会在实际开发中为你指明方向。

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

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

相关文章

多模态大语言模型arxiv论文略读(105)

UnifiedMLLM: Enabling Unified Representation for Multi-modal Multi-tasks With Large Language Model ➡️ 论文标题:UnifiedMLLM: Enabling Unified Representation for Multi-modal Multi-tasks With Large Language Model ➡️ 论文作者:Zhaowei…

SQLServer中的存储过程与事务

一、存储过程的概念 1. 定义 存储过程(Stored Procedure)是一组预编译的 SQL 语句的集合,它们被存储在数据库中,可以通过指定存储过程的名称并执行来调用它们。存储过程可以接受输入参数、输出参数,并且可以返回执行…

使用UDP连接ssh

使用UDP连接ssh mosh简介两端安装moshWindows安装mosh 放行端口使用mosh登录Linuxdebug mosh简介 Mosh最大的特点是基于UDP方式传输,支持在服务端创建一个临时的Key供客户端一次性连接,退出后失效;也支持通过SSH的配置进行认证,但…

软件功能模块归属论证方法

文章目录 **一、核心设计原则****二、论证方法****三、常见决策模式****四、验证方法****五、反模式警示****总结** 在讨论软件功能点应该归属哪些模块时,并没有放之四海而皆准的固定方法,但可以通过系统化的论证和设计原则来做出合理决策。以下是常见的…

ServBay 1.13.0 更新,新增第三方反向代理/内网穿透

ServBay 作为一款简化本地开发环境搭建与管理的强大工具,致力于打造一个开箱即用、稳定可靠的本地开发平台,让用户专注于代码编写,提升开发效率。 ServBay 1.13.0 正式发布!本次更新聚焦于提升本地开发项目的外部可访问性、增强国…

如何利用乐维网管进行IP管理

IP管理是网络管理中的关键环节,对于保障网络的正常运行、提升资源利用效率以及保障网络安全等方面都具有不可忽视的重要性。乐维网管在IP管理方面具有多种实用功能,以下从IP规划与分配、IP状态监测、IP冲突处理、IP审计与报表生成四个方面,介…

Go语言学习-->go的跨平台编译

Go语言学习–>go的跨平台编译 默认我们go build的可执行文件都是当前操作系统可执行的文件,Go语言支持跨平台编译——在当前平台下编译其他平台的可执行文件。 eg:在windows界面的代码,编译完成后在linux上面运行 实现方式&#…

SpringBoot自动配置原理深度解析

一、引言 SpringBoot的"约定优于配置"理念极大地简化了Spring应用的开发流程,而其核心魔法就是自动配置(Auto-Configuration)。本文将深入剖析自动配置的实现原理,帮助开发者更好地理解和定制SpringBoot应用。 二、自动配置核心机制 1. Ena…

使用阿里云百炼embeddings+langchain+Milvus实现简单RAG

使用阿里云百炼embeddingslangchainMilvus实现简单RAG 注意测试时,替换其中的key、文档等 import os from langchain_community.embeddings import DashScopeEmbeddings from langchain_community.vectorstores import Milvus from langchain_text_splitters impor…

事件监听 ——CAD C#二次开发

一、AutoCAD .NET API 事件机制 1. 事件监听核心 - Database.ModifyObjects 事件 当数据库中的实体(如图形对象)发生修改时触发,包括: - 几何属性变更(移动、缩放、旋转)。 - 非几何属性变更&#xff08…

动量及在机器人控制中的应用

动量是物理学中的一个基本概念,在机器人学中也有重要应用。以下是详细解释: 1. 动量的基本定义 动量(Momentum)是描述物体运动状态的物理量,定义为: 线性动量:$ p mv $ $ m $ 为质量&#xf…

LeetCode 2434.使用机器人打印字典序最小的字符串:贪心(栈)——清晰题解

【LetMeFly】2434.使用机器人打印字典序最小的字符串:贪心(栈)——清晰题解 力扣题目链接:https://leetcode.cn/problems/using-a-robot-to-print-the-lexicographically-smallest-string/ 给你一个字符串 s 和一个机器人,机器人当前有一个…

影楼精修-AI衣服祛褶皱算法解析

注:为避免侵权,本文所用图像均为AIGC生成或无版权网站提供; 衣服祛褶皱功能,目前在像素蛋糕、美图云修、百度网盘AI修图、阿里云都有相关的功能支持,它的价值就是将不平整的衣服图像,变得整齐平整&#xf…

Celery 核心概念详解及示例

Celery 核心概念详解及示例 Celery 是一个简单、灵活且可靠的分布式系统,用于处理大量消息,提供对任务队列的操作,并支持任务的调度和异步执行。它常用于深度优化 Web 应用的性能和响应速度,通过将耗时的操作移到后台异步执行&am…

智能对联网页小程序的仓颉之旅

#传统楹联遇上AI智能体:我的Cangjie Magic开发纪实 引言:一场跨越千年的数字对话 "云对雨,雪对风,晚照对晴空"。昨天晚上星空璀璨,当我用仓颉语言写下第一个智能对联网页小程序的Agent DSL代码时&#xff0…

《ERP原理与应用教程》第3版习题和答案

ERP原理与应用教程是一门系统介绍企业资源计划(Enterprise Resource Planning, ERP)系统核心理论、技术架构及实施应用的综合性课程。它主要面向管理类、信息类、工程类等专业学生及企业管理者,旨在培养对现代企业信息化管理的理解与实践能力。以下是该课程的详细解析: 一…

SOC-ESP32S3部分:32-LVGL显示框架

飞书文档https://x509p6c8to.feishu.cn/wiki/Ly6ywvphqi6HZlk38vHcz2OgnXg LVGL是一个开源的显示框架,使用它可以加速我们开发带显示屏交互的应用。 IDF对于LVGL的支持一直有更新的,我们可以很方便在组件库中搜索到对应版本的LVGL,并把它添…

原理图与 PCB 设计流程及注意事项

原理图与 PCB 设计流程及注意事项 一、原理图设计 1. 首先,需要创建一个新的项目,在此项目中建立原理图。 2. 接着,在原理图中添加元件和芯片。可以从元件库中挑选所需的元件,如电阻、电容等。既可以在元件库中进行搜索查找&…

LeetCode--23.合并k个升序链表

解题思路: 1.获取信息: 给出了多个升序链表,要求合并成一个升序链表,返回首元结点 2.分析题目: 外面在21题的时候,讲了怎样合并两个升序链表为一个升序链表,不了解的,建议去看一下21…

【国产化适配】如何选择高效合规的安全数据交换系统?

一、安全数据交换系统的核心价值与国产化需求 在数字化转型浪潮中,企业数据流动的频率与规模呈指数级增长,跨网文件传输已成为日常运营的刚需,所以安全数据交换系统也是企业必备的工具。然而,数据泄露事件频发、行业合规要求趋严…