软件设计-模块化设计初思考二

软件设计-模块化设计思考 软件设计-模块化设计思考模块化设计 说明:模块化设计,简单地说就是程序的编写不是开始就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来, 并定义和调试好各个框架之间的输入、输出链接关系。 逐步求精的结果是得到一系列以功能块为单位的算法描述。 以功能块为单位进行程序设计,实现其求解算法的方法称为模块化模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化。 改变某个子功能只需相应改变相应模块即可。 最近在设计软件,突发奇想,把自己的模块化 阅读详情

软件设计-模块化设计初思考二

书接上回

我们已经
设计了Sender接口 用来实现信息的发送,为此我们做了两个实现类,分别实现,邮箱发送与短信发送。(实现类,未实现功能)
设计了 Verify接口 用来实现 不同的验证方式 为此我们做了两个实现类 ,分别实现,邮箱验证与账号验证。(实现类,未实现功能)

我们将接口聚合于 AccountModularity 类 代码如下

package com.ss.account.main;

import com.ss.account.sender.MailSender;
import com.ss.account.sender.Sender;
import com.ss.account.verify.MailVerify;
import com.ss.account.verify.Verify;

public class AccountModularity {

    //发送接口 实现
    private Sender sender;

    //验证接口 实现
    private Verify verify;

    public AccountModularity() {
        init();
    }

    private void init() {
        sender = new MailSender();
        verify = new MailVerify();
    }

    private String sendVerifyCode(String account) {
        //TODO 处理逻辑
        String code = "123asd";
        return sender.sendVerifyCode(account,code) ? code : null;
    }

    public boolean verifyAccount(String account) {
        //TODO 处理逻辑
        return verify.verifyAccount(account);
    }
}

AccountModularity类的升级

今天我们要对这个类进行升级
升级之前,我们在看看需要的功能:

  • 登录
  • 注册
  • 修改个人信息
  • 验证账号是否存在(隐藏功能)

首先,我们来分析一下,具体功能

登录

登录 所需要的参数 可以是 邮箱 账号 手机号 。。。
返回的参数可以是 用户实体类,

问题:

1、用户实体类 不能固定,应该根据不同的实体类返回值不同
2、登录时、参数不同。

解决

1、可以将 用户实体类 抽象出来,作为泛型。
2、可以将具体不同的验证抽象出来,没错,我们已经抽象出来了 就是 Verify接口 还记得其作用吗? 实现不同的验证方式。

同理可得 注册修改密码 需要使用泛型 是否需要不同的接口,我们再行思考。

于此 ,我们已经发现,AccountModularity 并不是一个实现类,而是定义了一套规范,因此,我们将其做成具有泛型的抽象类。
代码如下:

package com.ss.account.main;

import com.ss.account.sender.Sender;
import com.ss.account.verify.Verify;
import com.ss.main.BaseModularity;
import com.ss.main.Lifecycle;

/**
 * @author Jangs
 * @param <T> 用户类
 */
public abstract class AccountModularity<T> {

    //发送接口 实现
    protected Sender sender;

    //验证接口 实现
    protected Verify verify;

    /**
     * 保护构造器
     */
    protected AccountModularity() {
    }

    /**
     * 发送 验证码
     * @param account 用户
     * @return String 验证码
     */
    protected abstract String sendVerifyCode(String account) ;

    /**
     * 验证用户是否存在
     * @param account 用户
     * @return boolean 是否存在
     */
    protected abstract boolean verifyAccount(String account);

    /**
     * 登录
     * @return T 用户实体类
     */
    protected abstract T login();

    /**
     * 注册
     * @param t 用户实体类
     */
    protected abstract void register(T t);

    /**
     * 修改个人信息
     * @param t 用户实体类
     */
    protected abstract void updateAccountInfo(T t);

}

边界化

在此,我提出模块化开发的一个理解 : 边界化

说明

1、模块内的所有方法,都必须是不能直接被外部访问的
2、提供一个 public 入口方法,来调用其他方法。

举一个例子

我们设计了一个房子,在房子内部 设计了它很多的功能,可以做饭,可以洗澡,可以睡觉,但是这些内容都是在房子内部完成的。

如果,我们想要去做饭,我们应该怎么办?
我们需要从门口进入,进入厨房,做饭,出厨房的同时带出饭菜。
这是一整套流程,
我们模块内的所有方法,都必须是不能直接被外部访问的,如果可以直接被外部访问,就好像,我们去做饭不需要进房间一样,那么房子的意义在哪里呢?(家徒无四壁)。别人可以随随便便的进入你家的厨房,去你家洗澡,碎觉。

再举一个例子

