优先使用接口,还是优先复制代码? (coupling? v.s. copying )

发布时间: 2014-05-10 23:45:00

今天遇到个问题:  ( today I met a problem: --- exactly, yesterday.)

有两个子系统: A , B。  我希望在A中使用B的一个既有的功能。 B中的这个功能,以接口的形式提供。  ( I have 2 systems: A and B. I want A has a function that B already implemented as a HTTP interface) 

A 和B共用一个数据库(也就是说,A可以直接读取B的数据) ( A and B share a same database ) 

问题: 是应该让A通过 http 直接访问B的接口, 还是把B的代码复制到A中,让A直接调用?  ( my question is: how to choose? (1) let A visit B's http interface  (2) copy B's code to A. )

答案: (my final solution) 

最理想的情况下,如果B系统永远稳定运行,接口永远不变,那么必然使用第一种办法。 ( if B is promised to run 24x7 , and its interface will never change, let's choose option(1) ) 

但是实际情况是:B的接口不稳定,可能会当机, 为了让A自己保持稳定(与B系统解藕),所以我的选择是在B中做个重构,把代码逻辑放到 client.rb文件中,然后把这个client.rb文件复制到A中,这样A就可以直接使用这个文件了。(更合适的办法,是把client.rb这个文件 做成一个gem, 这样A和B的代码就可以做到同步了) (but in the real world, B's interface is not stable at all, it may changes, it may get down. To make sure A is decoupled from B, I firstly did some  refactoring(move method from controller to model) , then copied B's model to A. (they have the same infrastructure, so the model code could be reused without any modification)  Now A has the same code with B)  --- and another thing, if I could make that duplicated-code a rubygem, then things will be perfect. )  

结论: 思路不能教条,要根据实际情况选择最合适的 办法。  ( conclusion:  there's no silver bullet, let's choose the best approach by the real situation. )