伍迷家园

让编程融入生活
随笔 - 69, 文章 - 0, 评论 - 1355, 引用 - 91
数据加载中……

《大话设计模式》勘误

    尽管已经很仔细的检查和审核,但错误还是没有能避免。在此向已经购买了本书的读者诚意地说声抱歉。现勘误如下:

    1.01    P2 上方代码第二行,“if (O == "/") ”,应将"O"改为"B",本页第二段代码的倒数第五行,也是相同的错误,应将"O"改为"B"。

    1.02    P157 15.9节,第四段,"再添加引用System.configuratio15.",应将"15."改为"n".

    1.03    P61,第8行,原文:“你仔细观察一下,‘Pursuit(追求者)’和‘SchoolGirl(被追求者)’有没有相似的地方”?” 改为:“你仔细观察一下,‘Pursuit(追求者)’和‘Proxy(代理)’有没有相似的地方”?” 第9行,原文:“...三个方法,只不过‘SchoolGirl(被追求者)’送的礼物是‘Pursuit(追求者)’买的...” 改为:“...三个方法,只不过‘Proxy(代理)’送的礼物是‘Pursuit(追求者)’买的...” (trong  提供)

    1.04    P119,第4行,原文:“具体的小人,具体实现如何画出小人的头身手脚各个部分。” 改为:“具体的小人建造者,具体实现如何画出小人的头身手脚各个部分。” (trong  提供)

    1.05    P259 图 图中Colleague到Mediator之间的连线不应该多一个聚合关系而应该是关联关系。 (trong  提供)

    1.06    P271中间代码:原文:"UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();" 改为:"Flyweight uf = new UnsharedConcreteFlyweight(); "将更加准确。(trong  提供)

    1.07    P220 第1行 原文:“大鸟,棒着个手机,玩什么呢?"  其中“棒”改为:“捧” (cqchi 提供)

    1.08    P347 第5行 "简单理解就是耦断丝连" 更改为:"简单理解就是藕断丝连" (cqchi 提供)

    1.09    P84 9.5节 第1行 “你现在‘简历’对象里的数据都是string类型的,也就是值类型....”其中“也就是值类型”改为“而string是一种拥有值类型特点的特殊引用类型” (心界使者 提供)

    1.10    P10 在1.10前,增加文字如下“(作者注:以上代码读者如果阅读吃力,说明您对继承、多态、虚方法、方法重写等概念的理解不够,建议先阅读本书附录一,理解这些基本概念后再继续往下阅读。)

    1.11    P359 第4行“所以我们可以应用集合的RemoveRt方法...” 其中“RemoveRt”改为“RemoveAt”(心界使者 提供)

    1.12    P233 第2行:“哈,小菜说的和GoF说的不就是一会事吗!” 其中“一会事”改为“一回事”(心界使者 提供)

以上为二次重印时已修正的错误,以下为重印后发现的错误,特公告如下。

    2.01    P86 “客户端调用代码”下方代码第10行与第11行之间,即在“Resume c = (Resume)a.Clone();”与“c.SetWorkExperience("1998-2003", "ZZ企业");”之间加上一行代码:“c.SetPersonalInfo("男", "24"); ” (钢琴诗人 提供)

    2.02    P49 倒数第4行,"你的意思是,应该在内部组装完闭" ,其中“完闭”应该为"完毕" (cqchi 提供)

    2.03    P228 末尾代码,“class HandsetMP3 : HandSoft ”其中"HandSoft"应改为"HandsetSoft"(钢琴诗人 提供)

    2.04    P241 中间代码中的注释“ // 点菜完闭,通知厨房 ”其中“完闭”应该为"完毕"(钢琴诗人 提供)

    2.05    P62 本页三段代码第一句中 "GiveGift"由于是接口,所以都改为"IGiveGift" (cqchi 提供)

    2.06    P272  最下方代码开始处 在“//网站工厂”上面增加“using System.Collections; ”,以避免由于应用了Hashtable而使得初学者编译时不能通过。(钢琴诗人 提供)

    2.07    P285 中间代码第14行,即else语句里第3行“doubleplayValue”应注意当中有一个空格,即应该是“double playValue” 。 (钢琴诗人 提供)

    2.08    P286 中间文字“音符类(TerminalExpression)”,其中“音符类”应该为“音阶类”(钢琴诗人 提供)

    2.09    P295 中间,“结果显示”里的内容,“男人成功时”、“男人失败时”和“男人恋爱时”中“男人”改为“Man”,“女人成功时”、“女人失败时”和“女人恋爱时”中“女人”改为“Woman”

    2.10    P146 第7行与第8行之间,即“……此时如何办呢?”与“啊,我觉得那要增加好多类……”之间增加下方一段代码(钢琴诗人 提供)

 