我们是一个人,我们可能做很多的事情,但是,当我们需要别人的帮助时,比方,需要他人借给我点钱。
这时我们需要怎么做呢?
直接掏他的口袋,去拿钱?且不说能不能成功,你伸进去的时候,你也被打了。而且,现在都是电子货币。
那正常情况下,我们需要怎么做呢?
第一步、我们需要通知他,我想借点钱。
第二步、由他自己决定,要不要,借钱给我们。

我们不能主宰别人的行为,我们需要通知告知Ta 让Ta 自己来做。

因此,我们的 AccountModularity类 需要以下几项优化
1、将类,修改成抽象类, AbstractAccountModularity类
2、我们需要提供一个 入口方法,鉴于,以后的模块都需要此方法,我们直接抽象成抽象类BaseModularity (仅 提供入口方法)

入口抽象类

代码如下:

package com.ss.main;

/**
 * @author Jangs
 * 此类 仅提供入口方法
 */
public abstract class BaseModularity {
    /**
     * 入口方法
     */
    public abstract void doService();
    
}

再来

我们设计一个房子(模块) 但是,我们也仅仅是提供各种可能性,具体建设,我们不能定义,最后,销毁,我们不可定义
所以,我设计一个生命周期接口,去统一所有模块的初始化与销毁工作。

Lifecycle接口
package com.ss.main;

/**
 * @author Jangs
 */
public interface Lifecycle {
    /**
     * 初始化
     */
    void init();

    /**
     * 销毁
     */
    void destroy();
}

设计此模块的好处如下“
1、统一初始化与销毁
2、为后期多模块组合,树状初始化做装备。
最后我们优化的

本期最终优化成果

AbstractAccountModularity 如此

package com.ss.account.main;

import com.ss.account.sender.Sender;
import com.ss.account.verify.Verify;
import com.ss.main.BaseModularity;
import com.ss.main.Lifecycle;

/**
 * @author Jangs
 * @param <T> 用户类
 */
public abstract class AbstractAccountModularity<T> extends BaseModularity implements Lifecycle {

    //发送接口 实现
    protected Sender sender;

    //验证接口 实现
    protected Verify verify;

    /**
     * 发送 验证码
     * @param account 用户
     * @return String 验证码
     */
    protected abstract String sendVerifyCode(String account) ;

    /**
     * 验证用户是否存在
     * @param account 用户
     * @return boolean 是否存在
     */
    protected abstract boolean verifyAccount(String account);

    /**
     * 登录
     * @return T 用户实体类
     */
    protected abstract T login(String account, String password);

    /**
     * 注册
     * @param t 用户实体类
     */
    protected abstract void register(T t);

    /**
     * 修改个人信息
     * @param t 用户实体类
     */
    protected abstract void updateAccountInfo(T t);

}

自此完成

对于 用户模块的抽象已经实现并优化,但是,具体如何调用?我们下期分解
在此我提出几个问题
1、如何实现不同的验证?
2、如果以后同时实现两种验证方式,我们该如何扩展与优化?
3、如果,以后此模块需要扩展,如何扩展?
4、如果,以后需要跟其他模块一同合作,如何链接?
5、我大量使用集成,java又不能实现多继承,日后扩展如何?

数智读书笔记系列033《软件设计的哲学(第2版)》:复杂性管理的艺术 本书聚焦软件设计的核心挑战——**复杂性管理**,探讨如何通过模块化、抽象化和战略性设计降低系统的复杂性。奥斯特豪特认为,复杂性源于**依赖性**和**模糊性**,表现为变更放大、认知负荷和“未知的未知”。 阅读详情

相关推荐

读《软件设计的哲学》所感所得

这篇读后感的作者Gergely Orosz是一位软件工程师兼作家,他创作了技术专栏“The Pragmatic Engineer Newsletter”在Substack平台上排名第一。他已出版多部著作,包括Building Mobile Apps at Scale、The Software Engineer's Guidebook以及The Tech Resume Inside-Out。他曾任优步的工程经理和软件工程师,以及Skyscanner、微软、Skype和摩根大通的软件工程师。

人邮异步社区 1141

软件详细设计说明书(完整规范)

详细设计说明书模板 详细设计说明书编写规范 详细设计说明书 软件模块详细设计模板

阿里玄难:面向不确定性的软件设计几点思考

阿里妹导读:在纷繁复杂的业务发展中,变化已成为了唯一的不变。如何保障基础设施的安全、高可用性,同时提供高效的创新支持?今天,阿里副总裁、业务平台事业部掌门人玄难,结合阿里...

阿里技术 4944

模块化开发与规范标准

