当需求发生变更或者环境发生变化时,系统是否可以快速得到调整,就体现出系统的可修改性。好的系统要求可以方便快速修改。
系统的任何部分都是可修改的,需要关注的是修改的成本(代价问题)
主要表现在:在系统稍微变更时不影响用户使用;对用户而言,改变系统的基本设置等;对管理员来说修改用户的权限等;
引起系统修改的两个因素:
l 用户需求l 系统内在需求
可修改性战术分为3类:(无论是局部化修改还是防止连锁反应,都是基于“高内聚,低耦合”思想)
- 局部化修改
- 防止连锁反应
- 延迟绑定时间
① 局部化修改:修改限制在一小组模块之内
维持语义一致性:模块中的责任能够协调一致的工作,不需要过多的依赖其它模块
预期期望的变更:淘宝网,用户变多,成交量变大,需要修改原有的mysql数据库。
泛化模块:模块设计的越通用,发生变更对模块影响就越小
限制可能的选择:在设计的时候对模块功能和它的可变范围进行限制,会降低这些修改所造成的影响
(这是之前看的一个python代码,这里边的变量、路径放在了一个.py文件中,都可以直接修改,不影响其他地方的代码):
# -----------------------路径相关参数--------------------------------------- train_ct_path = 'D:\BaiduNetdiskDownload\Training_Batch1\media\nas\01_Datasets\CT\LITS\ct' # 原始训练集CT数据路径 train_seg_path = 'D:\BaiduNetdiskDownload\Training_Batch1\media\nas\01_Datasets\CT\LITS\seg' # 原始训练集标注数据路径 test_ct_path = 'D:\BaiduNetdiskDownload\LITS-Challenge-Test-Data-20180512T073105Z-010\CT' # 原始测试集CT数据路径 test_seg_path = 'D:\BaiduNetdiskDownload\LITS-Challenge-Test-Data-20180512T073105Z-010\seg' # 原始测试集标注数据路径 training_set_path = 'D:\train' # 用来训练网络的数据保存地址 pred_path = 'D:\test\liver_pred' # 网络预测结果保存路径 crf_path = 'D:\test\crf' # CRF优化结果保存路径 module_path = 'D:\model\net550-0.028-0.022.pth' # 测试模型地址 # -----------------------路径相关参数--------------- ------------------------ # ---------------------训练数据获取相关参数----------------------------------- size = 48 # 使用48张连续切片作为网络的输入 down_scale = 0.5 # 横断面降采样因子 expand_slice = 20 # 仅使用包含肝脏以及肝脏上下20张切片作为训练样本 slice_thickness = 1 # 将所有数据在z轴的spacing归一化到1mm upper, lower = 200, -200 # CT数据灰度截断窗口 # -----------------------网络结构相关参数------------------------------------ drop_rate = 0.3 # dropout随机丢弃概率 # -----------------------网络结构相关参数------------------------------------ # ---------------------网络训练相关参数-------------------------------------- gpu = '0' # 使用的显卡序号 Epoch = 1000 learning_rate = 1e-4 learning_rate_decay = [500, 750] alpha = 0.33 # 深度监督衰减系数 batch_size = 1 num_workers = 0 pin_memory = True cudnn_benchmark = True # ---------------------网络训练相关参数-------------------------------------- # ----------------------模型测试相关参数------------------------------------- threshold = 0.5 # 阈值度阈值 stride = 12 # 滑动取样步长 maximum_hole = 5e4 # 最大的空洞面积 # ----------------------模型测试相关参数------------------------------------- # ---------------------CRF后处理优化相关参数---------------------------------- z_expand, x_expand, y_expand = 10, 30, 30 # 根据预测结果在三个方向上的扩展数量 max_iter = 10 # CRF迭代次数 s1, s2, s3 = 1, 10, 10 # CRF高斯核参数 # ---------------------CRF后处理优化相关参数----------------------------------
② 防止连锁反应:
比如:尽可能对接口编程,且维持接口规格不变。每个模块对外公开尽可能少的信息,隐藏一切不必要的信息。将核心业务和非核心业务分离,应用和数据要分离,服务和实现细节分离,前台和后台分离
打印、爬取、分类都进行了分离
③ 推迟绑定时间。将有可能的修改,尽量用配置文件,或者其他后期让非开发人员可调整的方式实现。
将数据库可能发生的修改放在c3p0-config.xml配置文件中,可以减少部署时间,甚至没有变成基础的人员也可以实现对数据库配置的修改。
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="user">root</property> <property name="password"></property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/reci?useUnicode=true&characterEncoding=utf-8</property> </default-config> </c3p0-config>
框架级可修改性:平台代码、应用代码、后台模块代码分离。
根据场景、调用后台模块出参入参可配原性修改,服务变更无需通过编码即可修改。