瑞_Java开发手册_(七)设计规约

这篇具有很好参考价值的文章主要介绍了瑞_Java开发手册_(七)设计规约。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🙊前言:本文章为瑞_系列专栏之《Java开发手册》的设计规约篇。由于博主是从阿里的《Java开发手册》学习到Java的编程规约,所以本系列专栏主要以这本书进行讲解和拓展,有需要的小伙伴可以点击链接下载。本文仅供大家交流、学习及研究使用,禁止用于商业用途,违者必究!

本系列第一篇链接:(一)编程规约
本系列第二篇链接:(二)异常日志
本系列第三篇链接:(三)单元测试
本系列第四篇链接:(四)安全规约
本系列第五篇链接:(五)MySQL数据库
本系列第六篇链接:(六)工程结构
本系列第七篇链接:(七)设计规约

瑞_Java开发手册_(七)设计规约,Java开发手册,java,开发手册,代码规范

设计规约的意义

  在Java开发手册中,《设计规约》是一个非常重要的部分,它为开发者提供了一系列关于系统设计的指导原则和约定。这些规约旨在确保设计的一致性、可维护性和可扩展性,从而提高软件的质量和可靠性

  设计规约的意义主要如下:

  • 确保设计的一致性:通过制定统一的设计规约,可以确保团队成员遵循相同的标准和约定,从而在整个项目中保持设计的一致性。这有助于减少因个人偏好或习惯导致的差异,降低维护成本。
  • 提升代码质量:规约中明确规定了设计的各个方面,如类设计、接口设计、数据结构设计等。通过遵循这些规约,可以减少代码中的缺陷、提高代码的可读性和可维护性,并使代码更加健壮。
  • 降低维护成本:设计规约为开发人员提供了一个清晰的指南,指导如何进行系统设计和实现。当系统变得复杂时,遵循规约可以使维护工作变得更加简单和高效。开发人员可以快速理解代码的结构和设计意图,降低维护成本。
  • 促进团队合作:设计规约可以帮助团队成员更好地协作和沟通。当所有人遵循相同的规约时,可以更加顺利地交流和合作,避免因误解或不一致导致的开发冲突。
  • 提高软件可扩展性:设计规约不仅关注现有功能的实现,还考虑未来的扩展性。通过遵循规约,开发人员在设计时能够预见未来的变化,并构建出灵活的架构,使软件更容易适应未来的需求变化。
  • 降低培训成本:对于新加入的团队成员,遵循设计规约可以降低他们的学习成本。他们可以快速了解项目的代码结构和设计风格,更快地融入团队并开始工作。
  • 促进最佳实践的推广:设计规约通常基于行业最佳实践和经验总结。通过推广这些规约,可以帮助团队吸收和采纳先进的软件开发理念和方法,从而提高整个团队的技术水平。



设计规约

  1. 【强制】存储方案底层数据结构的设计获得评审一致通过,并沉淀成为文档。
    说明:有缺陷的底层数据结构容易导致系统风险上升,可扩展性下降,重构成本也会因历史数据迁移和系统平滑过渡而陡然增加,所以,存储方案和数据结构需要认真地进行设计和评审,生产环境提交执行后,需要进行 double check。
    正例:评审内容包括存储介质选型、表结构设计能否满足技术方案、存取性能和存储空间能否满足业务发展、表或字段之间的辩证关系、字段名称、字段类型、索引等;数据结构变更(如在原有表中新增字段)也需要进行评审通过后上线。

  2. 【强制】在需求分析阶段,如果与系统交互的 User 超过一并且相关的 User Case 超过 5 个,使用用例图来表达更加清晰的结构化需求。

  3. 【强制】如果某个业务对象的状态超过 3 个,使用状态图来表达并且明确状态变化的各个触发条件。
    说明:状态图的核心是对象状态,首先明确对象有多少种状态,然后明确两两状态之间是否存在直接转换关系,再明确触发状态转换的条件是什么。
    正例:淘宝订单状态有已下单、待付款、已付款、待发货、已发货、已收货等。比如已下单与已收货这两种状态之间是不可能有直接转换关系的。

  4. 【强制】如果系统中某个功能的调用链路上的涉及对象超过 3 个,使用时序图来表达并且明确各调用环节的输入与输出。
    说明:时序图反映了一系列对象间的交互与协作关系,清晰立体地反映系统的调用纵深链路。

  5. 【强制】如果系统中模型类超过 5 个,并且存在复杂的依赖关系,使用类图来表达并且明确类之间的关系。
    说明:类图像建筑领域的施工图,如果搭平房,可能不需要,但如果建造蚂蚁 Z 空间大楼,肯定需要详细的施工图。

  6. 【强制】如果系统中超过 2 个对象之间存在协作关系,并且需要表示复杂的处理流程,使用活动图来表示。
    说明:活动图是流程图的扩展,增加了能够体现协作关系的对象泳道,支持表示并发等。

  7. 【推荐】系统架构设计时明确以下目标:

    • 确定系统边界。确定系统在技术层面上的做与不做。
    • 确定系统内模块之间的关系。确定模块之间的依赖关系及模块的宏观输入与输出。
    • 确定指导后续设计与演化的原则。使后续的子系统或模块设计在一个既定的框架内和技术方向上继续演化。
    • 确定非功能性需求。非功能性需求是指安全性、可用性、可扩展性等。