一、模块化概述 模块化是一种思想。模块化是主流的代码组织方式,通过把复杂代码按照功能的不同划分为不同的模块,单独进行维护的方式提高开发效率,降低维护成本。 模块化演变过程 Stage1-文件划分方式 早期将每个功能及状态数据单独存放到不同的文件中,约定每个文件都是独立的模块,使用的时候就是将模块引入到页面中,一个script标签对应一个模块,然后再代码中直接调用全局成员(变量或函数) 引用 缺点: 污染全局作用域 命名冲突问题 无法管理模块依赖关系 Stage2-命名空间方式 每个模块只暴露一个

woyebuzhidao321的博客 1821

模块化设计方案-20221114

对模块中无可移植方案的部分,采用接口抽象出一个可移植层,在不同的平台上分别实现此接口,此接口的实现就是整个模块的需要移植部分,在做移植工作时,只要将关注点放在此处。实际上真正跨平台的软件是不存在的,任何跨平台的软件必须有一个抽象的底层来支撑,这个支撑的部分是需要在不同的平台上重新实现的,也就是软件的需移植部分。弹性带来的问题是复杂性,过于复杂的软件会带来理解和维护上的困难,所以过度的弹性设计也是不可取的。在对模块所解决的问题的认识高度理解的前提下,抽象出模块的本质,是为软件的弹性设计

wzgxhzdd的博客 1689

软件设计师备考 专题 】程序设计的基础:模块划分的原则、方法和标准

模块划分是软件设计中的关键步骤,它决定了系统的结构和组织方式。一个良好的模块划分可以提高代码的可维护性和可复用性,降低开发和测试的复杂度,并促进团队协作和项目管理。在程序设计中,模块划分的重要性不可忽视。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 2689

模块化软件设计

进一步,还可以将数据结构及其操作与菜单业务处理进行分离,将数据结构及其操作独立出来,与命令的定义和菜单引擎分解开来各自独立编码。进行了模块化软件设计之后,我们往往使设计的模块与实现的源代码文件有映射对应关系,menu.c和linklist.h/linklist.c模块的映射对应关系如下图所示,因此我们需要将数据结构及其操作放到单独的源代码文件中。在开源社区中命令行菜单常见的写法是通过一个数据结构的数组来定义一组命令,从而实现命令的定义独立于菜单引擎关键代码,其中的关键是使用指针函数handler。

青衫客36的博客 3375

【SE FDKJ】嵌入式软件设计模块化编程通用规范

本文介绍了嵌入式开发中的模块化编程规范,重点阐述了模块与类的区别、驱动编写方法、移植规范以及编码约定。模块需具备独立输入输出接口,类则无需输入适配文件。详细说明了驱动、文件系统、操作系统等各类模块的移植方法,包括端口文件、驱动实现和API接口的命名规范。同时提供了工程模块划分方案和打印管理方法,并制定了严格的编码标准,包括编辑器设置、命名规则、代码风格和注释要求,强调防御式编程和模块化设计思想,以提高代码可移植性和可维护性。

weixin_47620452的博客 1973

软件工程:软件设计

本博客系统介绍软件设计的核心知识体系,分为五个关键模块:1)软件设计概念与原则,强调可靠性、可修改性等基本原则;2)模块化设计的"高内聚低耦合"核心思想;3)软件体系结构的构件、连接件等要素及设计模式;4)详细设计中的算法实现与文档规范;5)人机界面设计的用户中心原则。内容采用关卡式学习,每个模块包含理论讲解、实例分析和题目测试,帮助读者从基础概念到实践应用全面掌握软件设计方法。特别注重设计思维的培养,如模块化分解、架构模式选择和界面用户体验优化,为开发高质量软件系统提供系统化指导。

m0_74311877的博客 1791

【图书推荐】《软件设计的哲学》(A Philosophy of Software Design)

软件设计的哲学》是约翰·奥斯特豪特(John Ousterhout)总结多年软件开发经验后写作的经典之作,旨在深入探讨如何进行高效且简洁的软件设计。与许多以技术细节为主的书籍不同,Ousterhout的这本书强调从哲学层面理解软件设计的本质,关注如何通过减少复杂性、优化模块化设计来提升软件质量和维护性。本书深入讨论了Ousterhout在软件设计中所提倡的一些核心原则,并通过简洁明了的语言讲解了如何将这些原则应用到实际的开发过程中。书中不仅有理论性的思考,还有大量实际案例和可操作的技巧

彬彬侠的博客 1538

软件设计 基础篇() 交互设计

帮助文档 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录帮助文档 系列文章目录前言一、pandas是什么?、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文

Micro丶Organism 2391

我们通常说理解的软件设计的哲学是什么?