class Department
{
    
private int _id;
    
public int ID
    
{
        
get return _id; }
        
set { _id = value; }
    }


    
private string _deptName;
    
public string DeptName
    
{
        
get return _deptName; }
        
set { _deptName = value; }
    }

}

    2.11    P340 倒数第三段中间部分,“set访问器没有显示设置参数”,其中“显示”应改为“显式”。(cqchi 提供)
    2.12    P352 中间四段代码,分别是Cat、Dog、Cattle、Sheep四个类中“public override string getShoutSound() ” ,其中“public”应改为"protected" (beach-boy 提供)

以上为三次重印时已修正的错误,以下为重印后发现的错误,特公告如下。

    3.01    p52 上方代码的第四个注释框中:“本类独有的方法,以区别于ConcreteDecoratorB”,其中“ConcreteDecoratorB”应改为“ConcreteDecoratorA”。(p大simba 提供)
    3.02    p164 最下边的注释框里:“设置ConcreteStateA的下一个状态是ConcreteB”,其中“ConcreteStateA”与“ConcreteStateB”应该把A和B互换过来”。(p大simba 提供)
    3.03    P332 倒数第三行 "我对你的敬仰真如涛涛江水",其中“涛涛江水”应改为“滔滔江水”。(zml 提供)
    3.04    P333 第十四行,“工厂工厂,公仔爱你,就像老鼠爱大米。” 其中“公仔”应改为“工仔”。(zml 提供)
    3.05    P37  4.4节下的第一段第五行, “招聘大学生的公司的咨讯",其中“咨讯”应改为“资讯”。(cqchi 提供) 
    3.06    前言中P15倒数第8行, "Erich Gamm",其中"Gamm"应该是"Gamma"(在P367,附录B的第一行有同样的错误). (Kappa 提供)

    3.07    P12与P68两页上面简单工厂模式的图,简单工厂类和运算类之间的关系应该是依赖(Dependency)而非关联(Association),即简单工厂类与运算类的连线是虚线箭头,而非实线箭头。(Steven Chen 和 hit_gsy 提供)

    3.08    p349 左上方那个说明框 “增加了override表示方法重写”指向上应该再向下一些,指向“override”才正确。

    3.09    P150 倒数第五行,“ProductB1是AccessUser”,其中“AccessUser”应改为“SqlserverDepartment”。( 欧尔 提供
  
     若读者您还发现什么错误,请在此回复或给我留言,我将及时公布。在此先说一声谢谢。

posted on 2007-12-13 19:48 伍迷 阅读(2005) 评论(93)  编辑 收藏 所属分类: 大话设计模式

评论

#1楼    回复  引用    

呵呵,书刚到一天,一定仔细看。

#2楼    回复  引用    

P61当中

原文:“你仔细观察一下,‘Pursuit(追求者)’和‘SchoolGirl(被追求者)’有没有相似的地方”?”
改为:“你仔细观察一下,‘Pursuit(追求者)’和‘Proxy(代理)’有没有相似的地方”?”

原文:“...三个方法,只不过‘SchoolGirl(被追求者)’送的礼物是‘Pursuit(追求者)’买的...”
改为:“...三个方法,只不过‘Proxy(代理)’送的礼物是‘Pursuit(追求者)’买的...”
2007-12-17 10:28 | trong [未注册用户]

#3楼    回复  引用    

P89 最上面的Clone()的代码

clone()代码感觉好像过于复杂了,象下面这样不是更简单吗,而且不需要P88页定义的私有构造函数了(把clone事情的代码集中在一个地方也比较好):
Resume obj = (Resume)this.MemberwiseClone();
obj.work = (WorkExperience)work.Clone();
return obj;
2007-12-17 10:48 | trong [未注册用户]

#4楼    回复  引用    

P110 中间
原文:“...因为它完美地体现了依赖倒转原则和迪米特法则的思想...”
疑问:感觉不出来Facade模式怎么就完美体现了依赖倒换原则,根据前文,依赖倒换原则是“高层底层都依赖抽象,以及抽象不依赖细节”,在Facade模式中,几乎就没有抽象(Facade本身也是一个具体类),就算把Facade看做某种抽象,但子系统类肯定是不依赖于Facade的。
2007-12-17 10:54 | trong [未注册用户]

#5楼    回复  引用    

P119中间
原文:“具体的小人,具体实现如何画出小人的头身手脚各个部分。”
改为:“具体的小人建造者,具体实现如何画出小人的头身手脚各个部分。”
2007-12-17 10:58 | trong [未注册用户]

#6楼    回复  引用    

P249图
该图和图下面的代码不对应,和DP的图也相差较大:图上的组合关系线应该是在抽象Handler自己到自己。
2007-12-17 11:00 | trong [未注册用户]

#7楼    回复  引用    

P259 图
图中Colleague到Mediator之间的连线不应该多一个组合标志,下面的代码、DP以及doFactory网站上都没有这个组合标志。
2007-12-17 11:15 | trong [未注册用户]

#8楼    回复  引用    

sorry,上面两条意见中的用词错了,是“聚合”不是“组合”。
2007-12-17 11:17 | trong [未注册用户]

#9楼 [楼主]   回复  引用  查看    

@trong
首先非常感谢trong您的认真阅读以及提供的勘误建议。

P61的错误的确是我的笔误,写作和检查时都没有注意(已经加入本文中)。

P89的代码,您的代码比较简捷,但在书中这里其实是想说明深复制的原理,因为深复制可能不是两层,而是很多层,现在书中的代码更容易理解一些。从您所提议来看,您已经完全理解原型模式的本质了,所以您的建议,在书中代码的基础上进行改进也是完全可以的。

P110,Facade模式中的Facade可以是具体类、可以是抽象类、可以是接口,它其实就是“高层底层都依赖抽象”的体现。

P119,增加“建造者”将更加准确,的确是好的建议。

P249,GoF中有提到,“实现后断者链,有两种方法可以实现,定义新的链接(通常在Handler中定义,但也可由ConcreteHandlers来定义)”,其实这个关系线可以是抽象自己到自己也可以是现在这个样子。您可参考http://www.dofactory.com/Patterns/PatternChain.aspx

P259图,的确,本图两者间是关联关系,而不是聚合关系。非常抱歉。

再次感谢您的建议,希望能多沟通和交流。
2007-12-17 11:26 | 伍迷      

#10楼    回复  引用    

P266 中间
原文:“...或Web页面的aspx,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。”
疑问:这后面这句话很难理解,从前文中感觉不出来,不知道是什么意思。
2007-12-17 11:30 | trong [未注册用户]

#11楼 [楼主]   回复  引用  查看    

@trong
P266 这句话的意思是说,当有一个行为可能要分布在多个类中,但这样就可能会生成太多的子类来进行关联,于是考虑用中介者模式来处理。比如Form对象或Web的aspx页面,这些都是中介者模式的应用。

这句话需要和前面的讲解结合理解相对容易,单独来看的确容易迷糊。
2007-12-17 11:44 | 伍迷      

#12楼    回复  引用    

P271中间代码
原文: UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();
改为; Flyweight uf = new UnsharedConcreteFlyweight();
2007-12-17 11:53 | trong [未注册用户]

#13楼 [楼主]   回复  引用  查看    

@trong
P271 书中的代码本身没有错,不过您的建议,用父类声明来实现代码,更加准确一些。谢谢!
2007-12-17 12:28 | 伍迷      

#14楼    回复  引用    

Strong看的好快,也是前辈级别。
我的邮箱是 lkd_2000@126.com
我现在在做一个中等水平的网站模版生成引擎,现在被结构困扰住了,希望得到你大家的帮助。希望楼主可以给我发一份邮件,我可以更好的向您请教问题。

#15楼    回复  引用    

在装饰模式里的面的代码:
我在b/s里运行
public virtual void Show()
{
System.Web.HttpContext.Current.Response.Write("装扮的{0}", name);
}
Show()没有传参
如何出现的name???编译是无法通过的!

这处是不是错误???
2008-01-04 11:43 | errr [未注册用户]

#16楼 [楼主]   回复  引用  查看    

@errr
不是错误,在这段代码的前面有
private string name;
public Person(string name)
{
this.name = name;
}

也就是说,这个类是需要在初始化时,即
Person xc = new Person("小菜");
时就给name赋值了,所以你需要再仔细阅读,或者下载书的源代码研究。

2008-01-04 12:01 | 伍迷      

#17楼    回复  引用    

我已经下载你的代码了
因为我对winfrom不熟悉
所以简单改了一下就在asp.net下运行代码

在编译的时候出现

错误 1 “Write”方法没有采用“2”个参数的重载

public virtual void Show()
{
System.Web.HttpContext.Current.Response.Write("装扮的{0}", name);
}
也就是Person类里的这句话
System.Web.HttpContext.Current.Response.Write("装扮的{0}", name);

当我把("装扮的{0}", name); 换成("装扮的小菜");

即可编译通过并且显示了结果!

2008-01-04 12:22 | errr [未注册用户]

#18楼 [楼主]   回复  引用  查看    

@errr
书中代码没有错,是你改写时忽略了构造方法和在aspx.cs里没有给构造方法加name参数值引起的问题。
2008-01-04 13:25 | 伍迷      

#19楼    回复  引用    

实践是检验真理的唯一标准
楼主如果有时间可以把你的代码转换在asp.net里运行一次试试。
我并不是认为代码一定是错的!只是我向你反馈一下我遇到的问题。(这个问题先搁置)

还有一个地方我不大明白

pqx.Decorate(xc);
kk.Decorate(pqx);
dtx.Decorate(kk);
dtx.Show();
最后得到结果

第一种装扮:大T恤 垮裤 破球鞋 装扮的小菜

dtx.Show();

每一次装饰都

System.Web.HttpContext.Current.Response.Write("大T恤 ");
base.Show();

System.Web.HttpContext.Current.Response.Write("垮裤 ");
base.Show();

System.Web.HttpContext.Current.Response.Write("破球鞋 ");
base.Show();

每一次都应该调用了 base.Show();为什么出现了Response.Write("大T恤 ");Response.Write("垮裤 ");
Response.Write("破球鞋 ");
而base.Show();装扮的小菜 只是最后一次出现了???
希望楼主可以给我讲一下!
谢谢
2008-01-04 13:38 | errr [未注册用户]

#20楼 [楼主]   回复  引用  查看    

@errr
建议你先不要考虑改我的代码为asp.net,因为控制台和asp.net尽管都可以展现结果,但这两者还是有细微的差异的。只有在你已经对一个模式很清楚之后,再考虑改造会更好。比如
System.Web.HttpContext.Current.Response.Write()方法和我代码中用的Console.WriteLine()是完全不同的两个方法,你的直接照搬就不可取,代码应该改为System.Web.HttpContext.Current.Response.Write(("装扮的"+name)。

还有就是你在提问前最好说一下,是哪一章哪一节,或者哪一页,哪一段代码,哪一个例子在提问,因为就装饰模式就有4个样例代码,我也不知你问哪一个。

设计模式开始学习会有很多困惑是很正常的,慢慢来,不要急。自己多花点时间也是值得的。

就你刚才的问题而言,我猜测是你还没有看懂装饰模式的本质,也就是说,你需要在装饰模式这一章,从头读起,一个一个例子的消化,才能理解,为什么多个base.show,却只出现一次。
2008-01-04 14:10 | 伍迷      

#21楼    回复  引用    

正在看<大话>,确是一本好书,也是看到代理模式这发现错误,特意上来查看,发现作者早已更正,谢谢作者!

#22楼    回复  引用    

P220
原文:“大鸟,棒着个手机,玩什么呢?"
改为:“大鸟,捧着个手机,玩什么呢?”

2008-01-23 17:05 | cqchi [未注册用户]

#23楼 [楼主]   回复  引用  查看    

@cqchi
感谢您的回复,的确是一个错别字,我已经更新勘误。
2008-01-23 23:16 | 伍迷      

#24楼    回复  引用    

P347 5行"简单理解就是耦断丝连"
更改为:"简单理解就是藕断丝连"

程杰兄,别嫌我吹毛求疵,在下编辑出身,实在看不得错字。
2008-01-24 10:02 | cqchi [未注册用户]

#25楼    回复  引用  查看    

P84
9.5节的第一行靠后的位置:
“你现在‘简历’对象里的数据都是string类型的,也就是值类型....”
在C#中string类型是引用类型,不是值类型。我理解作者要表达的意思,但string在C#中虽然行为酷似值类型,但它确是引用类型。
2008-01-24 21:00 | 心界使者      

#26楼 [楼主]   回复  引用  查看    

@cqchi
@心界使者
感谢二位的支持。
2008-01-24 23:30 | 伍迷      

#27楼    回复  引用  查看    

P359
中间那段文字的第三行:
“所以我们可以应用集合的RemoveRt方法...”
呵呵,应该是“RemoveAt”~~

P233
第二行:“哈,小菜说的和GoF说的不就是一会事吗!”
应改成“一回事”~~~
2008-01-25 22:19 | 心界使者      

#28楼 [楼主]   回复  引用  查看    

@心界使者
谢谢,已经在勘误中更改。
2008-01-27 11:33 | 伍迷      

#29楼    回复  引用    

@伍迷
P86
客户端调用代码 和 结果显示 不一致,建议在
Resume c = (Resume)a.Clone();下面加上一行
c.SetPersonalInfo("男", "24");

呵呵,这样值类型和引用类型的运行效果就都能显示出来了。
2008-02-02 14:27 | 钢琴诗人 [未注册用户]

#30楼    回复  引用    

@伍迷
P146页 对于Department类,由于没有编排上,建议加一句提示(此类同User类类似),便于手头上没有下载源代码的读者轻松阅读。
2008-02-06 11:24 | 钢琴诗人 [未注册用户]

#31楼 [楼主]   回复  引用  查看    

@钢琴诗人
感谢您的回复,这两条提得都很好。的确如您所写的那样会更加表达清晰。特此修正。
2008-02-06 17:04 | 伍迷      

#32楼    回复  引用    

@伍迷
P159 下边 “疲倦之极”是不是应该为“疲倦至极”呀?
可是查《现代汉语词典》两个都没有找到。

谢谢~
2008-02-13 13:43 | 钢琴诗人 [未注册用户]

#33楼 [楼主]   回复  引用  查看    

@钢琴诗人
“疲倦之极”应该只是说非常疲倦的意思,这不是成语,当然也就查阅不到。这应该不是错误。
2008-02-13 15:18 | 伍迷      

#34楼    回复  引用    

P49 "你的意思是,应该在内部组装完闭"
应该为"完毕"
2008-02-14 17:55 | cqchi [未注册用户]

#35楼 [楼主]   回复  引用  查看    

@cqchi
不得不承认,您是找错别字的高手。或者说,你发现了我的小学语文不咋地的秘密。谢谢!
2008-02-14 20:22 | 伍迷      

#36楼    回复  引用    

哈哈,客气了。我只是希望这本好书能更殝完美
2008-02-15 09:09 | cqchi [未注册用户]

#37楼 [楼主]   回复  引用  查看    

@cqchi
第一期印刷的5000册已经卖完,前12条勘误可以在新印刷的书中得到更正,争取13、14、15条勘误可以在二次印刷中得到修正。这样书才可以算相对完美。
2008-02-15 09:31 | 伍迷      

#38楼    回复  引用    

P228
// 手机MP3播放
class HandsetMP3 : HandSoft

应该为
// 手机MP3播放
class HandsetMP3 : HandsetSoft
2008-02-18 22:23 | 钢琴诗人 [未注册用户]

#39楼    回复  引用    

@伍迷
P241
中间部分 // 点菜完闭,通知厨房
应该为 // 点菜完毕,通知厨房

呵呵,跟 cqchi 学习的,现学现卖~
2008-02-19 10:12 | 钢琴诗人 [未注册用户]

#40楼    回复  引用    

P355中,cj你写道:“接口的命名,前面要加一个大写字母'I',这是规范”
P62 “代理接口如下 interface GiveGift”,是不是应该加一个大写字母I呢?
2008-02-19 14:51 | cqchi [未注册用户]

#41楼 [楼主]   回复  引用  查看    

@钢琴诗人
“完闭”这个“闭”错别字实在是让我很烦很郁闷。不过根据我所查找,应该不会再有此错词出现了。

@cqchi
这的确是一个疏忽,没有遵循规范。

再次感谢二位的认真阅读和指正。
2008-02-19 21:18 | 伍迷      

#42楼    回复  引用    

@伍迷
没什么,这本书写的定位以及内容都非常的好,希望通过尽自己一份力使此书变得更完美。

第 38楼 还有一个代码小疏漏。
2008-02-20 10:06 | 钢琴诗人 [未注册用户]

#43楼    回复  引用    

@伍迷
P272
网站工厂类代码,由于用到了Hashtable,建议提醒读者在上机实践代码时记得写上命名空间
using System.Collections;

谢谢!
2008-02-21 10:46 | 钢琴诗人 [未注册用户]

#44楼    回复  引用    

@伍迷
您好:
P285
中间部分,else语句里“doubleplayValue”应该为“double playValue”
少了一个空格。
谢谢
2008-02-21 17:24 | 钢琴诗人 [未注册用户]

#45楼    回复  引用    

P286
中间向下
“音符类(TerminalExpression)”应该为“音阶类(TerminalExpression)”

谢谢
2008-02-21 17:35 | 钢琴诗人 [未注册用户]

#46楼 [楼主]   回复  引用  查看    

@钢琴诗人
估计等你全部看完,这本书就不会再有任何错误了。

如果能再继续发现三个错误,我就赠送一本新印刷的并有本人签名的《大话设计模式》给你。以表示你对本书的大力支持。

哈哈,给你开个玩笑,哪怕再也发现不了错误,我也已打算赠送一本给你了。等你看完后,给我留言吧。新印刷一出来,我拿到后就给你寄去。

另外,else语句里“doubleplayValue”其实是word的排版太紧给人感觉没有了空格,我是直接粘贴代码上去的,理论上不会出现这种问题,但由于会给读者造成误解,也算是一个小错误。
2008-02-21 20:30 | 伍迷      

#47楼    回复  引用    

嘿嘿,是么,好兴奋哦,低调低调,我是个快毕业的学生,希望能和您电子邮件联系,我的邮箱地址填到上面了。

P295
中间,“结果显示”里的内容,有个小错。

“男人”和“女人”应该分别换成“Man”和“Woman”

我上机实践的代码和您的代码结果显示的都是英文的。
2008-02-21 22:24 | 钢琴诗人 [未注册用户]

#48楼    回复  引用    

@伍迷
您好,《大话设计模式》这本书终于读完了,最后面的OOTV大赛总结的真是很好,希望以后还能看到更多的您写的这些方面的书,对于成千上万的初学者,经典著作需要解析,需要您的帮助。
谢谢您,真的好兴奋能获得您亲笔签名的赠书,在此表示感谢,谢谢您的帮助。

我的地址写到留言本里了。
再次的感谢您,谢谢!
2008-02-22 14:36 | 钢琴诗人 [未注册用户]

#49楼 [楼主]   回复  引用  查看    

@钢琴诗人
我也得多放谢你对本书错误的一一指正,这也是为所有的读者服务的体现,并对你这种认真的学习态度和良好的学习方法给予充分的肯定。

送书是一定会送,但需要等待一段时间。
2008-02-22 15:42 | 伍迷      

#50楼    回复  引用    

@伍迷
嗯,好的,再次谢谢您的肯定。
2008-02-22 20:35 | 钢琴诗人 [未注册用户]

#51楼    回复  引用    

买了一本,写得着实不错,配书源码在这里没找到啊,到清华的网站,死活打不开...
:(
2008-02-25 09:49 | _BiLL [未注册用户]

#52楼 [楼主]   回复  引用  查看    

@_BiLL
http://www.cnblogs.com/cj723/archive/2007/12/30/1021314.html
文中有源代码下载地址。
2008-02-25 10:17 | 伍迷      

#53楼    回复  引用    

@_BiLL
《大话设计模式》第9页有下载地址。
http://www.cnblogs.com/Files/cj723/BigTalkDesignPattenSourceCode.rar
2008-02-25 10:20 | 钢琴诗人 [未注册用户]

#54楼    回复  引用    

@伍迷
呵呵!
2008-02-25 10:21 | 钢琴诗人 [未注册用户]

#55楼    回复  引用    

请问伍先生,我今天刚买了一本,是第一次印刷的,您在书上说的源代码下载地址我怎么打不开呀,清华出版社的下载地址也找不到,我如何才能获取书中的源程序呢?没有的话就没什么意思了。郁闷。
2008-03-02 22:43 | 快乐男孩 [未注册用户]

#56楼    回复  引用    

P340
“set访问器没有显示设置参数”,应是“显式”。
2008-03-03 10:59 | cqchi [未注册用户]

#57楼    回复  引用    

P352
protected virtual string getShoutSound()
{
return "";
}
不能运行通过..
出错信息为
"WindowsApplication1.Cat.getShoutSound()" : 当重写"protected"继承成员"WindowsApplication1.Animal.getShoutSound()"时,无法更改访问修饰符.
改为
public virtual string getShoutSound()
{
return "";
}
2008-03-07 17:49 | beach-boy [未注册用户]

#58楼 [楼主]   回复  引用  查看    

@beach-boy
@cqchi
感谢两位的认真查看,这两处的确是错误。我已经更新勘误。
2008-03-08 09:50 | 伍迷      

#59楼    回复  引用  查看    

@errr
装饰模式等于是先把组件都入栈了,然后输出时出栈。所以会出现倒序的情况
2008-03-09 09:36 | spgoal      

#60楼    回复  引用    

@伍迷
呵,兴奋ING。今天一起床就收到您的再版新书啦!太激动了,从来没有过的成就感。正如您所说,让我们为写出更优秀的代码而努力。加油!

附图片,我已上传到我的BLOG里了,欢迎您的访问。
http://blog.sina.com.cn/s/blog_47ea6a6f01008w1g.html
2008-03-18 10:49 | 钢琴诗人 [未注册用户]

#61楼 [楼主]   回复  引用  查看    

@钢琴诗人
不用客气,好好努力吧!
2008-03-18 11:54 | 伍迷      

#62楼    回复  引用    

p52的第四个注释框中:本类独有的方法,以区别于ConcreteDecoratorB,应该是ConcreteDecoratorA
2008-03-24 15:38 | p大simba [未注册用户]

#63楼 [楼主]   回复  引用  查看    

@p大simba
感谢您的仔细阅读,这是一个笔误。
2008-03-26 19:55 | 伍迷      

#64楼    回复  引用    

在joyo上买了一本,今天中午送到的,不错
2008-03-28 16:26 | ggooo [未注册用户]

#65楼    回复  引用    

上面10.有关P295的勘误,真是笑话。P293不是说了吗,“this.GetType().Name是获得当前类的名称,比如这里就是‘男人’”。为什么P295还有这种勘误???
本身写的就不严谨,这里勘误还是这种吊儿郎当的态度,真令人寒心
2008-04-07 16:06 | 贺新亚 [未注册用户]

#66楼 [楼主]   回复  引用  查看    

@贺新亚
这位先生,先别激动,情况是这样的.

起初我是用中文来写代码的,那么自然有"男人"类和"女人"类,所以用this.GetType().Name得到的自然就是“男人…………”.

而后,所有的代码都改为了英文,也就是说,代码当中的"男人"全部改成了"man",此时执行后的结果就不可能是"男人…………",而应该是“man…………”

希望这样的解释可能让你不再心寒。本书是我用心所作,尽管文风未必很严肃,但态度绝对认真,您的“吊儿郎当”之评价不符事实,我不能接受,敬请收回。
2008-04-07 16:47 | 伍迷      

#67楼    回复  引用    

楼主,我给你建议:
1、你的Bug勘误表不应该有重复的Bug Serial No.。你不妨自顶而下如
1.01 bug1
...
1.10 bug10
2.01 bug11
...
2.02 bug12
2、回到我之前的问题,我是不是可以这么理解:你撰写的《大话》第二版,连代码里的字串都改中文成英文了。
为什么?我倒是觉得没有必要。一个中文字串,我本来觉得很好,可你把“男人”变成“Man”之后,陡增了我的误解,这不,我拿着你的第一版来这里对照勘误,各说各话
这是你的责任,至少,你没有把第二版的背景交代清楚,譬如“男人”变“Man”之类
3、再提一个勘误的bug,如下
P146 第7行与第8行之间,即“……此时如何办呢?”与“啊,我觉得那要增加好多类……”之间增加下方一段代码(钢琴诗人 提供) ...
我觉得这里增加的代码真是鸡肋。你回头想想为什么会让读者有这个感觉吧。我希望,这种似是而非的勘误不会出现在你的第三版上
2008-04-07 19:15 | 贺新亚 [未注册用户]

#68楼    回复  引用    

我得说清楚,我看好这本书,也推荐朋友买来读,毕竟,现实上很多一知半解的人翻译糟蹋了很多外文书籍,让本来就颇具理论性的书看起来有如天文。他们都懒得自己组织文字撰写了,又或者没有这个能力。你的书具有通俗易懂的优点。
国内人原创写的计算机图书,我少见过好的。我能看出他有些许水平,但是章回段落的组织能力实在差劲,很多地方明显是凑字数乱抄,自己没有想清楚就敢晾出来,亏待了认真两字,真是让人陡增无名之火
说你吊儿郎当确实不恰当,但是,我认真的跟你说,我从google搜索“大话设计模式 勘误”到了这里,看到的确实不是一个很认真的勘误网页。
2008-04-07 19:38 | 贺新亚 [未注册用户]

#69楼 [楼主]   回复  引用  查看    

@贺新亚
感谢您给我的第一条建议,我已经更正了勘误的编号,这的确是一个好主意.

第二个问题,您的理解其实不对,把代码中的中文改成英文,是在图书正式出版之前就完成的,当时和编辑还商量过,哪一种方式更合理,尽管中文代码容易阅读,但却非常不规范(现实中一般不用中文写代码).因此最终12月份出版时,我已经是将所有的代码都改成英文的.(您可查看编辑写的序,当中有提到)

至于您提到的将"男人"改成"man",仅仅只是一个字符串的变化.是因为那段代码执行后不会出现"男人成功时”、“男人失败时”和“男人恋爱时”的字样,而只会出现"man成功时”、“man失败时”和“man恋爱时”因此这算是第一二次印刷时的小bug(一直存在的bug),在勘误中声明,并在第三次印刷时更正.您可以按照代码输入执行后就知.

至于第三个问题,您可查看本文第30楼
#30楼 218.11.51.*
@伍迷
P146页 对于Department类,由于没有编排上,建议加一句提示(此类同User类类似),便于手头上没有下载源代码的读者轻松阅读。

增加它的目的是为了给没有下载源代码的读者轻松阅读.而只写"此类同User类类似"并不严谨,它们之间有属性不相同的地方,初学者很难从书中完全将代码复原,因此增加这段代码很有必要。

希望我的这些解释可以令您满意。也感谢您的指正。
2008-04-08 09:48 | 伍迷      

#70楼    回复  引用    

书中对于里侍代换代换原则(/P41)的讲解中所举的鸟例子,是不恰当的,或者说是偷换概念的讲解。
生搬硬设的例举不会有任何说服力,而且一定会产生不好的影响和效果!!
我们都知道“企鹅是一种鸟”,这不止是在生物科学上的周知常识!
不错,“企鹅不是一种“能飞的鸟””,可这个需要作者曲径通幽的告诉我们吗?
事实上的结果是:书中的这种文字描述和例举,对于本来就有概念的人而言,心领神会似是而非;对于那些本来就没有概念的“新人”而言,毫无意义,更陡增困惑!
2008-04-10 10:26 | 贺新亚 [未注册用户]

#71楼 [楼主]   回复  引用  查看    

@贺新亚
对于你的这种评价,尽管仁者见仁,智者见智,我想还是有必要解释一下。我承认,书中由于大量的生活实例,可能会有小部分例子并不是很准确。但这是建立在不影响读者对技术的理解为前提之下的。另外,除了数学意义的表述,绝大部分对技术的解释,特别所做的类比都会存在一定的偏差。而数学意义的表述准确有之,理解非常困难。类比可能不准确,却反而能起到加深理解的目的,因此我不认为这是什么根本的问题。

本书风格就是用大量生活实例来讲解技术难点。企鹅是一种鸟,因此企鹅类可以继承鸟类,而飞翔并不是所有的鸟都必需的能力,比如企鹅或鸵鸟就不行,这样很形象的表述就是本书的风格,这些常识也不会给读者产生什么歧义。甚至说,我是很刻意的要让文字里充满了大家都知道的常识,目的是让人感觉很容易理解。

您如果不喜欢,只能说,本书没有让您满意,我很抱歉。也或许,您更喜欢非常正规的讲解技术,我建议您直接阅读GoF《设计模式》,里面应该没有任何歧义,可能会让您满意。
2008-04-10 11:05 | 伍迷      

#72楼    回复  引用    

"企鹅是一种鸟,因此企鹅类可以继承鸟类,而飞翔并不是所有的鸟都必需的能力,比如企鹅或鸵鸟就不行",这是对的。
可p41里所举的例子,真的不恰当。有恰当的例子,而且可以写的一样甚至更生动。
2008-04-10 11:44 | 贺新亚 [未注册用户]

#73楼    回复  引用    

吹毛求龇,我的言辞显得如此
不好意思,我学数学的,对概念力求精确,不存歧义
很多的科学发现都是从对基础概念的怀疑而得到的,譬如爱恩斯坦对时间和距离的思考:)
扯远了,实话说,我不是一个聪明的人,常受一些似是而非的理论而困惑;我现在读书看字几近咬文嚼字,有意识的,从泥潭里爬出来看那些在泥潭里挣扎的人,愤愤不平
对于某个理论,光看一本书是不大可能有很好的理解的,就算这本书的论述有多严谨。所谓兼听则明,何况,每个人的知识背景千差万别。
现在我们终于知道做老师的高度和责任
2008-04-10 12:56 | 贺新亚 [未注册用户]

#74楼    回复  引用    

GoF的《设计模式》我看过的,我是对照中英文一起看;书是很严谨,可翻译还真的一如既往不求甚解。那些应该加粗整体看待的概念,中文表达得朝三暮四,让人不知所措
2008-04-10 13:05 | 贺新亚 [未注册用户]

#75楼 [楼主]   回复  引用  查看    

@贺新亚
在本书41页,大鸟提了一个问题,他说,“如果鸟是可以飞的,企鹅不会飞,那是企鹅是鸟吗?企鹅可以继承鸟这个类吗?”这里面,大鸟其实是在挖了一个坑,故意让小菜去跳的,常识都知道企鹅是鸟,所以小菜就说:“企鹅类可以继承鸟类”。

而大鸟后面就说到“尽管在生物学分类上,企鹅是一种鸟,但在编程世界里,企鹅不能以父类——鸟的身份出现,因为前提说,所有鸟都能飞,而企鹅飞不了,所以企鹅不能继承鸟类。”

首先这本书在这里是以一种对话形式讲解的,在日常对话中,说个常识问题故意让人上当的情形其实很多。我之所以这样写,其实也是想加深读者对里氏代换原则的理解,也就是要满足这个原则是有前提的,即:“一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,…………”

你的回复后,我认真再看了书中的这段文字,我认为这个例子在这里是很合适的。因此对你的看法我有保留意见,但没有令你满意,我很抱歉。
2008-04-10 20:06 | 伍迷      

#76楼    回复  引用    

p164最下边的注释框里的:“设置ConcreteStateA的下一个状态是ConcreteB”应该把A和B互换过来。
2008-04-28 09:46 | p大simba [未注册用户]

#77楼    回复  引用    

诚然,出一本完美无缺的书是很难的。作者能做到这样已经很可贵了。
2008-04-28 09:53 | p大simba [未注册用户]