想请教下各位大手子 如何把代码写得很"工程化" - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
www5070504
V2EX    程序员

想请教下各位大手子 如何把代码写得很"工程化"

  •  
  •   www5070504 2020-05-27 10:19:16 +08:00 5342 次点击
    这是一个创建于 1970 天前的主题,其中的信息可能已经有所发展或是发生改变。

    lz 写 python 两年了 总感觉代码不够工程化(对比 java 或 c ) 有点随心所欲的意思 现在就想规范下自己那些不好的习惯 请问下各位有什么技巧或者见解么

    第 1 条附言    2020-05-27 12:26:32 +08:00
    给每个回复的老哥点赞 多谢各位的建议

    虽然知道了方法论 但是感觉还是好难啊

    还是多谢各位老哥
    30 条回复    2020-05-28 12:46:09 +08:00
    www5070504
        1
    www5070504  
    OP
       2020-05-27 10:19:44 +08:00
    先谢谢各位老哥
    kop1989
        2
    kop1989  
       2020-05-27 10:29:08 +08:00   1
    不懂 python
    但是从方法论上讲,无非就是高内聚、低耦合、可读性高。
    xuanbg
        3
    xuanbg  
       2020-05-27 10:31:51 +08:00   1
    不用奇技淫巧,老老实实写:容易读懂,容易维护,容易扩展,稳定可靠的代码。
    q8164305
        4
    q8164305  
       2020-05-27 10:33:25 +08:00 via Android   3
    先保证不写重复代码,你自然知道如何工程化
    opengps
        5
    opengps  
       2020-05-27 10:34:31 +08:00 via Android   1
    我写代码就是如此,当年用非常原始的代码风格撑起了几十万的 GPS 并发,后来终于有资深一点的工程师参与,做了几层拆分,不过反而从此不在追加新功能了,毕竟框架的意义是多人分工,而不是让编码更灵活
    guolaopi
        6
    guolaopi  
       2020-05-27 10:36:14 +08:00   1
    想起了两个大佬撕逼,
    一个说都 21 世纪了,js 的 express 还直接把所有业务逻辑都写到一起。
    另一个说:是,我不用写一个方法都要封装几十层的类,
    (滑稽
    nightwitch
        7
    nightwitch  
       2020-05-27 10:38:49 +08:00   1
    -Werror
    ytmsdy
        8
    ytmsdy  
       2020-05-27 10:39:08 +08:00   1
    python 的话,别写一些花式语法就好了。
    vitoliu
        9
    vitoliu  
       2020-05-27 10:41:41 +08:00   1
    @opengps 原始代码,几十万 GPS 并发,拆分,框架。
    vitoliu
        10
    vitoliu  
       2020-05-27 10:42:10 +08:00
    @opengps 真大佬
    opengps
        11
    opengps  
       2020-05-27 13:00:57 +08:00 via Android
    @vitoliu 其实很小的,4 层通信不像 7 层那么浪费资源,我从前东家走的时候已经上百万设备了,用了也就 100 台左右低配 ECS 服务器分流负载
    SpiderXiantang
        12
    SpiderXiantang  
       2020-05-27 14:13:30 +08:00 via Android   1
    玩一下 tdd
    zhuangzhuang1988
        13
    zhuangzhuang1988  
       2020-05-27 14:27:43 +08:00   1
    python 的话学 tornado 下呗
    wmhx
        14
    wmhx  
       2020-05-27 14:30:54 +08:00   1
    多看看大佬的代码
    newdongyuwei
        15
    newdongyuwei  
       2020-05-27 15:30:46 +08:00   1
    整体架构搞好,把 lint 和 test 加上。工程化就是既要开发效率 /迭代速度,也要代码质量。这些是通用的,跟用不用 Python 没有关系。好的开发框架其实就为工程化打好了基础。
    tt67wq
        16
    tt67wq  
       2020-05-27 17:03:18 +08:00   1
    把你觉得工程化的代码抄过来,说是你写的
    seki
        17
    seki  
       2020-05-27 17:04:18 +08:00
    买一本代码大全看看吧
    fancy2020
        18
    fancy2020  
       2020-05-27 17:07:14 +08:00   2
    设计一个功能的时候多想想“意外情况”,我觉得工程化的很重要的一方面就是对错误分支的处理
    laike9m
        19
    laike9m  
       2020-05-27 17:16:46 +08:00 via Android   2
    工程化的核心就两条:可读性、可扩展性(或者说 easy to change )。

    做到这两点基本上就没什么问题了。这也是为什么我很烦一些 Java 的范式(比如 Guice ),为了一些所谓的便利严重牺牲了代码可读性,当然深层原因还是语言本身。就 Python 来说,主要还是不要沉迷黑魔法,尽可能用大家都看得懂的方式写代码,不要老想着做一行超人。如果一定要用,就多写点注释吧。

    至于可扩展性,个人觉得主要还是跟具体场景有关。虽然也有些通用原则比如高内聚低耦合啥的,但落实到具体的项目,还是依赖于你首先把整个逻辑理清楚,再考虑哪些东西是未来有可能要变的。
    nuistzhou
        20
    nuistzhou  
       2020-05-27 17:27:18 +08:00 via iPhone   1
    因为经验的关系,单纯看好的代码你可能无法 get 到那个点,去看看<Clean Code>吧,至少对我挺有帮助。
    noobcoder1
        21
    noobcoder1  
       2020-05-27 17:41:14 +08:00   1
    多封装,多抽象,撸码前多考虑一下现在和将来就行了....不要为了工程化而工程化,稳定才是第一位
    wleexi
        22
    wleexi  
       2020-05-27 17:54:36 +08:00   1
    PY 确实不那么容易的工程化吧,JAVA C 这俩都有业界规范,老哥学一个玩玩感受下?
    Nostalgiaaaa
        23
    Nostalgiaaaa  
       2020-05-27 18:20:12 +08:00
    https://github.com/Nostalgiaaa/foreman_pylint

    不要脸的发个小工具,多用代码质量检查工具,多分分层啥的。
    SorcererXW
        24
    SorcererXW  
       2020-05-28 00:43:06 +08:00   1
    @q8164305 #4 不是不写重复代码就是好的工程代码,(尤其是新手工程师)从一开始就各种封装抽象,导致扩展性不够,后期需求变动导致更难修改。
    23571113
        25
    23571113  
       2020-05-28 01:25:34 +08:00 via Android   1
    工程=业务逻辑+框架。业务逻辑靠刷题,框架设计模式八股文。
    evaseemefly
        26
    evaseemefly  
       2020-05-28 08:30:55 +08:00
    也在关注这个
    lancelock
        27
    lancelock  
       2020-05-28 09:00:12 +08:00 via iPhone
    感觉 java 的做法有点过头了
    xavierxiu
        28
    xavierxiu  
       2020-05-28 11:04:32 +08:00
    @opengps 不是 QPS 吗
    opengps
        29
    opengps  
       2020-05-28 11:23:28 +08:00
    @xavierxiu GPS 终端业务,从我名字可以联想下,我不是在说 QPS 指标,按照业务场景转化下,可以认为是十分之一到 20 分之一的终端数可以约等于 QPS
    AvenirX
        30
    AvenirX  
       2020-05-28 12:46:09 +08:00 via iPhone
    楼上都是工程大神...
    我的建议是根据实际需求来,不要为了“工程化”而去“工程化” 不然适得其反。写了一段只会用到一两次的过程化的代码,何必搞成各个模块条条框框?以后你还能看懂吗?

    某段代码每次随着需求改来改去?某些功能需要复用到另一个工程?有些参数牵一发动全身?... 有了这些需求你再去请教应该用什么方式去优化。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2494 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 10:46 PVG 18:46 LAX 03:46 JFK 06:46
    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