瑞:
1️⃣确定系统边界:

  • 理解:在开始设计一个系统时,首先需要明确这个系统的范围或边界。这涉及到确定哪些功能属于这个系统,哪些功能不属于这个系统。
  • 意义:明确系统边界有助于团队成员对系统的整体功能有一个清晰的认识,防止在开发过程中过度设计和遗漏某些功能。

2️⃣确定系统内模块之间的关系:

  • 理解:这涉及到识别系统中的各个模块,并定义它们之间的交互关系,如数据流、控制流等。
  • 意义:了解模块之间的关系有助于更好地组织代码、提高可维护性和模块的复用性。

3️⃣确定指导后续设计与演化的原则:

  • 理解:这意味着在架构设计阶段,需要为后续的子系统或模块设计制定一些标准和指导原则,以确保这些子系统或模块在设计、开发、演化过程中保持一致性。
  • 意义:这样可以确保系统的整体连贯性和可扩展性,使得新加入的子系统或模块能够与现有系统更好地集成。

4️⃣确定非功能性需求:

  • 理解:非功能性需求通常指的是那些与系统的核心功能无关,但对系统的性能、可靠性、安全性等方面有重要影响的特性。例如,系统的响应时间、可用性、安全性、可扩展性等。
  • 意义:明确非功能性需求有助于确保在设计和开发过程中充分考虑这些因素,从而构建出更加健壮和可靠的软件系统。
  1. 【推荐】需求分析与系统设计在考虑主干功能的同时,需要充分评估异常流程与业务边界。
    反例:用户在淘宝付款过程中,银行扣款成功,发送给用户扣款成功短信,但是支付宝入款时由于断网演练产生异常,淘宝订单页面依然显示未付款,导致用户投诉。

  2. 【推荐】类在设计与实现时要符合单一原则。
    说明:单一原则最易理解却是最难实现的一条规则,随着系统演进,很多时候,忘记了类设计的初衷。

瑞:要分清楚 [ 数据对象类 ] 和 [ 业务对象类 ] 的职责区别。数据对象类只负责数据的存储和传递,数据对象类内部不应该存在任何的业务逻辑的处理,通常情况下只有 setter/getter/toString ,如DTO数据传输对象。而业务对象类才是负责处理业务逻辑,不应该去维护非业务的成员属性,如Service层接口的具体实现类

  1. 【推荐】谨慎使用继承的方式来进行扩展,优先使用聚合/组合的方式来实现。
    说明:不得已使用继承的话,必须符合里氏代换原则,此原则说父类能够出现的地方子类一定能够出现,比如,“把钱交出来”,钱的子类美元、欧元、人民币等都可以出现。

瑞:里氏代换原则可以参考《瑞_23种设计模式_概述(含代码)》中的设计模式的6大法则的里氏代换原则(Liskov Substitution Principle)。比如 “BaseController” 或者 “钱有子类:人民币、美元” 等情况才使用继承

  1. 【推荐】系统设计阶段,根据依赖倒置原则,尽量依赖抽象类与接口,有利于扩展与维护。
    说明:低层次模块依赖于高层次模块的抽象,方便系统间的解耦。

