呃。。。jhwh兄,这就是你的不对了。大家好端端的在讨论学术问题,放什么暗箭呢。看了这里,我又用暗箭的眼光回头去看了看之前的贴子。还真是好理解了一点。所谓暗箭,就是要中的人不知哪里放的(有果无因);看见你放的人都不知道你要射哪里(有因无果);就算中的人知道是你放的,也不知道箭是怎样飞来的(有果有因没中间)。在此,我收回之前关于jhwh兄表达方式的所有说话并表示抱歉。说到底不是jhwh兄一时疏忽没有关照过我的理解水平,也不是我的理解能力极其低下。其实是jhwh兄的暗箭水平高超,有意为之而且完全达到了目的。自然在面对客户进行需求分析时能做到收放自如。
不过话说回来,以jhwh兄的中文功底,难道真的觉得将“然而”改成“但是”,“暗箭”前面加上“这些”(前面已经提过“一些”了,因此已经知道是复数),“毫无意义”之前加上“力量白费了,也就”,会有很大分别吗?看了这段话,一般人着意的地方是“到底有哪些暗箭”?jhwh兄又没说,也许这段话本身就是暗箭吧?
我觉得我们讨论到现在,我对jhwh兄一开始声称“楼主根本不懂设计”背后的原因已经比较清楚了。虽然对jhwh兄的某些观点还是有点疑问,有些地方不敢苟同。但这已经是枝节问题。记得我在第一篇向jhwh兄发问的贴子里提到过关于“没有对话平台”的三种可能。现在我已经基本可以确定,是属于第二种情况。因为从回贴看来,深得OO真义的jhwh兄已经是站在神的位置去宣布“尔等凡人皆有原罪”了。被神一般的人物说“你不懂设计”,根本无损于我们凡人原本的标准。这的确是我现在心中所想。因此,我觉得已经没有必要在这个问题上进行更为深入的讨论了。毕竟我占着楼主的场子与神对话也快有三四千字了。到了现在这个深度,一来我觉得已经大致了解的jhwh兄要表达的意思和建议,二来对于观众来说原来不懂的地方还是不懂,原来已经懂了的,在这个层面上也未必就肯轻易接受我们的观点。发展下去不免要变成毫无建设性的侃大山了。我是问题不大,正好练习中文能力。但纠缠不休不免惹人讨厌。如果jhwh兄不怕浪费时间,楼主也没有意见,我还是乐意继续讨论下去的。看楼主和jhwh兄的意思了。
不过既然已经成为jhwh兄暗箭的靶子,就此溜走好象有点滑头。我看这样吧,我这次尝试去找出jhwh兄的暗箭,看看对不对。在楼主未表态之前,不再回贴了。(关心技术问题的朋友,本贴不涉及技术,不想浪费时间可以跳过了)
暗箭一:
“万能药与软件开发之间的关系,在当前的语境下以及万能药的内涵外延,我们都能明白。”
字数少,结构清晰,逻辑清晰。但jhwh兄故意不用,而用
“第一句的万能药与软件有什么关系,第二句是病句,但是我们都能明白它的含义,就是因为语言的内涵、外延和语境。”
这种转折关系长句加插入从句再加因果关系的复杂句式。在简明的表达方式下,关于“第二句是病句”这个插入语的表达完全不见了。
以jhwh兄对中文标点的水平,不会不知道中文插入语一般用破折号。但jhwh兄特意选用了英文长句一逗到底的方式。令我以为后面的“它的含义”是指“病句”,而没想到原来是指隔了半个屏幕宽度之前的“万能药与软件的关系”。
至于把逗号当问号,我倒没有犹豫过。jhwh兄引用的这一句,前面其实还有一截:“看看引用的两句话,第一。。。。”,于是下文的“第一。。。”“第二。。。”都变成了“引用的两句话”的宾语补足语,按中文惯例,标点应该跟随主句语气。所以jhwh兄在这里虽然字面上用了逗号,但我无法判断“第一。。。”这个从句的实际语气。这一箭水平高超,我完全上当,以为“它”是指“病句”。所以前面关于第一句的东西就与主题意义无关了。于是只好发挥之前把“影响”还原为“印象”的容错能力,私自根据我所理解的内涵外延和语境把逗号“还原”成问号了。而jhwh兄放着有“万能药与软件开发之间的关系”不用,而用“有什么关系”,令我以为是问句,也许也是暗箭吧。
暗箭二:
“改为‘你觉得思维跳跃,是技术上的差距造成的,而不是因果关系没写明白。’”
如果我有神一般的技术,在jhwh兄最初一篇“楼主根本不懂什么叫设计”的时候就应该彻然大悟了。但是我没有,因为技术差距所以我对jhwh兄的因果关系不太明白。我强调一下,是“我弄不明白”,不是jhwh兄没写明白。jhwh兄不是在写,是在放暗箭。但我开始时不知道,所以尝试去理解。既然技术问题是硬伤,我只好老实说,“jhwh兄你的因果关系我不明白,能不能说清楚点呢”,这样我才能学会技术,去理解你的因果关系。但我当时不知道,神的职责并不是要去引导凡人脱离困惑,而是要去警示凡人:你只不过是个凡人,不要企图仰视神明。
暗箭三:
从“有什么直接关系呢”(我的原话)到“怎么没有关系?”(jhwh兄的话)。两句相减,差为“直接”。
我从来没有否认过“类是用来表达概念”这句话的正确性,也没有否认过它跟分层有一定关系。于是后面的“除非。。。”就成为了暗箭。讨论到现在,大致上我觉得jhwh兄的思路是1. “类是用来表达概念的”,同时2.“表达层,逻辑层和数据层是三个不同概念”,所以3.“任何应用程序一定要分成三层”。关于1和2,我多次说过,我认为面向对象和分层没有必然关系,不用面向对象方法,也可以分层。用了面向对象方法,未必就是分层。而jhwh兄对这个问题并没有正面讨论过,不过我大概可以想象出,jhwh兄会说“如果你真的这样认为,那么你还没理解OO与分层的根本”,而我会天真地问“那么OO和分层的根本是什么呢?”,jhwh兄会傲然回答“根本就是‘类是用来表达概念的’”。于是又绕回去了。
“类是用来表达概念”这句话是绝对正确的,因为一开始面向对象中类的概念就是这样创造出来的:将概念设计中属于同一概念的数据与操作捆绑封装起来。这句话的寿命可以说与面向对象历史一样长,而并不是某些OO之神在后来通过经验总结出来救世真言。这句话从一开始就伴随着面向对象而来,如果它能解决一切问题,我们今天也不会在这里讨论这些东西了。根本问题就在于,“概念”这个东西本来就是主观的。许多概念可以用一个大概念来概括;一个概念也可以拆成许多小概念。也就是所谓“粒度”的问题。粒度的划分也是主观的,正如我问jhwh兄,何为“最小粒度”,jhwh兄说:
“最小”不是“小得不能再小,绝不可再分的地步”这样一个简单的概念。现在的“最小”没有标准,得靠经验。根据类本身特征,以及当前的目标,做到这个类本身应该做的事情,而不考虑其他,大概就这样。不过度,粒度越小,重用性越高,这是大家都知道的。所有,懂设计的人,知道怎样的类是粒度最小,什么时候设计什么粒度的类。
说到底,就是主观的经验(*不是我的看法*)。于是jhwh兄实际的推理是:
1.“类是用来表达概念的”,
2.“概念的划分是要靠经验的”,
3.“懂设计的人知道怎样的类是粒度最小,什么时候设计什么粒度的类”,
4.“我是懂设计的人”
5.“我觉得任何时候都要分开表达层,逻辑层与数据层”,
6.“因此任何应用程序一定要分成三层”
(其中第4点,鉴于jhwh兄是OO之神,此条是公理,毋须证明)
关于,“好了,如果还没明白,我确实说不出更多了,不然就不会有牛人写厚厚的一本书来阐述了。”,虽然希望渺茫,但我还是希望jhwh可以告诉我这本支持你论点的书的书名,作者,出版社。你的论点——也就是我的论点“不能为三层而三层”的反命题——是“任何商业应用必须使用三层”。
(或者按jhwh兄的习惯写成: 你的论点,也就是我的论点“不能为三层而三层”的反命题,是“任何商业应用必须使用三层”。)
===================================================
暗箭我能明显看出的就这么一些,其他还有一些也是枝节问题,没必要谈了。但看到jhwh兄热心地为mcd一书写了大段评论,忽略不提不太好。因此简单列出一些不同意见。
1. “我上面帖子说的意思,是指我不想重新做这那些已经做过的事情。不是你说的这个意思。”,我想具体问一下,当时那个项目,总复杂度有多大?如果总复杂度很大,那么不在讨论范围,我强调过这种情况下应该用三层。如果总复杂度不大,那么你的三层项目改数据库字段的实际的改动复杂度有多大?在这些改动的复杂度中,有多少是因为这个“应变机制”本身造成的呢?请注意,我说单层,是指“在表达层出现数据逻辑,例如SQL语句”而已,并不是一堆乱七八糟的源程序到处复制粘贴。
2. “从你看 modern c++ design的说明来看,你没明白什么是gp。”, 这与jhwh兄最初的贴子,“从楼主的文章来看,楼主不懂设计”一样,对不起,由于我的技术水平有限,看不懂前因后果。(下一句引用的句子不是我看mcp的说明,是我对C中一些技术的先进性与历史性的看法而已。)
另,你问“这是你的看法吧?”,答,是的,因为我那时是看着这些概念产生和发展的。当然,OO之神如果认为对于一介凡夫的看法毋需举证反驳,只要说一声“你有这样的看法,看来你没明白其他语言为什么在GP出来那么久一直不引入GP的原因。”,我完全接受。
对于“Design Pattern只是惯用法的总结,只是出书晚而已,和gp是不同意义的东西。”。我没说过它们是一样的东西,只是说他们的出发点是一样的。Design Pattern(特指由GoF总结成书的Design Pattern)是通过OO本身特性来缓和类泛滥,GP最初的出发点是通过加入语言特性来缓和类泛滥。Design Pattern在总结成书之前有许多人零零散散在用,但在成书之前,并未形成可以推广的整体概念。因此我以出书日期来计算。但出现先后并不是“先进性”的关键,其实我也很想问问jhwh兄。你对“语言先进性”的判定标准是什么?别告诉我是“最先使用某种技术而这种技术最后变成行业标准”,符合这个条件的语言多的是。又或者是“该语言的社区最先讨论某种新兴技术,即使这种技术只有这个语言在用”。神请饶恕我问出这些愚蠢的问题,因为我的确还不了解明白什么“语言的先进性”,我甚至认为语言之间不存在“我比你先进”的关系。
3. “里面的smart pointer,visitor,multimethods等等,一次编写,到处使用,难道没有大局?不是构架?” MCD一书是研究如何写类库的,当然类库里有其框架,但细节与应用程序框架毕竟不同。因此不错,我认为此书所说的不是大局观,也不是我们通常意义上的“框架”(Architecture)。当然到了OO之神的“类是用来表达概念”的层面,所有事物都是共通的。太极生两仪,两仪生四象。。。。。
4. "这个书除了前面的具体技术外,通篇讲的是怎样进行设计,居然你认为是没有讲设计?". 根据语言的内涵,外延和语境,我讨论到现在,习惯性的把“设计”局限在“框架设计”“概念设计”上了。如果jhwh兄觉得系统详细设计,程序设计的技巧在讨论之列,那么只能说“我们没有对话的平台”了。但如果jhwh兄所指的设计是“框架设计”或“概念设计”,请问哪一章哪一节?通篇?也就是字里行间?我要看完全书,把精神境界上升到“类是用来表达概念”的层次再去悟出其“概念设计”的精髓?嗯,我层次有限。。。。但你确定这是作者的原意?
5. "这就是我们技术上的差距。我能够用统一的方式进行,而你们认为这些是各不相关的"
在“类是表达概念”的层面上,我认为万事万物都是相关的。在具体问题上,我认为划清直接相关性有助于理清思路。例如“三层适用性”与“面向对象粒度”并不是直接相关东西。当然,凡人们可以通过推理,把不直接相关的东西建立起相关性。而大神们直接可以说:“所有事物都统一于‘类是表达概念的’,因此都直接相关——什么?概念是主观的?嗯,以我的概念为准。”
6. “‘先进的思维都是在c++里面,java,c#都是拾人牙慧,而且还差得远’,这就是我的认为。因为你我考虑的层面是不一样的,所以我觉得没有对话平台。”, 赞成。
7. “好了,这下明白了gp是先进的了吧”。不是“这下明白”,我从来就觉得gp是个好东西,不然我也没那么无聊去看一本讲GP应用设计的书。也很高兴现在java加入了gp特性。但这跟“一切先进的思维都是在c++里面”搭不上界。按你的逻辑,我是不是可以说“你看,java里面的类元素可以用反射机制按名访问。向正在运行的项目中添加一个类(例如Strut的Action类)完全不用重新编译已有的类,直接把.class文件复制到对应的运行包目录,reload项目就行了。好了,这下明白java是先进的了吧?一切先进的思维都是在java里面。c++连牙慧都拾不起来”?(请注意,这不是我的实际想法)
8.
“多看看其他类型的语言,诸如c++, lisp,prolog,而不是一味的抱着oo,这样会对你的思维有着大的提高。”
这是我说的,显然你误会了。c++ 看gp, list 看函数式语言,prolog 看逻辑设计,这才是我的意思。
嗯,这其实应该归到暗箭篇去讲。很感谢jhwh兄的建议,我忙完这段会看一下这两种语言。但是为什么在第一篇回的时候不直接说呢。难道你觉得,一个要你推荐才去看这些语言的人,会知道你的意思是看list是为了函数式语言,看prolog是为了看逻辑设计吗?不过,如果是暗箭。。。豁然开朗。。。