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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    如果非要谈这些架构,为什么不用 Java , Python 这种语言呢
        57
    Miy4mori   2017-01-04 15:53:35 +08:00 via Android
    想要入门架构设计,推荐你读读软件架构设计,当然,如果你想要的其实是实现整洁优雅,你可能需要的是 effective 系列而不是学架构设计
        58
    Miy4mori   2017-01-04 15:57:02 +08:00 via Android
    @mokeyjay 如何设计数据表这是需要经验和结合业务来谈的,如果你想要避免设计出反人类的表,你可以读读 SQL 反模式这本书,还是有点用的,至于如何设计出最适合业务的,这个一般没有书讲,只能你自己去深入了解业务,或许可以查查领域模型设计相关的资料。
        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
        60
    BigDipper7   2017-01-05 00:20:52 +08:00
    @winiex 谢谢大佬,嘎嘎,从来没想过这个,涨姿势了 😄
        61
    garveen   2017-01-11 16:21:43 +08:00
    @denghongcai 抓了个现行 /滑稽
        62
    denghongcai   2017-01-12 12:25:14 +08:00
    @garveen 略有点尴尬,把 fork 版本发出来了 https://github.com/garveen/laravoole
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1074 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 82ms · UTC 18:51 · PVG 02:51 · LAX 10:51 · JFK 13:51
    ♥ Do have faith in what you're doing.