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

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

模块化设计

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

最近在设计软件,突发奇想,把自己的模块化设计的思考记录下来

首先

在需求分析时,应尽可能的了解所有可能的功能,以及日后可能扩展的功能
当我们整理出所有功能时,应对其中的功能,进行模块化,(若是经验足够,完全可以自顶向下,直接模块化思考。)对于新手而言,最简单的方式是,列出所有的功能,并对其分类,抽象。

举例

我们从一个软件的开始模块(个人模块)进行分析,对于个人模块,我们可以分析出以下功能

  • 登录
  • 注册
  • 忘记密码
  • 冻结
  • 申请解冻
  • 审核用户状态

登录 中 涉及到验证方式 :

  1. 账号验证
  2. 邮箱验证
  3. 手机号码验证
  4. 。。。(其他可以追加思考)

注册 时 验证用户唯一性

  1. 邮箱验证
  2. 手机号码验证
  3. 。。。(QQ, WeChat … and so on)

冻结与解冻 中 有个 状态提醒

  1. 邮箱提醒
  2. 手机短信提醒

于此同时
在 登录、注册、冻结与解冻中:
1、可以抽象出一个 Verify 接口
具体 实现 可以为

  • 邮箱验证
  • 手机号码验证

2、可以抽象出一个 Sender 接口
具体 实现 可以为

  • 邮箱发送
  • 手机号码发送

所以在用户模块中 会聚合 Verify 的具体实现
Sender 的具体实现

另外
对于发送的内容 我们可以通过 配置文件 配置 ,当我们模块多的时候可以 将 配置 抽象
—>配置类

代码

Verify 接口我是这样设计的

package com.ss.account.verify;

public interface Verify {

    boolean verifyAccount(String account);

}

Verify 接口 实现类

package com.ss.account.verify;

public class MailVerify implements Verify{

    @Override
    public boolean verifyAccount(String account) {
        //TODO 
        System.out.println("verifyAccount : " + account);
        return true;
    }
}

Sender 接口

package com.ss.account.sender;

public interface Sender {

    //发送消息
    boolean sendMessage(String account, String message);

    //发送内容
    boolean sendVerifyCode(String account,String code);

    //内容验证
    boolean checkContent(String content);
}

Sender 接口 抽象实现类 因为对于内容的验证 所以 具体实现都可以有个默认实现(这里以 内容长度小于两百 为例)

package com.ss.account.sender;

public class AbstractSender implements Sender{
    @Override
    public boolean sendMessage(String account,String message) {
        return false;
    }

    @Override
    public boolean sendVerifyCode(String account,String code) {
        return false;
    }

    @Override
    public boolean checkContent(String content) {
        return content.length() < 200 ;
    }
}

AbstractSender抽象实现类 的 具体实现

package com.ss.account.sender;

public class MailSender extends AbstractSender{

    @Override
    public boolean sendMessage(String account, String message) {
        checkContent(message);
        System.out.println("send message : " + message);
        return true;
    }

    @Override
    public boolean sendVerifyCode(String account, String code) {
        checkContent(code);
        System.out.println("send verify code : " + code);
        return true;
    }
}

主类

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);
    }
}

模块 需要初始化 所以有个init 方法
对其 属性进行赋值

优势

这么的模块化设计 好处
1、高扩展性
所有的具体实现可以 选择 扩展
2、高内聚,低耦合 。(再想想)
其他模块 与此模块 无关,
3、高复用
日后,从新设计软件,可以直接把整个模块 搬动,只需要更改具体实现即可,无大改动。

最后

对于面向接口编程,模块化设计,第一次思考总结,日后,更新

上一篇:统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序


下一篇:ss