设计乱谈

原创 2007年10月05日 17:16:00
    php由sapi,main,zend和ext组成,php应用由哪些组成?地基+上层建筑。所谓地基就是各个应用间共有的那些部
分,像现在流行的很多php框架就是试图给你打个地基。我不大喜欢别人给我打地基,所以平时都是自己打地基,自己打的
地基牢与不牢自己最清楚。我爸是个建筑家,他建房子的能力在我们小镇也是赫赫有名了,从小耳濡目染,导致我也对打地
基搞建筑很感兴趣,现在把这股劲弄到打软件地基上来,看能打出个啥地基出来,嘿嘿。
    这个地基应该怎么打?说实话这非常依赖经验。纯理论派的家伙,别看他口若悬河讲起理论来滔滔不绝,你一让他给你
写一个出来看看,他立马消失;纯实战派的家伙怎么样,对比想象一下便知,在此不在废话。我不喜欢蛮干,所以我推崇的
是中庸之道:理论与实践相结合。
    看过一堆框架后相信很多人多少都对什么控制器、视图、模型之类的东西有点熟悉了,在此也不多说。我想说的是,把
眼光放远一点,放灵活一点,放实际一点。又远又实际?这不是矛盾么?那可未必。面向对象是不是较新的开发方式?看着
那么多粉丝前扑后继“奔向”软件开发的“真理”,我倒开始打退堂鼓。当然,你可以认为我面向对象能力不过关:)然而翻开
人月神话,感受感受真正的大师对面向对象开发方式的淡然的态度,我忽然觉得以前对面向对象开发的狂热是多么幼稚……
    实际上我想说的是,面向对象不过是一种普通的软件开发方式,而且它的名字取得很莫名其妙,什么是“面向”对象?
为什么是“面向”而不是“背向”?这很滑稽,所以我宁愿称之为“对象化”编程,以跟“结构化”编程相对应。对象又多少种
呢?在php里,基础设施大部分是地基对象。注意,我说的是“对象”,而不是“类”。我很反感讨论对象时把类扯进来。php
程序的一次运行就像一个士兵到一个城堡内送一封信,得到城主的处理后把结果送回,从进城门到出城门这一过程就是php
脚本的执行过程。它的本质就是“过程”,不认识这个本质的设计注定是失败的。这个过程你会怎么设计?这就跟打基础一
样啦。你会想,可能会有两个士兵守城门,进了城门后有向导,向导会问你有什么事,然后告诉你怎么走,走到目的地后
又有士兵拦住你要证明,通过证明后才让你进入办事处,然后才是实际的事务,完成事务后一路返回,向各个守卫告别,
最后离开城门:整个过程就是php脚本的执行过程。
    发觉我经常走题万里,看,什么是灵活一点什么是实际一点,怎么打地基,都跑九霄云外去了,抱歉抱歉。实际上,
灵活,实际等概念跟其它众多优秀设计理念完全是融合在一起的,不好单独抽出来说明而不涉及其它概念,但基于这些互
相融合的概念,设计出来的系统却是非常灵活的系统,具有非常低的互相纠缠关系,用术语说,是“耦合”关系。“零件”
是极富表现力的隐喻,一个系统的动作都是由零件组织起来的。OK,回到城堡的例子,前面说的守卫啊,向导啊就是各种
各样的零件。零件需要“类”吗?直接来看,不需要,它们各成自的职责,管它什么类不类。当你真正需要具有相同职责的
多个零件时,你才真正需要类。我认为就php的执行模式来看,它应该添加一个编程元素:对象,然后赋给它各种修饰,
如抽象对象啦,抽象接口啦,等等。偏偏php那班开发人员死脑筋,一味只知道照搬其它语言的概念,对“建设有php特色
的编程模式”没有冲劲。。
    好了,不再瞎扯了:)回到城堡上来。刚进门需要一个人接待你,不管你要什么,你总是要进门的嘛,所以初始检查
就是这个守卫的责任了,放在php里,就是所谓的index.php,所有的请求统一由它来接收。这个守卫要做些什么,有哪
些职责,都需要你这个设计师来设计。如果这个人不符合进门标准,那么不好意思,只能请你回去了,呵呵。如果通过了
检查,守卫可能要根据你的要求来选择为你服务的后续人员,比如你只认识英文,那我当然要给你布置英文环境了,呵呵。
向导又做什么呢,它要根据你想去的目的地为你指路,所以它需要知道你的目的地,和一张城堡地图。如果在城堡地图里
找不到你要去的地方,那么sorry,您来错地方了:)地图是一件公有物品,因为如果有谁要告诉这个卫兵另一个目的地
的话,它都必须是在地图里明确标明的一个地方。对比到php里,你很容易就能知道这是一个dispatch+route的过程,
呵呵。所以开发这些名词的那些家伙也只是借了些隐喻而已,没什么大不了的,只要你想象力丰富,你完全可以颠倒这个
一般的城堡规则,按你的意思来构建属于你的城堡规则 :P
    指令操作数据这种方式,跟数据本身具有绑定的指令这种方式,有什么本质的区别?没有质的区别。你可能会跟我
