软件设计-模块化设计初思考一
模块化设计
说明:模块化设计,简单地说就是程序的编写不是开始就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来,
并定义和调试好各个框架之间的输入、输出链接关系。
逐步求精的结果是得到一系列以功能块为单位的算法描述。
以功能块为单位进行程序设计,实现其求解算法的方法称为模块化。
模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化。
改变某个子功能只需相应改变相应模块即可。
最近在设计软件,突发奇想,把自己的模块化设计的思考记录下来
首先
在需求分析时,应尽可能的了解所有可能的功能,以及日后可能扩展的功能
当我们整理出所有功能时,应对其中的功能,进行模块化,(若是经验足够,完全可以自顶向下,直接模块化思考。)对于新手而言,最简单的方式是,列出所有的功能,并对其分类,抽象。
举例
我们从一个软件的开始模块(个人模块)进行分析,对于个人模块,我们可以分析出以下功能
- 登录
- 注册
- 忘记密码
- 冻结
- 申请解冻
- 审核用户状态
在 登录 中 涉及到验证方式 :
- 账号验证
- 邮箱验证
- 手机号码验证
- 。。。(其他可以追加思考)
在 注册 时 验证用户唯一性
- 邮箱验证
- 手机号码验证
- 。。。(QQ, WeChat … and so on)
在 冻结与解冻 中 有个 状态提醒
- 邮箱提醒
- 手机短信提醒
于此同时
在 登录、注册、冻结与解冻中:
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、高复用
日后,从新设计软件,可以直接把整个模块 搬动,只需要更改具体实现即可,无大改动。
最后
对于面向接口编程,模块化设计,第一次思考总结,日后,更新