V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mokeyjay
V2EX  ›  程序员

感觉自己的架构水平好弱,请问有没有推荐的最佳实践教材?

  •  
  •   mokeyjay ·
    mokeyjay · 2017-01-03 10:30:44 +08:00 · 7308 次点击
    这是一个创建于 2641 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是个普通的 PHP 码农,正式工作一年多一点了

    框架熟练 CI ,会用 yii2 、 TP3/5

    做的项目越多、越大,就感觉自己的架构水平越辣鸡;代码能写、能用,各种编程基本概念都懂,但就是不知道怎么合理运用它们。

    例如让我做个 xx 系统,需求我都明白了,但我总觉得自己写出来的代码不够优雅,尤其是如何划分一些类以及类之间的继承、抽象关系上,要么就是写着写着耦合度又提高了;在数据表设计上也是这样,属于那种 道理我都懂,但就是不知道怎么去做 的感觉

    所以我想问下各位,有没有那种用实际(或虚拟)案例来做分析,教授如何优雅划分类、设计表这样的教材?载体不限,书籍视频都可以,收费也行

    62 条回复    2017-01-12 12:25:14 +08:00
    uxstone
        1
    uxstone  
       2017-01-03 10:39:15 +08:00
    php 不就应该是面条嘛,还能咋地.......
    mikulch
        2
    mikulch  
       2017-01-03 10:44:45 +08:00
    别整这么多没用的

    要想去搞什么优雅啊 耦合度啊 那你得放弃世界上最好的语言,转而去研究世界上最具有模式的语言: java
    你觉得这个代价值得吗。
    klom303
        3
    klom303  
       2017-01-03 10:48:48 +08:00
    尝试下 Laravel 框架,看看源码
    mokeyjay
        4
    mokeyjay  
    OP
       2017-01-03 10:52:59 +08:00
    @uxstone 面条是啥意思?
    @mikulch 你的意思是写 PHP 只要无脑面向过程就行了、完全没必要追求优雅吗?
    @klom303 看过不少框架源码,学到一些模式,但不知该如何合理运用在自己的实际项目中……
    vagasnail
        5
    vagasnail  
       2017-01-03 10:54:39 +08:00   ❤️ 1
    @mikulch Java=世界上最啰嗦的语言。
    peinhu
        6
    peinhu  
       2017-01-03 10:56:16 +08:00   ❤️ 3
    JAVA 跟优雅没有任何关系,就是结构工整、语法啰嗦,追求优雅的话你可以看看 laravel ,关键字 repository ,推荐你看看这个 http://oomusou.io/laravel/laravel-architecture/
    mercurylanded
        7
    mercurylanded  
       2017-01-03 10:56:59 +08:00
    少年听过 DDD 吗
    mokeyjay
        8
    mokeyjay  
    OP
       2017-01-03 10:59:31 +08:00
    @peinhu 谢谢。感觉 Laravel 都快成为优雅的代名词了。不过前阵子鸟哥才说过某优雅的框架执行速度不行啊……
    @mercurylanded 搜了一下,看不太懂,有入门级的教程吗?
    mercurylanded
        9
    mercurylanded  
       2017-01-03 11:04:17 +08:00
    ElmerZhang
        10
    ElmerZhang  
       2017-01-03 11:04:57 +08:00   ❤️ 1
    学架构没什么好教材,最好的办法就是工作中努力把事情做得更好,更接近完美。
    fucker
        11
    fucker  
       2017-01-03 11:07:39 +08:00
    @vagasnail 感觉啰嗦+10086
    otakustay
        12
    otakustay  
       2017-01-03 11:07:57 +08:00   ❤️ 1
    一年多谈啥架构,也没什么教材,架构本身就是掉坑掉得体无完肤总结出来的东西
    mokeyjay
        13
    mokeyjay  
    OP
       2017-01-03 11:08:08 +08:00
    @mercurylanded 感谢,有实际案例就会好懂一些
    @ElmerZhang 说的倒是容易……我也想“努力把事情做得更好,更接近完美”,但并不清楚该怎么做,也不知道这么做到底对不对
    Troevil
        14
    Troevil  
       2017-01-03 11:09:20 +08:00
    优雅 -> scala
    结构 -> java
    denghongcai
        15
    denghongcai  
       2017-01-03 11:22:45 +08:00
    Laravel 性能还好的,用 https://github.com/denghongcai/laravoole 免去框架加载时间
    Allianzcortex
        16
    Allianzcortex  
       2017-01-03 11:23:03 +08:00
    @vagasnail @Troevil 然而 Java 是典型的工业界语言, verbose yet obvious (Scala Cookbook 里的原话哇咔咔)
    feiyuanqiu
        17
    feiyuanqiu  
       2017-01-03 11:40:38 +08:00 via iPhone
    程序设计是从需求分析阶段就开始了...不过现在干 php 的都挺不重视这个的

    设计类最主要的还是需要学习面向对象设计方法论,经典的比如 grasp 的创建者模式和信息专家模式在划分类时都是很有用的指导。这方面可以看看 uml 与模式应用 这本书

    进一步地,可以看看领域驱动设计,尽管可能受限于环境因素不能照搬,但理解它的领域模型聚合实体值对象领域服务领域事件等概念还是挺有用的。这方面的书写得都挺难看的...随便找本书翻翻了解下概念,然后可以去汤老师 cnblogs.com/netfocus 的博客上看看,他的文章写得很好

    最后,我的感觉,不一定对, php 这行业平均水平就这样了,写写过程式代码完成需求就行了,你弄些复杂的概念进来同事不一定看得懂,还影响同事间关系...业务代码翻来覆去就那样,平时工作里干的那些零零碎碎的工作对自己的技术提升真是有限,有时间多学点基础知识,搞点完整的复杂项目,这种提升才是真实的
    kuber
        18
    kuber  
       2017-01-03 12:09:08 +08:00   ❤️ 1
    建议看看“企业应用架构模式”。架构模式很大程度上跟语言无关
    https://book.douban.com/subject/1230559/
    guoer
        19
    guoer  
       2017-01-03 12:19:24 +08:00 via iPhone
    去大公司做大项目
    bzzhou
        20
    bzzhou  
       2017-01-03 12:19:36 +08:00
    才工作一年,别想太多了,多干活多写代码,等你感觉代码哪里不爽了,或者哪里重复工作多了,再去看一些架构的书籍,就水到渠成了
    misaka19000
        21
    misaka19000  
       2017-01-03 12:25:33 +08:00 via Android
    写 PHP 不就是图快吗,还要啥自行车
    glasslion
        22
    glasslion  
       2017-01-03 12:38:17 +08:00
    同推荐 企业应用架构模式, 以及其作者 Martin Fowler 的博客
    jwdstefanie
        23
    jwdstefanie  
       2017-01-03 12:42:15 +08:00
    一年。。 PHP 。。。谈架构。。
    hantsy
        24
    hantsy  
       2017-01-03 12:48:04 +08:00
    语言只是工具,架构方案与语言关系不是特别大。现在 PHP 中的 ZF , Symfony 框架,甚至 PSR (命名都是 Copy JSR )都是从 Java 中获得灵感。

    不要为了什么追求架构,模式,想尽办法去看书,去套用。哲学上这叫形而上学,大部分情况下把简单的事情搞复杂。

    多写写代码,多进行实践,回过头来再去看看那些架构和模式,比较一下自己之前的方法,或许有顿悟的感觉,以后再应用就轻松得多。
    FrankFang128
        25
    FrankFang128  
       2017-01-03 12:49:01 +08:00
    Unix 编程艺术
    zhidian
        26
    zhidian  
       2017-01-03 12:51:59 +08:00
    《重构》。
    bk201
        27
    bk201  
       2017-01-03 12:53:43 +08:00 via iPhone
    一直以为 php 和 jsp 一样,怎么快怎么来
    myoula
        28
    myoula  
       2017-01-03 13:02:36 +08:00
    github 是最好的学习材料 多看看别人的 code
    但也不要太过于追求架构,如果跟同事一起开发,同事为了改代码,打开 7 , 8 个文件才找到真正实现的地方,估计心理要骂娘了。
    phpdever
        29
    phpdever  
       2017-01-03 13:49:37 +08:00
    《架构即未来》
    Time2
        30
    Time2  
       2017-01-03 13:54:52 +08:00
    同 lz 差不多情况, 不过现在看框架的 源码,收获很大啊。
    ubear1991
        31
    ubear1991  
       2017-01-03 13:58:38 +08:00
    一年。。。
    yangxiongwei
        32
    yangxiongwei  
       2017-01-03 14:01:08 +08:00
    一年,还是做 php 的,谈啥架构?

    能快速出活就 OK 了,要啥自行车?
    zuston
        33
    zuston  
       2017-01-03 15:27:16 +08:00
    @peinhu 太偏颇了吧
    mokeyjay
        34
    mokeyjay  
    OP
       2017-01-03 15:43:13 +08:00
    @misaka19000
    @jwdstefanie
    @zuston
    不好意思,我虽然是个普通的 PHPer ,但还是比你们有点志向的
    jswh
        35
    jswh  
       2017-01-03 15:49:13 +08:00
    这种事情,真的需要场景和老师,比较经验向我觉得。多看看别人的源码吧。
    chnhyg
        36
    chnhyg  
       2017-01-03 17:16:32 +08:00
    架构这个东西不是刻意就能学来的,工作中项目中可以多思考,而不仅仅是完成任务就行了。
    a15819620038
        37
    a15819620038  
       2017-01-03 17:25:15 +08:00
    架构?还是结构?

    我猜楼主想问的是『怎么在代码里把类组织好』。

    除了多写,额,多写也没用,得看写什么东西。

    多造轮子,从零早起,慢慢就有感觉了。
    zuston
        38
    zuston  
       2017-01-03 17:43:29 +08:00
    @mokeyjay 写 php 几年,现在也写 python,java,scala ,何来比我有志向,哪看出来的? laravel 的架构同时也是模式复用的结果, java 也有,语言之争也没啥意思。我是没看懂你 @我干嘛?
    huijiewei
        39
    huijiewei  
       2017-01-03 17:48:41 +08:00 via iPhone
    架构和语言无关
    架构是一步一步演进出来的

    加油吧,先从重构做起,先把代码做到可测试化
    yura93
        40
    yura93  
       2017-01-03 17:52:03 +08:00
    架构要结合业务吧,适合业务场景的架构才是好的
    Felldeadbird
        41
    Felldeadbird  
       2017-01-03 17:54:02 +08:00
    架构就是你写代码的经验啊。 这东西是随着你开发经验来完善的。即使你看完了世界名师的架构框架,你没有从实践中总结出经验,你写出来的代码和现在的水平是相差无几的。
    winiex
        42
    winiex  
       2017-01-03 17:58:23 +08:00
    你指的是代码层级的设计,这个和我们常规意义上说的架构联系不大。单说代码层级的设计的话,多写多修改,有经验了深刻理解下设计模式、重构,再反过来指导改进代码。再就是多看别人写的好代码,依葫芦画瓢。数据库的设计先读一本经典的教材,从了解范式入手。

    进入实践-读书-反馈到实践中的优化循环就上路了。

    书就先不推荐了,你应该已经有了比较多的代码实践,可以先了解常见的设计模式,然后读一个 mvc 、依赖注入类框架的源码。 PHP 系的可以看看 laravel 的源码。
    winiex
        43
    winiex  
       2017-01-03 18:05:09 +08:00
    然后就是一些依靠自己平时多关注的最佳实践的积累了,比如看了 laravel model 的设计后你就会发现,一个关系型数据库表在设计字段的时候通常会加入 id 、 createdAt 、 updatedAt 、 deletedAt 等必要字段,然后自己思考后考虑到数据会存在类型、状态,所以每个表还会添加 type 、 status 字段。后来你又看到互联网 web 领域的后端应用一般要求最终一致性并注重低延时,所以你就取消了外键字段,用单独的 id 字段来记录记录之间的关系。

    没有多大诀窍,花时间去积累去关注。
    xiparos
        44
    xiparos  
       2017-01-03 19:27:47 +08:00
    xiparos
        45
    xiparos  
       2017-01-03 19:28:01 +08:00
    BigDipper7
        46
    BigDipper7  
       2017-01-03 20:37:36 +08:00
    @winiex 问个问题哈,我还没到架构这个层面,咳咳 取消外键字段的话,那么数据一致性靠代码来保证么,咳咳咳,而且外键依赖不是只影响写入效率么,不影响读吧😊
    mhycy
        47
    mhycy  
       2017-01-03 21:08:25 +08:00
    “看需求”

    不要为了应用某种设计模式而强行编码,有时候面条代码(面向过程)反而是更合适的实现方式。
    每一种开发理念都有其合适的应用场景的。
    ( JAVA 啰嗦,但是在合理设计文档充分的前提下, JAVA 很适合开发健壮性足够高的业务代码。)
    konakona
        48
    konakona  
       2017-01-03 21:24:24 +08:00
    我就给你一个意见:你不要只看 PHP 好吗?
    jeremaihloo
        49
    jeremaihloo  
       2017-01-03 21:26:27 +08:00 via Android
    从最近看 C#的 Orchard2 得到的经验是,多看优质的代码,受益匪浅
    theohateonion
        50
    theohateonion  
       2017-01-03 21:30:14 +08:00
    架构这个东西和设计模式一样,属于一套形而上的东西,更像是先人把自己的经验进行总结后的产出。所以最好的方式毋庸置疑是看源码
    tairan2006
        51
    tairan2006  
       2017-01-03 21:39:15 +08:00
    看框架源码
    eyp82
        52
    eyp82  
       2017-01-03 23:08:09 +08:00
    个人感觉不用刻意追求这些东西:
    1. 平时多看好的项目的代码, 感觉到了自然就到了
    2. 可以追求好的架构, 可能会得不偿失
    3. 有时候是真没时间搞什么好架构
    mokeyjay
        53
    mokeyjay  
    OP
       2017-01-03 23:43:14 +08:00
    @a15819620038 对对,我确实是想问“怎么在代码里把类组织好”以及“如何设计数据表”
    @zuston 额不好意思我点错了
    @huijiewei 请问“可测试化”是指单元测试吗?
    @winiex 感谢耐心回答,这么多人都推荐 Laravel ,我一定要去看看
    dai269619118
        54
    dai269619118  
       2017-01-04 09:21:57 +08:00
    真考虑框架的速度,还不如自己写最基本的 mvc 比 85%的框架速度都快
    zscself
        55
    zscself  
       2017-01-04 09:41:35 +08:00
    来呀,一起写 Java 呀。[滑稽]
    misaka19000
        56
    misaka19000  
       2017-01-04 10:50:57 +08:00
    @mokeyjay PHP 我也写过,写完之后发现这货真的是天生就是为 Web 而生的,而且 PHP 的优势就是快,写起来简单,架构能力这种反而是 PHP 的短板,放着 PHP 的长处不用为什么非要去发扬它的短处呢

    如果非要谈这些架构,为什么不用 Java , Python 这种语言呢
    Miy4mori
        57
    Miy4mori  
       2017-01-04 15:53:35 +08:00 via Android
    想要入门架构设计,推荐你读读软件架构设计,当然,如果你想要的其实是实现整洁优雅,你可能需要的是 effective 系列而不是学架构设计
    Miy4mori
        58
    Miy4mori  
       2017-01-04 15:57:02 +08:00 via Android
    @mokeyjay 如何设计数据表这是需要经验和结合业务来谈的,如果你想要避免设计出反人类的表,你可以读读 SQL 反模式这本书,还是有点用的,至于如何设计出最适合业务的,这个一般没有书讲,只能你自己去深入了解业务,或许可以查查领域模型设计相关的资料。
    winiex
        59
    winiex  
       2017-01-04 17:55:55 +08:00   ❤️ 1
    @BigDipper7 一致性是分几个级别的,一般来说,除了类似于支付宝设计资金流转这样的一致性极敏感业务, web 后端的一致性要求都不高,在 CAP[1] 中 Web 后端应用舍弃了 C ,而强调 A 、 P 。

    至于不用外键,这个原因很多,你可从 Web 后端应用的特点与外键的优劣来理解,可以参考这个[2]。举个例子, Web 后端的业务决定了删除数据记录以置脏位为实现,外键也受到了类似的限制。带外键的表写入效率低下是主要原因之一,外键不能支持后端数据库服务水平扩展(简单描述的话就是加机器)也是一个重要原因。

    [1] http://julianbrowne.com/article/viewer/brewers-cap-theorem
    [2] http://stackoverflow.com/questions/83147/whats-wrong-with-foreign-keys
    BigDipper7
        60
    BigDipper7  
       2017-01-05 00:20:52 +08:00
    @winiex 谢谢大佬,嘎嘎,从来没想过这个,涨姿势了 😄
    garveen
        61
    garveen  
       2017-01-11 16:21:43 +08:00
    @denghongcai 抓了个现行 /滑稽
    denghongcai
        62
    denghongcai  
       2017-01-12 12:25:14 +08:00
    @garveen 略有点尴尬,把 fork 版本发出来了 https://github.com/garveen/laravoole
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   953 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 115ms · UTC 21:48 · PVG 05:48 · LAX 14:48 · JFK 17:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.