我们在开发中可能会遇到这样一类问题:
1 你需要分步骤录入一个几页信息的大数据表
2 系统会根据输入数据根据某种规则分析出结果报表
3 结果需要持久化
4 结果可以修改
5 结果报表可以根据规则重新生成
6 每个输入有唯一的一个对应的报表
7 分析规则是容易测试的
我在解决这个问题的时候花了很多的时间,绕了个大弯,后来才发现是策略的问题,把最终设计的结果整理下:
Problem
用户记录整个过程的表,每次处理都有这么一张表:
account_id, 用户ID
input_id, 输入
output_id, 输出
stage, 目前阶段(等待输入,输入完毕,处理完毕)
problem_version 版本
StorageSource
如果采用横表,字段为
quest1,quest2....,questn...,profile_stage,created_at,updated_at
one_to_one Problem
如果是竖表
problem_id, quest_key, quest_answer, created_at, updated_at
这种设计灵活,但是存取操作相对复杂
many_to_one Problem
ReadableSource
将StorageSource表和其他信息包装到一个ReadableSource表中,作为分析输入依赖的唯一类
ViewableResult
Analyzer
将业务规则封装到该对象,采用builder模式来设计
builder.read(readable_source)
builder.build_first_stage
builder.build_second_stage
viewable_result = builder.viewable_result
StorageResult
将输入结果ViewableResult持久化