当前位置: 首页 > news >正文

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 的主旋律,会在实际开发中为你指明方向。

相关文章:

  • MDP的 Commands模块
  • 如何防止服务器被用于僵尸网络(Botnet)攻击 ?
  • 中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点
  • 解决Ollama 下载模型中断后需要重新下载的问题?
  • OpenCV为图像添加边框
  • React 中 HTML 插入的全场景实践与安全指南
  • React源码阅读-fiber核心构建原理
  • 应用案例 | 设备分布广, 现场维护难? 宏集Cogent DataHub助力分布式锅炉远程运维, 让现场变“透明”
  • 【Linux】文件操作
  • 【PDF PicKiller】PDF批量删除固定位置图片工具,默认解密,可去一般图、背景图、水印图!
  • 排序算法总结(C++)
  • win中将pdf转为图片
  • Python读取PDF:文本、图片与文档属性
  • git提交代码和解决冲突修复bug
  • PDF 转 Markdown
  • java 实现excel文件转pdf | 无水印 | 无限制
  • LangChain【6】之输出解析器:结构化LLM响应的关键工具
  • 佰力博科技与您探讨材料介电性能测试的影响因素
  • Mysql中select查询语句的执行过程
  • 埃文科技智能数据引擎产品入选《中国网络安全细分领域产品名录》
  • 有没有做租赁的网站/厦门网络关键词排名
  • 供求信息网站建设报价/东莞网络推广
  • 监控做直播网站/cfa三级和一二级关系大吗
  • 自己怎么做网站赚钱/淘宝关键词top排行榜
  • 视频网站做游戏分发/品牌推广方案怎么写
  • 网站下载视频软件/品牌营销推广代运营