有必要对代码中的业务逻辑做类似的抽象吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
revlis7
V2EX    问与答

有必要对代码中的业务逻辑做类似的抽象吗?

  •  
  •   revlis7 2015 年 1 月 11 日 4937 次点击
    这是一个创建于 4068 天前的主题,其中的信息可能已经有所发展或是发生改变。
    举个例子,公司现有Web项目中有图书类的栏目,包括有图书信息、审核、上传、网友点赞评论群组以及一系列的后台管理等等功能。

    现在新的需求是准备开设电影栏目,而功能和原有的图书类“基本”保持一致。那么为了尽可能的重用现有的图书类的功能,我们打算扩展现有的图书类,增加一个称为“媒体”的新类,并添加一个Type字段来区分图书或者电影或者以后任何其他类型的扩展。这么做就可以避免重写那些已经在图书中实现过的那些功能。(听上去这么做应该很快,实际上未必如此,你要面对在刚开始做图书功能时留下的一些Hardcode)

    我的疑问是,目前这么做的前提条件是以保证图书和电影这两类功能基本一致作为前提的。如果一旦业务需要根据不同媒体类型做出改变(这种情况几乎是一定的,对吧), 那就又要从原有的逻辑中分离出不同的情况来处理,这就等于又走了回头路。

    既然会有这样的情况发生,那么是不是直接复制一份原有的图书的代码,重命名为电影,然后稍加整理代码中的名称,这样岂不是更简单?虽然这样做听上去很没有技术含量,但是至少可以轻松面对业务在任何一边发生变动,都不会影响其他功能。虽然从程序员的角度来说,同样的代码你可能有了两份拷贝,增加了维护的成本,从直觉上会有一种去合并他们的冲动,但是从业务逻辑上来说,他们毕竟是两个不怎么相关的东西(尽管会有人向你保证它们之间的功能很“像”),你很难预测产品那边会把需求改成什么样子。

    另外,对于拷贝代码的做法可能说的有点简单,事实上可能不会真那么简单去做,比如上传功能就可以作为一个公共组件抽象出去、群组、评论等等周边功能都可以抽离出去,包括看不见的缓存等等,而和图书、电影相关的一些最基本的代码还是保持分离,这样做是不是一个更正确的姿势?

    (举例中关于图书、电影的需求内容只是我虚构的,不用纠结)
    4 条回复    2015-01-11 16:05:04 +08:00
    chone
        1
    chone  
       2015 年 1 月 11 日 via iPhone   1
    如果不想维护老的业务逻辑了可以这么干,但如果还要持续下去,重构增加一层抽象是必要的,不然这样的copy试想一下要对图书和新业务增加功能那不是每次都要copy相应的逻辑,这样两头维护会是个很大的负担。
    JamesRuan
        2
    JamesRuan  
       2015 年 1 月 11 日 via Android   1
    我觉得应该把业务逻辑拆分成最小单元,而且是数据无关的。有新业务时,只需要对原有的逻辑组合做出调整。
    面相向象用成了面向数据,才是这个问题出现的原因。如果把业务逻辑本身当做对象来做,把数据部分抽象出去,就不存在这个问题了。
    时间充裕的应该是个重构的好时机了。
    tini8
        3
    tini8  
       2015 年 1 月 11 日   1
    业务逻辑千万别抽象,除非你是上帝
    levn
        4
    levn  
       2015 年 1 月 11 日   1
    mixin?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1053 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 56ms UTC 18:48 PVG 02:48 LAX 10:48 JFK 13:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86