说在认知上有区别,对,但这种区别我认为并没有想象中的那么大,只是把主动权倒了一下而已,并没有多少神奇的能
力和效果。面向对象编程实在是被吹得太过了。
    不觉得?再看看《领域驱动设计》里的服务。你觉得服务操作实体是不是跟指令操作数据非常相像?这是一个非常
大的讽刺,面向对象的终点,却是它们所不屑的“指令操作数据”的编程方式!呜呼,“面向对象技术并没有给我们带来
‘神奇的效应’,不管开发商如何吹嘘面向对象OO(Object-Oriented)工具是多么万能,也不管那些OO狂热者是多么毅
然地前赴后继,这方面的数据从20世纪80年代以来并没有发生大的改观”。
    反观目前的php框架,有多少是遵循了软件设计和对象式编程的精髓呢?很遗憾,没有。Zend Framework?不客
气地说,它连幼儿都算不上,还只是个婴儿,而且是个委员会产品,跟软件艺术相差几万光年。
    我不喜欢在领域层乱搞对象,这样你只会给自己带来麻烦,你很难灵活地把它们保存到数据库中。虽然我不喜欢过
早优化,但即便是不优化,对象映射到关系也是件很麻烦的事情,如果再需要为了性能进行数据库重构,引入各种不合关
系数据原则的修改,则情况会更糟。软件开发的首要使命就是降低复杂度,对象关系映射却成功地把复杂度提高到了一个
新的高度。当然你熟悉了ORM,小系统开发起来非常快,但不要把这套经验照搬到大负载系统里来,这样你会死得很惨。
    再看看RoR,它现在已经为了迎合所谓的“企业级应用”而“成功地”变得越来越复杂,等着看它被彻底抛弃吧。

 

QString乱谈(2)

长期以来,很多人都清楚,一旦C++源码中直接使用了中文,这样的源码想要跨平台(I18N)会非常困难。 随着: Windows下:MSVC2010成为主流Linux下:GCC升级到4.6 C+...
  • dbzhang800
  • dbzhang800
  • 2012年05月07日 03:02
  • 21741

乱谈

毕业都3个月了
  • qq_33417690
  • qq_33417690
  • 2016年10月11日 17:13
  • 33

qmake 乱乱乱谈(三)

接前面的qmake 乱乱乱谈(一)以及qmake 乱乱乱谈(二),本文看看qmake中的函数(Manual中有的就不重复了)。 函数分两种: 内置函数 (qmake Manua...
  • dbzhang800
  • dbzhang800
  • 2011年09月08日 22:04
  • 5311

qmake 乱乱乱谈(二)

接前面qmake 乱乱乱谈(一),继续看看qmake。 暂定主题:qmake之命令行参数及qmake启动时加载了什么东西,或许可以借此学习一下qmake是处理命令行参数的方法 命令行参数 ...
  • dbzhang800
  • dbzhang800
  • 2011年09月08日 00:38
  • 12125

qmake 乱乱乱谈(四)

继续qmake,本文主题:低调的 TEMPLATE = subdirs 非常非常常用的一个东西,可是manual中却介绍的很少,太低调了。在编写包含多可执行文件、库、插件 的程序时,一直不敢相信su...
  • dbzhang800
  • dbzhang800
  • 2011年09月09日 23:26
  • 5914

qmake 乱乱乱谈(一)

不想太深入地去看qmake,可是,左等,右等,总不见Qt新的构建系统有什么新消息。还是整理一下qmake吧,由于没什么主题,还不知道本文最终会乱到什么程度。 注:你可能会对下面的内容感兴趣。 ...
  • dbzhang800
  • dbzhang800
  • 2011年09月07日 21:38
  • 9507

乱谈手机客户端的设计

谈手机客户端的设计。接触才1周,我就敢谈~~整理一下思路,为以后鄙视现在的初级阶段做个铺垫。 互联网的一些事   抛开产品本身不谈,手机客户端要从几个方面综合考究,才能做出精彩的东西。手机端...
  • ihrthk
  • ihrthk
  • 2012年08月01日 21:40
  • 1094

乱谈权限管理

做一个系统。权限管理是必不可少的。特别是WEB开发。以下是我自误自乐写的权限管理。欢迎大家拍砖。。在我看来,权限分为两种:资源权限和操作权限。平时我们说某种角色在特定的系统中有添加或者是删除某个数据的...
  • kemy88
  • kemy88
  • 2007年03月16日 22:46
  • 733

乱谈CEGUI

 乱谈CEGUI cwindow继承于cpropertyset,cpropertyset有一个函数可以添加新的property到集合中:add_property为了强化控件的能力,可以通过为控件建立新...
  • i53nd
  • i53nd
  • 2009年01月22日 04:52
  • 491

jQuery乱谈(六)

接上一篇:jQuery乱谈(五),今天分析removeClass()、removeProp()、toggleClass()、val()。   removeClass(): /** * ...
  • xuxu198899223
  • xuxu198899223
  • 2013年04月28日 10:20
  • 230
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计乱谈
举报原因:
原因补充:

(最多只允许输入30个字)