瑞:依赖倒置原则可以参考《瑞_23种设计模式_概述(含代码)》中的设计模式的6大法则的依赖倒转原则(Dependence Inversion Principle)。如Spring框架的ApplicationContext类,它是一个接口,定义了各种获取bean的方法,它位于Spring框架的高层次,提供了一种全局的访问机制。低层次的模块(例如控制器、服务、数据访问对象等)通常依赖于高层次的抽象(例如接口或抽象类),而不是直接依赖于具体的实现类。这样,当实现类发生变化时,低层次的模块不需要修改代码,因为它们依赖于抽象而不是具体的实现。

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        ApplicationContext applicationContext = new AbstractApplicationContext() {
            @Override
            public Object getBean(String name) throws Exception {
                // 自定义实现
                return null;
            }

            @Override
            public <T> T getBean(String name, Class<? extends T> clazz) throws Exception {
                // 自定义实现
                return null;
            }
        }
  1. 【推荐】系统设计阶段,注意对扩展开放,对修改闭合。
    说明:极端情况下,交付的代码是不可修改的,同一业务域内的需求变化,通过模块或类的扩展来实现。

瑞:可以参考《瑞_23种设计模式_概述(含代码)》中的设计模式的6大法则的开闭原则(Open Close Principle)

  1. 【推荐】系统设计阶段,共性业务或公共行为抽取出来公共模块、公共配置、公共类、公共方法等,在系统中不出现重复代码的情况。
    说明:随着代码的重复次数不断增加,维护成本指数级上升。

瑞:即使某方法只使用两次,也应该抽出公共部分变为一个方法。如果使用IDEA开发工具,建议开启duplicated code fragment即重复代码片段检查选项,如下图所示:

瑞_Java开发手册_(七)设计规约,Java开发手册,java,开发手册,代码规范

  1. 【推荐】避免如下误解:敏捷开发 = 讲故事 + 编码 + 发布。
    说明:敏捷开发是快速交付迭代可用的系统,省略多余的设计方案,摒弃传统的审批流程,但核心关键点上的必要设计和文档沉淀是需要的。
    反例:某团队为了业务快速发展,敏捷成了产品经理催进度的借口,系统中均是勉强能运行但像面条一样的代码,可维护性和可扩展性极差,一年之后,不得不进行大规模重构,得不偿失。

  2. 【参考】设计文档的作用是明确需求、理顺逻辑、后期维护,次要目的用于指导编码。
    说明:避免为了设计而设计,系统设计文档有助于后期的系统维护和重构,所以设计结果需要进行分类归档保存。

  3. 【参考】可扩展性的本质是找到系统的变化点,并隔离变化点。
    说明:世间众多设计模式其实就是一种设计模式即隔离变化点的模式。
    正例:极致扩展性的标志,就是需求的新增,不会在原有代码交付物上进行任何形式的修改。

  4. 【参考】设计的本质就是识别和表达系统难点。
    说明:识别和表达完全是两回事,很多人错误地认为识别到系统难点在哪里,表达只是自然而然的事情,但是大家在设计评审中经常出现语焉不详,甚至是词不达意的情况。准确地表达系统难点需要具备如下能力: 表达规则和表达工具的熟练性。抽象思维和总结能力的局限性。基础知识体系的完备性。深入浅出的生动表达力。

  5. 【参考】代码即文档的观点是错误的,清晰的代码只是文档的某个片断,而不是全部。
    说明:代码的深度调用,模块层面上的依赖关系网,业务场景逻辑,非功能性需求等问题是需要相应的文档来完整地呈现的。

  6. 【参考】在做无障碍产品设计时,需要考虑到:

    • 所有可交互的控件元素必须能被 tab 键聚焦,并且焦点顺序需符合自然操作逻辑。
    • 用于登陆校验和请求拦截的验证码均需提供图形验证以外的其它方式。
    • 自定义的控件类型需明确交互方式。
      正例:用户登陆场景中,输入框的按钮都需要考虑 tab 键聚焦,符合自然逻辑的操作顺序如下,“输入用户名,输入密码,输入验证码,点击登录”,其中验证码实现语音验证方式。如果有自定义标签实现的控件设置控件类型可使用 role 属性。



本文是博主的粗浅理解,可能存在一些错误或不完善之处,如有遗漏或错误欢迎各位补充,谢谢

  如果觉得这篇文章对您有所帮助的话,请动动小手点波关注💗,你的点赞👍收藏⭐️转发🔗评论📝都是对博主最好的支持~文章来源地址https://www.toymoban.com/news/detail-796685.html


