首页 > C/C++, IT趣事, 软件工程 > 由换座便器冲水管想到的软件开发中的接口设计

由换座便器冲水管想到的软件开发中的接口设计

2012年10月3日 发表评论 阅读评论 1295次阅读    

前段时间家里的座便器按下去后好一阵子才能弹起来,其影响为:
1. 声音很大吵人;
2. 随机出现弹不起来,得再去按一下才行;
3. 浪费水资源;
因此必须换了,之前一直没有时间,正好国庆在家没有出去玩。目测是因为里面的冲谁管弹簧坏了,所以到外面的水暖店里面买了个冲谁管,老板说都是通用的(赞),样子如下图:

座便器内部冲水管

座便器内部冲水管

刚才在家换时,发现无法将旧的整个冲水管扭出来,目测因为太久了,里面的螺丝生锈了,如上图的3号部位年久生锈,螺丝无法扭出来了。无奈中想来硬的,整个用力弄出来算了,应该不会搞坏什么其他东西!但想想,不行,这样不保险,不小心弄坏哪里了说不定得这几天到外面上厕所,风险太大。
于是仔细观察新买的上图的座便器,发现其实2号和3号之间,只要相反方向扭90度,然后往外拉就能把2号和3号分开!
然后俺想到其实现有冲水器坏的地方是2号部位,3号虽然生锈但依然可以使用,这样是不是只要把旧的扭出来(如果旧的设计也是可以扭出来的,并且新旧两种大小一致的话),一试,果然可以!
于是就顺理成章的把新的1,2号部位跟旧的3号部位衔接在一起了!装好盖子,测试正常,没有发现bug !
然后就震惊于这么简单的座便器,还能做的这么potable,兼容性那么好,新的跟几年前的规格还能保持那么紧密的一致,赞!
然后,然后就想到了我们写代码的时候,接口设计上面的事情了····

下面总结一下在代码中看到别人的,自己的各种各样此类的问题:
1.接口设计前后不兼容。
一开始的设计人员完全没有考虑到今后这个接口的扩展需求,以及业务方面的改变,导致今后有新的需求或增强,只能用:interface(***), interface2(***),来应对,然后告诉使用方,旧的接口使用旧的,新的接口使用新的,请使用方在XX天内将线上的老版接口改为新接口·····崩溃了····
类似的还有:foo.php?arg=xxx -> foo.php?cmd=xx --> foo.php?req=xxx&req2=xxx ```, aaa(1,2) -> aaa(1,2,3) -> aaa_my() ````

2.reserved字段基本没用。
看linux内核代码里面其实很容易见到很多地方都有类似reserved字段的设计,于是有些开发人员也想,我的协议格式里面也加个reserved字段吧。然后发现,丫的协议都改了好几版了,这个字段硬是没有用,而宁愿大动干戈,增加了个新的字段,君不知这样会对其他人有影响呀,坑爹啊!
可能有人会说,向JSON,XML类似的可扩展的协议格式,增加个字段是太容易了,不用向C++,C那样麻烦。可是亲知道吗,如果使用方依赖于这个呢?比如我的代码里面会首先对从客户端传过来的所有字段做严格的校验,以保证不会对系统有安全性的威胁等。因此我们不能依赖于这些外部的东西··

3.刚接手旧项目,由于进度紧张,不敢改动原有代码。
这种情况我在工作中时有遇到,当时那个激动啊,就想打电话给离职的前同事骂架····然后我发现代码中有这样的文件,或者函数:
foo.php , foo2.php, foo3.php 还有:aaa(),aaa_new(),aaa_new_new(), aaa_my(),····再看下去就抽筋抽过去了···

4.觉得前人写的代码有问题,于是勇敢的重构了协议和接口···
这个问题有好有坏。如果这些协议,接口有许多人使用,那我觉得最好不要改格式,尽量的保持向前兼容,向后兼容比较难。不然容易把新的user 给吓跑了,毕竟谁也不想用你的接口,过个月你却告诉他:“喂,哥们,这个接口换了,你记得改一下吧”。这个又想起前阵子同事的项目中,发现升级了别人的接口后,某个查询接口耗时太久,查了很久才查出来,于是没办法只能退回到老版接口继续使用。

5.sorry,我得做饭去了···其实还想回顾一下动态链接库里面的接口设计原则的,下回有时间整理了发上。

ps:讲到这里,强烈推荐一本很给力的书:《大规模C++应用程序设计》,该书作者功底相当丰厚,全书就讲了2个事情:
1.程序的物理设计问题;
2.程序的逻辑设计问题;

从程序的源代码级别的兼容,降到二进制级别兼容,接口设计,函数设计,模块设计等,应有竟有!
强烈推荐,打个广告:如果你想让自己码代码的速度有个质的飞跃,那么就读读这本书吧!
好吧,其实读者也知道的,我读了,但却没有飞跃···

Share
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。