我感觉有时候往往出现这种情况,代码越美观,结构越好,或者用了更多的设计模式,会大大的增加人对业务逻辑的学习和接收难度,这是怎么回事? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fucktwice
V2EX    问与答

我感觉有时候往往出现这种情况,代码越美观,结构越好,或者用了更多的设计模式,会大大的增加人对业务逻辑的学习和接收难度,这是怎么回事?

  •  
  •   fucktwice 2013-08-20 09:40:34 +08:00 3479 次点击
    这是一个创建于 4441 天前的主题,其中的信息可能已经有所发展或是发生改变。
    也就是说,好的代码容易会把业务逻辑分散开来,在不断进化过程中.
    我有点好奇和郁闷
    18 条回复    1970-01-01 08:00:00 +08:00
    ipconfiger
        1
    ipconfiger  
       2013-08-20 09:58:21 +08:00   3
    这个时候说明你已经被“设计模式”带沟里去了,哈哈。
    fangzhzh
        2
    fangzhzh  
       2013-08-20 10:32:00 +08:00 via Android
    设计模式一般就是把易变的东西抽象出来 抽象一层复杂一层
    luikore
        3
    luikore  
       2013-08-20 10:53:01 +08:00
    "美观", "好" 是因人而异的主观概念
    抽象必然导致难懂, 设计模式, 是给不懂抽象的人来装懂用的
    otakustay
        4
    otakustay  
       2013-08-20 11:43:10 +08:00   1
    学习和接受难度是一回事,学完了以后的工程效率是另一回事
    学习曲线陡峭不代表完成学习后依旧要艰难地进行开发
    工程师最终负责的应当是整个系统、产品的生产效率,而学习只是其中的一部分,并不是全部
    fucktwice
        5
    fucktwice  
    OP
       2013-08-20 14:43:49 +08:00
    @otakustay 哥,给个结论呗
    otakustay
        6
    otakustay  
       2013-08-20 15:42:43 +08:00
    @fucktwice 结论我已经表达了啊,代码美观、结构好,代码的仅仅是“学习难度有所提升”,但学习完成后,开发的效率是有非常大的优势的
    比如不美观结构一条线的代码,学习只要10天可以上手,以后一个功能开发5天
    而美观结构好的代码,学习用了40天,以后一个功能只要2天
    这么一算,10个功能是一个转折点

    所以我还是更倾向于代码美观和结构合理,除非你们想当临时工
    levn
        7
    levn  
       2013-08-20 16:14:22 +08:00
    应该有结构好同时也更容易理解的吧。
    chisj
        8
    chisj  
       2013-08-21 12:38:21 +08:00
    模式就是为了让代码更好理解和维护的,不然就是耍流氓。
    ksc010
        9
    ksc010  
       2013-08-21 13:28:36 +08:00
    @otakustay 同意
    其实就类似于使用 vim和记事本的区别
    luikore
        10
    luikore  
       2013-08-21 13:34:58 +08:00
    @otakustay 易学不代表容易维护, 但以为难学就容易维护升级就错了...
    luikore
        11
    luikore  
       2013-08-21 13:51:54 +08:00
    @ksc010 模式和 vim 完全相反: 用了模式后, 总代码量会增加, 但用了 vim, 总按键量会减少.

    如果一个模式可以重用, 它就是个 api call 而不是模式了. 模式说白了就是复制粘贴一坨东西然后改改名字调个顺序, 这就违反了软件设计的三原则(DRY, KISS, YAGNI)之一: don't repeat yourself.

    随着编程语言不断添加特性和库的增强, 需要用到模式的场景会越来越少. 语言的特性需要学习去理解, 模式就是个类比根本就不存在学习这回事(个别名字起得很晦涩的模式除外)... 模式在不会模板元编程的 C++ 程序员和不会函数式编程的 java 程序员中特别流行. 就 java 说, 很多模式要做的事情现在直接加个 annotation 就可以了, 不需要一遍又一遍的重复拷贝那些错漏百出的实现...
    fucktwice
        12
    fucktwice  
    OP
       2013-08-21 14:33:28 +08:00
    @luikore 模板元编程 这个本来就需要花很大功夫去学习的, 你说的是把代码的重复用语言特性去减少,但是大多数的语言在OO方面都是类似的.
    这个....
    otakustay
        13
    otakustay  
       2013-08-21 14:36:08 +08:00
    @luikore 赞同“难学就容易维护升级就错了”,但这并不代表“难学就一定不易维护升级”,一定的学习代价确实能换来未来维护升级的优势,我个人也并没有针对楼主单个案例来表明“一定是后续易维护所以你要忍受着”这样的态度,可能是信息传递有些问题。

    另外,如果说模式就是“复制粘贴一坨东西然后改改名字调个顺序”,只能说对模式的理解还只限于照着书抄Design Pattern的程度,尚为肤浅。

    语言和库的增强,只是将模式变得更容易使用(通过语言特性等解决,比如事件之于观察者),但并不代码就不用模式。如果没有对观察者模式的理解,一个工程师可以设计出使用事件的系统?总之我不这么认为。
    luikore
        14
    luikore  
       2013-08-21 15:02:07 +08:00
    @otakustay 反了, 是先有工程师设计出了使用事件的系统, 然后才被人总结成设计模式...

    在表达力比较弱的语言里, 用设计模式写的 XxxSingleton, 就得自己写 getInstance. 抄/背诵/IDE生成和拷贝粘贴是一回事.

    用元编程实现的 XxxSingleton, 你不用自己写 getInstance, 它实际上就是个 API call 了, 叫不叫设计模式都没影响, 也避免了无谓的重复.
    otakustay
        15
    otakustay  
       2013-08-21 15:06:39 +08:00
    @luikore 设计模式和模式是两回事,事件系统的出现就代表了“观察、订阅、分发”这一模式,随后被总结为“设计”模式,仅仅是挂了个名字并总结出一个共性

    我们一直在谈的,是“模式”,而不是“设计模式”,这两者有很大的区别。无论是架构、设计还是开发过程,模式是始终贯穿的,而设计模式仅仅是对模式的一种常见的表达方法,取其优而去其粗即可。

    所以我才说对“模式”理解成“复制粘贴一坨东西然后改改名字调个顺序”,那就等同于把“模式”和“设计模式”混为一谈,并不是一个值得推广的思路吧
    msg7086
        16
    msg7086  
       2013-08-21 15:32:21 +08:00
    比如说吧,RoR,之前我学习的时候感觉非常累。但是做开发的时候用PHP写很久的代码,RoR很快就能写完了,各种框架包办。大概就是类似的感觉吧。
    luikore
        17
    luikore  
       2013-08-21 15:41:54 +08:00
    @otakustay 我一直指的设计模式. 广义的"模式", 含义太广泛, 不是 well-defined 的概念没什么好讨论的...

    一种是正常人的思路, 看到问题去想怎么解决, 然后自然形成的代码结构和项目结构, 容易看懂容易改.

    一种是架构太空人的思路, 先套用各种模式作出结构来, 再把问题交给别人解决, 太空人的理解(我们常常把"习惯"当"理解"用)和一般人区别越大, 就越难看懂和修改.
    luikore
        18
    luikore  
       2013-08-21 16:15:02 +08:00
    @otakustay “观察、订阅、分发”模式 也是一个类比的设计模式(有人会把它升华到"夹沟模式"), 除此之外什么都没有说, 看到的人可能以为自己"理解"了, 但其实最后看代码才知道是什么回事. 两个人脱离实际讨论一个假大空设计模式, 很可能说的完全不是一回事, "这类概念可以交流"是个错觉而已.

    光就 pattern 这个词来说, 在 "设计模式", "代码模式", "模式识别", "模式匹配", "正则模式" 语境下意思各不相同. 还有博大精深语把 mode 也翻译成 "模式", 进一步把浆糊搅得更浑, 造成微妙的"深刻"的错觉. 你说的"模式"如果不是设计模式, 那到底是什么? 如果没有一个人人都同意的准确定义, 那这个概念就是不值得讨论的, 也无法对我们的代码产生有意义的影响.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2625 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 14:25 PVG 22:25 LAX 07:25 JFK 10:25
    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