| David's profileprowyh's spaceBlogLists | Help |
|
October 29 战争,在深夜爆发记得以前看战争片,一般都把发动总攻的时间安排在深夜或凌晨。不知道克劳塞维茨是不是把这点总结为了一条规律,反正这次战争就爆发在深夜。
时间:深夜1点
地点:楼下隔壁 内容:夫妻吵架 描述: 开始时并不激烈,以为是恋爱中的女孩子又在训斥小伙子(因为是以前小区常有的现象)。过了半个小时,仍然没有结束的迹象,而且越来越激烈。吵的睡不着,点支烟,走到阳台,才发现是楼下隔壁。灯亮着,不见人,但声音在深夜却异常刺耳。
听不懂吵的内容(上海话),只听得男士时不时发射几颗榴弹炮,但很快就被女士密集的火箭炮压了下去,偶尔有老太太的地雷响几声,但在这种密集炮火的袭击下,几乎没有任何效果。
战争在卧室进行了1个多小时,在工事完全被炮火打垮后,逐渐向纵深迁移(移向客厅),大口径的榴弹炮仍然抵挡不住密集的火箭炮的高强度打压,但并不示弱,仍会时不时爆发出巨响!
战争继续向纵深延伸,好像逐渐移到了室外……
最后,经过2个多小时的激战,炮火渐渐稀疏,但并没有结束,偶尔仍会听到炮弹的爆炸声……
左邻右舍战事频仍,但这次战争是最激烈的!
经常在韩国电视剧中看到女士对男士的毕恭毕敬(此处并非宣扬韩国男人的大男子主义),由此想到,韩国家庭中可能不太会爆发如此激烈的战争罢?!
温良恭俭让,就这样被战争的炮火催毁了……,而尊重他人权益的观念,却远没有建立起来……
男人和女人之间应该是和平,而不是战争。
P.S.
截止发稿时止,仍然没有结束,但已经渐行渐远,终于可以睡觉了,可由于要赶早班车,还能睡么? October 27 Effective C# -- part twoItem 1: Always Use Properties Instead of Accessible Data Members
C#对property提供了语言级的支持(The C# language promoted properties from an ad-hoc convention to a first-class language feature.)。作者从三个方面论述应该使用properties,而不是public data members。
1、.NET Framework Class Library中UI控件的绑定机制只支持properties,而不是public data members。
txtUserName.DataBindings.Add("Name", userObject, "Name");
这里的txtUserName是一个Web Forms Control或Windows Forms Control,这行代码将userObject的Name property绑定到txtUserName的Name属性。userObject的Name必须是property,而不能是public data member。
2、使用property可以加入检测代码,从而保证类型安全。
public class User
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (value == null || value.Length == 0)
{
throw new ArgumentException("Name can not be blank.");
}
_name = value;
}
}
// .........
}
上述代码中的空值检测,如果Name不是property而是public data member,是无法或很难实现的。
3、使用property使得客户端代码更加自然。
User userObject = new User();
string userName = userObject.Name;
userObject.Name = "David";
使用property而不是get/set method call,使得上述代码more natural and intuitive。这是C#非常得意的事情。Scott Wiltamuth(C# Design Team Member)在《Inside C#》的序言中指出:
if the framework supports properties and the language doesn't, incrementing a property is awkward (for example, o.SetValue(o.GetVaue() + 1)). If the language also supports properties, the operation is simple (o.Value++).
接着,作者讨论了一些更加深入的内容,如parameterized property (indexer),read-only/read-write/write-only property,virtual property,以及将Name从public data member转换为property而可能会带来的问题等,从而结束本条目。
对property的语言级支持是C#成为面向组件的语言(component-oriented programming language)的重要特征之一。
关于property,也存在一些争论。
1、如果一个Class含有大量的data members,使用property机制会非常繁琐(tedious),也会降低代码性能。这是C++/Java经常揶揄C#的问题。
2、property的intuitive语法在产生pretty code的同时,有时也会带来一些问题。
User userObject = new User();
someMethod(ref userObject.Name); // illegal -- userObject.Name has no storage!
//........
public void someMethod(ref string someVariable)
{
someVariable = "Some String";
}
property是通过get/set机制实现的,所以userObject.Name不是一个变量,而someMethod()要求一个有地址的变量,所以userObject.Name不能用作someMethod()的参数,但从语法上看是没有问题的。这是C#语言中语法构造破坏语义的一个典型例子。
3、Jeffrey Richter在《CLR via C#》中详细讨论了property的问题,其中大部分都与property的“语法构造破坏语义”有关。所以Jeffrey最后说:But I'd want the compiler to use syntax that is different from field access syntax so that programmers really understand what they are doing—a method call.
4、对于远程访问的Class(继承自System.MarshalByRefObject),通过property访问Class的data members(fields)是非常不经济的。不过,这不是property的问题,即使直接的data member access也有同样的问题。
就像打开窗子,新鲜空气和蚊子、苍蝇都会一起进来一样,property在提供语法便利的同时,也会存在一些问题,重要的是要意识到这些问题,从而尽量规避之。从这点上来讲,我觉得《Effective C#》的Item 1没有把property存在的问题说透。 Effective C# -- part one“从众”可能是人类共有的心理。继Scott Meyers获得巨大成功的《Effective C++》(Scott Meyers以三册《Effective》进入C++重要人物Top 5排行榜)之后,《Effective Java》、《Effective C#》相继出炉,但能否像《Effective C++》那样成功呢?不敢妄言,需要时间。
《Effective C#》第一章,作者在开篇中写到:
Why should you change what you are doing today if it works? The answer is that you can be better. You change tools or languages because you can be more productive. You don't realize the expected gains if you don't change your habits. This is harder when the new language, C#, has so much in common with a familiar language, such as C++ or Java. It's easy to fall back on old habits. Most of these old habits are fine. The C# language designers want you to be able to leverage your knowledge in these languages. However, they also added and changed some elements to provide better integration with the Common Language Runtime (CLR), and provide better support for component-oriented development. This chapter discusses those habits that you should change and what you should do instead.
西方人的思维与我们确实不同,开篇第一句话:
Why should you change what you are doing today if it works? The answer is that you can be better.
一般我们可能不会这样想,也不会这样说,而是会讲一篇云里雾里的大道理。实际上,有理不在言多,这么看似轻描淡写的一句话,就概括了整本书的精髓!
题外话:
写到《Effective C++》,就顺便把第三版拿了出来。《Effective C++》第三版英文版由电子工业出版社出版,封面设计简洁、素雅、大方,内页的印刷非常清楚,而且更值得称道的是,虽然也不能免俗,将序言译成了中文,但仍然附了原文。整本书无可挑剔!
有人说,看一个人有没有修养(教养),从他进门的动作就可以看出来。两个人同时进门,你是不是让一步?是不是彬彬有礼?有人从管理学上拈出“细节”一词,可谓精道。不能免俗地比附一下,书对于出版者也是一种“门”,出版者是否有大家风范,不是看你抢着出了多少书,而是更多地反映在一些小的细节上。如《Effective C++》第三版英文版在版权页最后注明:凡购买电子工业出版社的图书,如有缺损问题,请向购买书店调换,若书店售缺,请与本社发行部联系。联系电话:(010)68279077。有很多出版社都将缺损书的调换推给印刷厂,我认为这是一种不负责任的做法。
电子工业出版社所出计算机类的图书不算很多(我手头只有这本《Effective C++》),但就本书而言,已足见出版者的细心与周到。本书的出版,终于使Scott Meyers的书形式与内容“门当户对”了。最后以内容简介中的一小段话结尾罢:
C++是真正程序员的语言,背后有着精深的思想与无与伦比的表达能力,这使得它具有类似宗教般的魅力。希望这本书能够帮助您跨越C++的重重险阻,领略高处才有的壮美风光,做一个成功而快乐的C++程序员。
P.S.
《Effective C++》第三版英文版责任编辑:周筠。Thanks a lot for this pretty book. October 25 最新编程语言排行榜 (Top 10 of Programming Languages)据itpub.net,2007年9月份的编程语言排行前10位的分别是:
Java, C, (Visual) Basic, PHP, C++, Perl, C#, Python, JavaScript, Ruby
据Evans Data Corporation在2007年6月份发布的研究报告显示,C/C++在开发与维护时间上比Java多出近50%,年人均费用(costs per year per developer)C/C++比Java多$41, 853。所以Java排名第一并不奇怪。
C排名第二,可能是因为其代码基(code base)太大,毕竟以前的系统级软件都是用C写的。
(Visual) Basic排名第三,可见其庞大的用户群体的力量。
PHP排名第四,意味着LAMP(Linux + Apache + MySQL + PHP)作为Java和.NET之外的第三股力量实在不可小视。
C++排名第五,明年估计会落在C#之后。但无论如何,C++贡献给Programming World的Template/Generic技术将“标柄史册”!
C#问世短短几年,进入前六,进步不可谓不快,随着.NET的逐步成熟,还会继续上升。
JavaScript作为一个“小众”语言,能够进入Top 10,Web 2.0的兴起与Ajax的“噱头”功莫大焉。
做个小小推测:未来的三甲有可能是Java, C#, PHP。由于开源社区的强大力量,Java的第一位置会延续相当长一段时间,据说Microsoft加大了对PHP的支持力度,所以C#与PHP的排名将有一拼。这三种语言排名的比拼实际上体现的是背后三大平台(Java平台、.NET平台、LAMP架构)的较量!
C/C++作为系统级编程语言,其主要领地将是系统级产品(OS, Database, Compiler, and other high performance products),因为很难想象这些产品是用Managed Code开发的,所以C/C++将长期存在,就像FORTRAN/COBOL这些老“古董”仍然进入Top 20一样。 October 18 一个C#的例子 (An Example of C#)using System; namespace CLRviaCSharp public Point (int x, int y) // implement IComparable.CompareTo() // operator overloading // override Object.ToString() // static helper method for points comparison public class test // original points // ordered by IComparable.CompareTo() // ordered by overloaded operator <= // ordered by Array.Sort() // simulate Array.Sort() // this time, we define a delegate explicitly // simulate Array.Sort<T>(T[] array, Comparison<T> comparison) // utility method to swap two objects 这个例子源自Jeffrey Richter《CLR via C#》。原例是讲接口继承的,为了演示C#语言的几个特性,做了些改动。 1、通过operator overloading,Point实现了<、<=、>、>=几个更加自然的比较运算。对比points[0].CompareTo(points[1])和points[0] < points[1]。 2、在定义了Point的“比较”操作的基础上,通过generic method,Point数组实现了排序算法。 3、首先,利用Array.Sort(),可以很方便地完成Point[]的排序。 4、为了研究Array.Sort()的机制,我们实现了自己的Sort()方法。Sort method需要一个callback。C#中没有指针的概念(限于safe code),所以不能像C/C++那样通过将一个指向函数的指针作为参数而为Sort提供一个callback。C#实现callback的机制是delegate。 5、例子演示了两种callback语法:一种接近于C/C++的pointer points to function的语法;一种是正规的delegate语法。对于C/C++程序员来说,正规的delegate语法非常别扭,这也是C#提供简化语法的原因! 6、注意Sort()内的cmp的调用(invoke)语法:可以直接应用cmp(pList[i-1], pList[i])语法调用callback,也可以用cmp.Invoke(pList[i-1], pList[i])这种正规的delegate调用语法。但这种方式没有前一种方式自然,这也是C#为C/C++程序员简化语法的原因罢。Don Box对这种简化提出了异议:In my opinion, this slight obfuscation adds little to the usability of delegate. -- Don Box, Essential .NET, p.185 7、C++ STL的理念是Program = Algorithm + Data Structure,算法可以应用于任何实现了某种Iterator的Container上,从而实现算法复用。C#中没有全局函数的概念,从而导致算法和数据结构无法分离,如Array有自己的Sort(),List<T>也有自己的Sort(),等等。本例中的Swap<T>就是一个例子,所有的排序算法都需要Swap,所以都需要实现自己的Swap。这种reinvent-the-wheel的工作实在有违generic的精神。 8、Sort()之所以需要一个callback,是因为Sort本身不知道如何去比较所操作的数据对象(points),这是数据对象自己才能决定的事情,这也是一种专业化分工罢。无论是现实世界还是程序世界,都是work effectively的不二法门。 October 15 《The C# Programming Language》及其它学过C的,没有不知道K&R的《The C Programming Language》的……
学过C++的,没有不知道Bjarne Stroustrup的《The C++ Programming Language》的……
K&R在《The C Programming Language》的第1版序中指出:
本书的目的是帮助读者学习如何使用C语言编写程序。
Bjarne Stroustrup在《The C++ Programming Language》的特别版序言中指出:
The primary aim of this book is to help the reader understand how the facilities offered by C++ support key programming techniques. The aim is to take the reader far beyond the point where he or she gets code running primarily by copying examples and emulating programming styles from other languages. Only a good understanding of the ideas behind the language facilities leads to mastery. Supplemented by implementation documentation, the information provided is sufficient for completing significant real-world projects. The hope is that this book will help the reader gain new insights and become a better programmer and designer.
《C》&《C++》都明确表示,是用来帮助读者学习如何用C、C++写程序的,而不是语言参考手册,也不是标准规范。
如果你以为《The C# Programming Language》也是如此的话,那就大错特错了!Anders Hejlsberg在前言中指出:
这是一本C#编程语言的详尽参考书。
《The C# Programming Language》(Second Edition)由C#团队的Anders Hejlsberg,Scott Wiltamuth,Peter Golde著,与《C》和《C++》相同的是,都是由语言设计者所著,而且书名也遵循同样的格式。但也仅此而已。《C#》白白占用了这样一个好名字!其实书名应该叫《The C# Language Specification》!就像《The Java Language Specification》一样。因为《C#》与《Java》的体例是一样的,而且《C#》与Microsoft在MSDN上公布的The C# Language Specification内容一样!
这是不是一种“哗众取宠”呢?不敢妄言,但名不符实倒是真的。
K&R《The C Programming Language》(Second Edition)影印版由机械工业出版社出版。
Bjarne Stroustrup《The C++ Programming Language》(Special Edition)影印版由高等教育出版社出版。
Anders Hejlsberg《The C# Programming Language》(Second Edition)影印版由人民邮电出版社出版。
《C》的印刷质量太差!好好的书,就这么给糟蹋了!
《C++》封面注明是“教学用书”,但其印刷质量无可挑剔,足以珍藏!
《C#》是精装本,白色的封面,本来可以给人一种联想的空间,却非要放个不知道从哪个墓穴中出土的马,仅有的一点美感全给破坏了。而且好象不知道怎么吹好了,“典藏原版书苑”还嫌不够,还要弄个“智慧巅峰Summit of Human Intelligence”,太俗艳!哗众取宠!
《C》被流氓给糟蹋了,《C#》成了披金戴银的暴发户,只有《C++》秉承学院派传统,朴素中流露着自然的优雅!
P.S.
《C》和《C#》的前言都被人翻译成了中文,这种“越俎代庖”的行为非常恶劣!买影印版就是要看原文,为什么不尊重读者呢?!
费了半天劲,终于找到了Anders Hejlsberg的前言原文,其中那句话是这么说的:This book is a complete technical specification of the C# programming language. 却被译者翻成了“这是一本C#编程语言的详尽参考书”,真是岂有此理!
许多Book Review都认为这本书名实不符,其中一个读者这么说:
When I first heard about this book I thought it would contain concise information regarding all aspects of the C# language. But I was totally disappointed when I actually read the book.
Nearly 85% of the material has been copied from the MSDN Library as such with some minor alterations at some places.
www.amazon.com上的一篇书评这样写道:
In my opinion, the book's one major flaw is the misnomer is gives off to the buyer, which unfairly at this point in the .NET game, implies the de facto expectation for a self-help book on learning various aspects of Microsoft development. The true purpose of the book could have been better promoted with the inclusion of a subtitle, something like "The C# Programming Language - An Architect's Guide to the Specification", or something making the true purpose a bit more obvious.
胡言乱语之“正音”据说现在中学语文教学的重点之一是“正音”,而且央视的读音也已经“正”过来了,如(括号中为正确读音):
芝麻糊(沪),尽(紧)快,气氛(纷),情不自禁(今),玫瑰(归),..........
似乎字典里是这个音,但……这是普通话么?谁审的音?为什么要读成这样?
如果老鼠不再读老鼠,而读成老叔,太阳不再读成太阳,而是太央,上帝啊,这还是中文么?
设想一下,南方黑芝麻糊的广告,那一声吆喝,如果变成“黑芝麻沪”…… |
|
|