软件设计哲学的核心在于指导设计决策的根本理念,强调管理复杂性、以人为本、适应变化、追求简单性、提升可读性以及权衡的艺术。其本质不是具体技术,而是思考方式与价值取向,旨在通过分解、抽象、模块化等手段控制复杂性,同时注重可维护性、可演进性和用户体验。著名的设计流派包括Unix哲学、面向对象设计、函数式编程等,它们各自强调简单、组合、封装或不可变性等原则。最终,软件设计哲学是一种持续演进的智慧,帮助开发者在复杂性与变化中找到平衡,创造更健壮的系统。

软件行业技术文化交流。 1634

20、软件设计模块化:从理论到实践

本文深入探讨了软件设计模块化的核心理念和实践方法,从设计的抽象层次出发,分析了模块化的理想特性与常见陷阱,并详细介绍了多种设计表示方法,如伪代码、流程图和状态图等。同时,文章强调了良好的模块化设计对软件质量、可维护性和可扩展性的重要性,并结合嵌入式系统的实际应用场景,展示了如何通过状态图等工具实现高效设计。文章旨在帮助开发者优化设计思维,避免常见误区,提升软件开发的整体水平。

g8f9d0s1a2的博客 53

软件设计的核心:从模块化到内聚与耦合

(名著中的名著《代码大全》)为什么我们总是听到“模块化”很重要这样的话?然而,那些没有真正理解模块化核心的人常常会这样说:“把代码分开就好。但奇怪的是,即使把代码分得更细,却常常变得更复杂了。举个例子,虽然明确地按照领域划分了服务类,但一个数据流经过多个类时,反而变得更加碎片化,难以追踪。这篇文章就是关于为什么会发生这种情况的讨论。(1974年Yourdon & Constantine的结构化设计论文)

2404_84768005的博客 1200

【软件工程】之软件设计

软件设计思考题一、软件设计的目标和主要任务1、目标2、主要任务3、软件设计过程模块化设计思想1、定义2、内容1)分解2)抽象3)信息隐藏4)逐步求精5)模块独立性三、模块独立性1、内聚性2、耦合性四、内聚和耦合1、内聚2、耦合五、高内聚低耦合 一、软件设计的目标和主要任务 1、目标 软件设计的目标是对将要实现的软件系统的体系结构、系统的数据、系统模块之间的接口、以及所采用的算法给出详尽的描述。 2、主要任务 ·数据设计将分析模型转化成为设计类的实现以及软件实现所要求的数据结构。 ·体系结构设计定义了

RuRu_Bai的博客 3013

软件设计思考与关注点

软件设计是一个十分复杂且没有规律可遵循的思维发散过程。设计软件系统是非常有挑战性的,因为一方面需要你聚焦在今天的需求,同时要求可以适应未来对功能的修改和增加。 面对软件最大的敌人—需求的变化,我们更多的是通过堆积木的方式堆砌代码。 随着系统的上线运营,客户需求不断的变化与扩充、程序BUG的不断涌现,我们天天在为了修正BUG而干十万火急的工作,下班了还提心吊胆实施地是否给自己提了除错单。

软件设计专栏 1835

20、软件设计模块化开发全解析

本文深入解析了软件设计模块化开发的核心概念和实践方法。内容涵盖软件设计的抽象层次、直接进入实现的潜在问题、模块化的评估标准(如高内聚、低耦合、信息隐藏等)、模块化的优化策略(分解与聚合)、常见设计表示方法(如伪代码、流程图、状态图)以及代码注释与设计的关系。文章强调了模块化开发在提升代码可维护性、可扩展性和可理解性方面的重要性,并通过一个温度监测系统的案例展示了模块化开发的实际应用。最后,文章展望了软件设计模块化开发的未来趋势,包括人工智能辅助设计、微服务架构的普及以及跨平台多语言开发的支持。

mqtt6iot的博客 51

软件设计思考

软件设计的目标和主要任务 软件设计的基本目标是构造软件“怎么做”的模型描述。 主要任务包括 总体设计和软件详细设计。 总体设计:体系结构、接口、数据设计。 软件详细设计: 模块内部细节设计 模块化设计思想 模块化设计就是把一个大型软件系统的全部功能,按照一定的原则合理地划分为若干个模块,每个模块完成一个特定子功能,所有的这些模块以某种结构形式组成一个整体。 分解、抽象、逐步求精、信息隐蔽和模块独立性,是软件模块化设计的指导思想。 模块独立性的两个度量标准 模块自身的内聚,模块间的耦合 内聚和耦合的含义及各自

m0_51756990的博客 382
上一篇: 软件设计-模块化设计初思考一
JDsen99
博客等级 码龄6年 5粉丝 · 12原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值