当需求发生变更或者环境发生变化时,系统是否可以快速得到调整,就体现出系统的可修改性。好的系统要求可以方便快速修改。

系统的任何部分都是可修改的,需要关注的是修改的成本(代价问题)

 主要表现在:在系统稍微变更时不影响用户使用;对用户而言,改变系统的基本设置等;对管理员来说修改用户的权限等;

引起系统修改的两个因素:

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后处理优化相关参数----------------------------------
View Code

 

② 防止连锁反应:

  比如:尽可能对接口编程,且维持接口规格不变。每个模块对外公开尽可能少的信息,隐藏一切不必要的信息。将核心业务和非核心业务分离,应用和数据要分离,服务和实现细节分离,前台和后台分离

打印、爬取、分类都进行了分离

③ 推迟绑定时间。将有可能的修改,尽量用配置文件,或者其他后期让非开发人员可调整的方式实现。

将数据库可能发生的修改放在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&amp;characterEncoding=utf-8</property>
     </default-config> 
 </c3p0-config>
View Code

 

框架级可修改性:平台代码、应用代码、后台模块代码分离。

根据场景、调用后台模块出参入参可配原性修改,服务变更无需通过编码即可修改。