在一次编程比赛中,题目要求是对字符串进行排序:
排序规则:
1) 数字按数字大小排序,0多的排在前面;例: 01 1 2 10 001 -> 001 01 1 2 10
2) 字母,则AA排在aa前面,大写字母在前;例:Aa b a B Cd c -> Aa a B b Cd c
3)字母优先级最低,其次是数字,其它字符按ACSII码的顺序排列。
一开始拿到这个问题,我首先想到的是如何进行架构设计。这个设计过程经历了两个阶段。
第一阶段设计:
将这一次排序过程分解成三个部分:
输入 -> 处理 -> 输出
然后分别将这三个处理进行抽象化,但这个封装变化出现了点问题,三个处理过程怎么进行抽象化,怎么将这三个抽象化整合呢?
第二阶段设计:
对第一阶段提出的问题,将一次排序过程抽象化,相应的输入、处理、输出也抽象化,以属性组的形式展示:
输入:(浏览器输入,文件导入)
处理:(小数据量排序算法, 大数据量排序算法)
输出:(浏览器输出,文件导出)
排序过程为一个关系,一次排序过程则为一个元组
输入 | 处理 | 输出 |
浏览器输入 | 小数据量排序算法 | 浏览器输出 |
浏览器输入 | 小数据量排序算法 | 文件导出 |
文件导入 | 小数据量排序算法 | 文件导出 |
文件导入 | 大数据量排序算法 | 文件导出 |
一次排序过程桥接这三个处理,封装变化,封装三个处理之间的消息,这样就使得架构可以对扩展开放
但这里会有个问题:处理依赖输入处理的返回结果,导致这种变化不是那么固定,有一定的耦合