代码架构设计-1.为什么要做好代码架构设计 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
yeyuexia
V2EX    程序员

代码架构设计-1.为什么要做好代码架构设计

  •  
  •   yeyuexia 2017-12-13 14:47:06 +08:00 3066 次点击
    这是一个创建于 2867 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前写的东西 分享一下,大家可以来讨论讨论:) 原文链接

    在项目的开始阶段,一件必不可少的的事情就是就是确定代码的分层和架构。该分层和架构在一定程度上决定了未来整个项目的代码风格和维护性,对于项目的长期维护,代码架构的设计是一件非常重要的事情。 在介绍代码架构的设计之前,首先我们先谈论下为什么代码架构的设计师是一件非常重要的事情。

    为什么要有代码架构

    简单来讲,代码架构是为了提供更好的可读性和可维护性。

    提高可读性和可维护性

    大家可能还记得刚开始写代码的时候,所有的代码都会集中在一个文件,甚至一个函数中,比如:

    # main.py def main(args: List[str]): input args validation... ... do first thing... ... do second thing... ... do third thing... ... 

    随着需求的增长,代码量的扩大,这样的代码是很难阅读和进行维护的,于是我们会使用重构的手段去让代码更便于维护和阅读:

    # main.py def do_first_thing(args: List[str]): ... def do_second_thing(args: List[str]): ... def do_third_thing(args: List[str]): ... def validation(args: List[str]): ... def main(args: List[str]): validation(args) do_first_thing(args) do_second_thing(args) do_third_thing(args) 

    进一步,我们将代码分散在不同的文件、文件夹中,通过良好的命名,我们甚至可以在不去看具体的代码实现的情况下,仅仅通过文件名就能判断出在做的事情:

    │ main.py │ ├───job │ first.py │ second.py │ third.py │ └───validation input_params_validation.py 

    而更深层次的,代码架构的设计会降低代码的腐化速度

    降低代码的腐化速度

    通常在一个项目新起的时候,项目代码的可读性,维护性都会做的很好,然而随着项目的庞大,不同背景不同能力的开发人员的进场和离场,代码的可读性和可维护性都会渐渐的变差,这个是一个项目进行过程中不可避免的,聪明的团队通常不但会制定一系列的比如代码质量扫描,代码 review 等手段降低代码的腐化速度,还会在在需求的开发过程中安排一定资源的代码重构的任务,去不断重构腐化的代码。 而一个好的代码架构,也会在一定程度上制约开发人员“生产”腐化代码的可能,从而降低了代码的腐化速度。这是因为在制定了代码架构之后,入场的开发人员们通常会选择遵从代码架构的规则编写代码,通过规则的制约,可以很好的制止一些不谨慎的代码的产生。 我们通过一个反例来看看,一个不好的代码架构会对项目的开发产生怎样的影响。 在一个真实项目中,大家制订了一个这样的简单代码架构: 项目代码使用简单的 Controller->Service->Repository->Entity 分层,其中 Entity 层作为数据库的映射,并且整个代码架构中,可以随意传递 entity, 甚至直接将 entity 传递出去

    这样的代码架构会导致以下几个问题:

    1. 没有 DTO 的存在,开发人员会因为方便倾向于把 entity 直接丢出去作为 request 和 response 的数据映射。这样当出现传入参数和数据库 table 设计出现不一致时,会出现很多的代码问题。
    2. 由于并没有任何相关的约束并且由于#1,开发人员有可能将业务逻辑相关的代码同时放在 controller 和 service 中。这种做法会导致 controller 和 service 层出现强耦合,并且业务逻辑被分散在代码的各个角落,导致很难去阅读进一步降低可维护性。
    3. 由于代码的事务控制是在 service 层做的,因为#2 的原因,很多人在开发过程中并没有一个对系统的全局概念,直接导致了很多的业务代码出现了只能部分回滚数据的问题,直接导致的很多 bug 的出现。

    由上文可以看到,一个好的代码架构设计对于项目的必要性。接下来将介绍在 web service 中,比较常使用的代码组织架构。

    10 条回复    2017-12-14 00:13:44 +08:00
    liuxu
        1
    liuxu  
       2017-12-13 14:53:47 +08:00
    不好好设计,以后有填不完的坑
    Kilerd
        2
    Kilerd  
       2017-12-13 15:46:16 +08:00
    我以为你说得是通用架构,原来是 web 框架。
    hcnhcn012
        3
    hcnhcn012  
       2017-12-13 16:02:42 +08:00 via iPhone
    有没有通用架构啊,或者是书的推荐,这个问题一直没有细学,感觉太重要了
    zjsxwc
        4
    zjsxwc  
       2017-12-13 16:09:58 +08:00
    以前我也有楼主这种架构的困惑, 后来代码看 /写多了, 也就知道好的架构到处都是 mvc 类似的架构, 而且是 mvc 里面套 mvc,

    比如框架 mvc 里的 view 层可以对"渲染数据"继续套 mvc 的方式来构造各种要求格式的渲染数据, model 层也一样可以对不同数据源套 mvc 来构造 model
    exch4nge
        5
    exch4nge  
       2017-12-13 16:22:05 +08:00
    感觉很多实际的中小型项目中都是为了 MVC 而 MVC,为了分三层而分三层,不管项目大小,不管开发团队构成,只是为了一句“项目架构用了 XXX ”。

    个人认为架构设计在满足项目需求以及适合开发团队的前提下,尽量减少各种抽象层,团队内制订好每个层的职责与范围并熟知比较重要一些。
    yeyuexia
        6
    yeyuexia  
    OP
       2017-12-13 16:39:42 +08:00
    @hcnhcn012 企业软件架构模式? 好像是这本书
    yeyuexia
        7
    yeyuexia  
    OP
       2017-12-13 16:41:10 +08:00
    @zjsxwc 我其实没明白你的意思 233
    yeyuexia
        8
    yeyuexia  
    OP
       2017-12-13 16:43:13 +08:00
    @Kilerd @hcnhcn012 不存在一个通用架构
    或者说一个通用架构一定不是一个好的架构
    所有的架构设计都是取决于你的业务场景甚至项目、人员配置的情况的
    我等下可以把第二篇发出来 233
    kaneg
        9
    kaneg  
       2017-12-13 18:42:46 +08:00 via iPhone
    降低代码的腐化速度,这个说法很好。很多开发人员不知道架构设计的好处,拿到需求撸起袖子直接开干,到处挖坑埋雷。
    之后要么自食苦果,要么甩包袱给继任者。
    micean
        10
    micean  
       2017-12-14 00:13:44 +08:00
    代码这个东西,带着强迫症去写,写多了自然就有感觉
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2729 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 14:02 PVG 22:02 LAX 07:02 JFK 10:02
    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