到了这里,关于瑞_Java开发手册_(七)设计规约的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 阿里开发手册规范(JAVA)

    目录 一、编程规约  (一) 命名规范 (二) 常量定义 (三) 代码格式  (四) OOP规约 (五) 日期时间 (六) 集合处理  (七) 并发处理 (八) 控制语句 (九) 注释规约 (十) 前后端规约 二、异常日志  (一) 错误码 (二) 异常处理 (三) 日志规约  三、单元测试  四、安全规约 五、MySQL数据库 

    2024年02月01日
    浏览(44)
  • 开发手册|Java后端开发规范重点条目整理

    Ps:部分熟知的开发规范未收录在本文中!暂无排版格式,等待后续添加…… 1.1 命名风格 代码中的命名严禁使用拼音与英文混合的方式 alibaba / taobao / youku / hangzhou 等国际通用的名称可视同英文 类名使用大驼峰的形式命名,例如 UpperCameCase 方法、参数与变量使用小驼峰的形式

    2024年02月14日
    浏览(44)
  • 阿里巴巴_java开发规范手册详解

    反例: _name, $name, __name 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,纯拼音命名方式更要避免采用。 正例:renminbi / alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同英文。 反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3 正例:

    2024年02月06日
    浏览(47)
  • JAVA编码规范:安全规约、mysql数据库_java后端的sql编码规范

    7、【强制】如果存储的字符串长度几乎相等,使用 char定长字符串类型 8、【强制】varchar是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此值,定义字段类型为 text,独立出来一张 表,用主键来对应,避免影响其它字段索引效率。 9、【强制】表

    2024年04月10日
    浏览(53)
  • 阿里巴巴Java开发 单元测试和安全规约

    目录 前言 1.单元测试 2.安全规约 单元测试和安全规约依次分为【 重要 】、【 建议 】、【 参考 】,整理单元测试和安全规约为了更好处理代码中bug,使得代码更加安全。 1.【 重要 】好的单元测试必须遵守 AIR 原则。          说明 :单元测试在线上运行时,感觉像空气

    2024年04月10日
    浏览(57)
  • 【Java设计模式 规范与重构】 二 重构的保障:单元测试,以及如何提高代码可测试性

    其实之前的工作中强调过很多次自己做测试的重要性,例如讲单元测试的: 【C#编程最佳实践 一】单元测试实践 ,讲单元测试规范的 【阿里巴巴Java编程规范学习 四】Java质量安全规约 ,讲接口测试的: 【C#编程最佳实践 十三】接口测试实践 ,这里旧事重提就不再详细展开

    2023年04月25日
    浏览(64)
  • Java编程规范(代码规范)--精选

    说明 本文介绍精选的Java编程规范(代码规范)。遵守这些规范,代码的bug数将会大幅减少,代码可维护性、可读性、扩展性会大幅上升。(本文持续更新) 为什么要有编程规范? 编程规范有如下作用: 提高代码可读性、维护性、扩展性 提高开发速度、减少bug 有助于留住人

    2024年02月05日
    浏览(39)
  • 【开发规范系列】(二):Java后台开发规范

    https://blog.zysicyj.top/ 提到Java开发规范,那么大家能想到的基本就是 阿里巴巴Java开发手册 ,这个手册的内容很丰富,但是呢篇幅太长,很多人都记不住,那么怎么办呢?好在阿里巴巴提供了代码扫描插件,方便我们开发时发现问题并及时修改。 参考这篇文章:【插件】Java开

    2024年02月10日
    浏览(40)
  • Java阿里巴巴代码规范

    想学习架构师构建流程请跳转:Java架构师系统架构设计 我们介绍了让代码规范的方案,下面我们就来说一下阿里的代码规范文档 1.1.1 反例 这种操作很容易产生难以排查的NPE异常 1.1.2 正例 入参以及出参,和参数传递类型是一致的 SimpleDateFormat 是线程不安全的类,一般不要定

    2024年02月10日
    浏览(92)
  • 【Python开发手册】深入剖析Google Python开发规范:规范Python注释写作

    💖 作者简介:大家好,我是Zeeland,全栈领域优质创作者。 📝 CSDN主页:Zeeland🔥 📣 我的博客:Zeeland 📚 Github主页: Undertone0809 (Zeeland) (github.com) 🎉 支持我:点赞👍+收藏⭐️+留言📝 📣 系列专栏:Python系列专栏 🍁 💬介绍:The mixture of software dev+Iot+ml+anything🔥 本文节选

    2023年04月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包