“是故百战百胜,非善之善者也;不战而屈人之兵,善之善者也。” ——《孙子兵法·谋攻篇》
一场战役,以多胜少与以少胜多相比,后者更为胜。
软件开发犹如一场战役,投入的资源好比是兵马,所要开发的软件好比是要打的一场战。软件规模越大,战役的范围也就越大,时间也就越长。
考虑一个通信协议软件,从上至上包括应用层、封包层、通信层,其实现应用消息收发,令这三层的核心处理函数分别为A(msg), B(msg), C(msg)。
可以采用简单的实现方法:
A(msg)
{
B(msg)
{
C(msg);
}
}
即:用户只需将应用消息传入应用层,自动一层层组包并发送;对于从外部设备收到的消息反向处理即可。这种方法的不足之处是各层之间紧耦合,例如在没有封包层的应用中,需要修改核心代码。这时可以考虑采用以下方法:
也可以采用
应用层和封包层之间采用消息队列MQ1,以及封包层和通信层之间采用消息队列MQ2,这样可以实现协议层之间的松耦合。这时的实现方法为:
A(msg);
get msg from MQ1;
B(msg);
get msg from MQ2;
C(msg);
对于从外部设备收到的消息反向处理即可。
协议的灵活性以增加额外的消息队列为代价,其不足如下:
1. 增加了代码量,开发周期变长
2. 容易引入更多的错误
3. 维护成本变高
4. 需要对更多的错误进行防护
5. 增加了测试工作量
6. 在冗余(例如双机热备)系统中,主备间需要同步更多的内容,稳定性变低
在简单与灵活性的考虑上,需要权衡灵活性所带来的负面影响,然后再决定战役规模,“不战而屈人之兵”方为上策。
[未经作者许可 不得转载]