摘要:
动态语言简谈
叹号急不可耐地问:“现在可以谈动态语言了吧?”
冒号感言:“曾几何时,动态语言还只是陪太子读书的角色,那时候它们的名字是‘脚本语言’。近来却迅速崛起,俨然有与静态语言分庭抗礼之势。”。。。
程序是为终端用户服务的,而脚本是为程序员服务的。。。
动态语言秉承的一个理念是:优化人的时间而不是机器的时间,因此为提高人的生产率而不惜牺牲部分程序的性能。。。
两类语言的风格的确大相异趣:待静态语言披盔戴甲、备马抬枪之际,动态语言已衣袂飘飘,长剑出手了。。。
当脚本语言穿上动态语言的彩衣,昔日不起眼的毛毛虫便羽化成碟,开始飘舞在众人追逐的目光之中。但静态语言也绝不会淡出人们的视线,它如矫健的苍鹰,依然有搏击长空的雄力。程序员只要保持严谨的作风和开放的心态,既有稳如泰山的马步,又有一跃凌空的飞腿,静如处子,动如脱兔,如履平地般游走于高高的梅花桩上,绝无跌落之虞。。。 阅读全文
摘要:
讨论C语言 , C++ 和D语言
问号忙问:“您打算比较哪些主流语言呢?”。。。
关于C语言,前面多次提到。这是一把历久弥新的宝剑,一旦出鞘,依旧寒光逼人,锋利无俦。有了它,便如战将有了佩剑,平添一分独闯敌营的胆气。。。
能力越大,责任越大,风险越大。此话既适用于编程语言,也适用于程序员。。。
指责C++不是100%OOP的说法更是荒谬之极。OOP又不是金子,含量越高越好。试图把一切都装进OOP的箱子里的想法无异于削足适履。。。
C与C++同为系统语言,决定了它们的理念是:优化机器的时间而不是人的时间,优化机器的记忆而不是人的记忆;假设编译器是愚蠢的而程序员是聪明的,因此赋予程序员更多的权利、义务与责任。。。
C++是匹无辔无鞍的野马,看似桀骜不驯,若能顺性而御,必能足踏飞燕,行千里而不劳。。。 阅读全文
摘要:
关于编程语言的讨论
教室里,学员们正热火朝天地讨论着流行的编程语言。。。
通禅悟道者拈花不语,坐井观天者蛙鸣鼓噪。。。
如果说编程范式是一种文化,那么编程语言更像是一种宗教——尽管它本不该是。。。
对待一门语言的态度应该是:与其抱怨争执,不如扬长避短。。。
对一种语言最大的批判是发明一种与此语言有类似功用的新语言;从另一个角度看,发明一种语言也是对先前语言的一种最高的赞美。。。
过分拔高一种语言与抹煞语言之间的差别是两种极端,皆为秕言谬说。。。
语言为本,余者为末。许多人偏偏本末倒置,常常为在IDE、框架、设计工具等中挖掘到某一新功能而欣喜不已,或者津津乐道于各种语言的优劣高下,却对正在使用的语言中大量的宝藏视而不见。这些人若有幸拜关公为师,他们最艳羡的一定他的赤兔马和青龙偃月刀,或许还会抹红脸蓄长须什么的,就是不太愿学他的盖世武功。。。 阅读全文
摘要:
讨论Java和C#
逗号提出:“现在应该到了Java时间吧。”
冒号顺水推舟:“下面谈论的重心从刚才的系统语言转到平台语言——Java和C#。”。。。
这既是程序员之幸——语言之间可以互相取长补短,共同进步;也是程序员之不幸——往往不得不在众多语言中作艰难选择,或者多花精力学更多的语言。。。
以前人们试图在语言的威力(power)和生产率(productivity)中寻求最佳平衡点,现在似乎更想鱼与熊掌兼得。。。
Java的目的是让一种语言在多种平台上运行,而C# 的目的是让多种语言在一种平台上运行。
两个平台语言,一个重在语言,让语言向平台扩散;一个重在平台,让平台来凝聚语言。。。
编程语言绝非象牙塔中之物,实乃技术和商业合力推动的结果。。。
C++提供了一马平川的大路,也提供了陷阱密布的小道;Java则在大路上铺设水泥,同时封锁了捷径小道;C#同样填平了大路上的坑坑洼洼,但把一些小道上‘此路不通’的牌子偷偷改成了‘此路危险’。 阅读全文
摘要:
讨论VB、Delphi和JavaScript
稍事休息后,冒号切换了话题:“接下来简单聊聊Visual Basic和Delphi。”。。。
在以网络为中心的企业解决方案中,作为平台语言的Java和C#是两棵比肩而立的大树,在它们周围生长着郁郁葱葱的动态语言的小草。。。
待友之道,贵在放大其优点而缩小其缺点,对待语言亦当如此。其实JavaScript的强大和优雅是超乎想象的,它如一只神奇的魔袋,乍看平淡无奇,却总能变出意想不到的宝贝。。。
前台编程涉及面专,绚丽花哨的界面更容易让初涉编程者产生成就感;后台编程涉及面广,需要深厚的技术积累和缜密的设计思维;底层编程涉及面深,给人神秘莫测之感。然大道相通,难者亦易,易者亦难。。。 阅读全文
摘要:
讨论Perl、PHP、Python和Ruby 语言
“剩下四种动态语言,我们将之归为后台脚本语言。”冒号说着画了张图表。。。
Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯。。。
叹号——没有最好的语言,只有最合适的语言。
逗号——没有糟糕的语言,只有糟糕的程序员。
问号——没有一种语言是万能的,只会一种语言是万万不能的。
引号——废除对语言的宗教信仰,建立对语言的哲学思维。
句号——编程就是在人脑和电脑之间寻找最佳平衡点的过程。。。 阅读全文
摘要:
软件设计中的抽象思维
冒号健步走进教室,学员们立刻正襟危坐,进入战备状态。。。
语言是形,范式是神,这次我们将二者融合,争取做到形神兼备。。。
我们的重心不在知识的枝节,而在知识的本源。因此无论讨论Java还是OOP,我们不追求系统和全面,但力求从不同的选点、角度和深度来展示知识的活性。。。
那么什么是抽象呢?不妨概括为:去粗取精以化繁为简;由表及里以异中求同。再精炼些,抽象就是作减法和除法。。。
软件设计者的任务是将复杂混沌的现实世界映射到精确严格的虚拟世界,要完成这种多对一的映射,抽象无疑是必由之路。。。
这种通过规范使代码的功能与实现相分离的方法称为规范抽象。。。 阅读全文
摘要:
介绍抽象数据类型
问号抢着说:“我知道了:过程抽象的结果是函数,数据抽象的结果应该是数据类型。”。。。
数据结构强调具体实现,侧重应用;抽象数据类型强调抽象接口,侧重设计。。。
接口是纲,实现是目。纲若不举,目无以张。。。
人们多采取‘整体设计以数据为中心,局部实现以算法为中心’的方针,以增强系统的可维护性。。。
数据类型的接口与实现的分离,有利于开发时间的分离以及开发人员的分离。。。
抽象——接口与实现相分离;数据——以数据为中心组织逻辑;类型——单纯而定义良好的概念。。。
抽象——尤其是数据抽象——才是OOP的核心和起源,尽管它们并非OOP的专利。。。
只有贯彻ADT思想,设计出来的类才会是‘万人迷’:有优雅的外形——抽象,有丰富的内涵——数据,有鲜明的个性——类型。。。 阅读全文
摘要:
OOP中的封装与信息隐藏
“用广东话说,真是有型有料又有性格啊!”叹号啧啧连声,“这哪里是在设计软件,分明是在设计心仪的对象嘛。”。。。
广义的封装仅仅只是一种打包,即package或bundle,是密封的但可以是透明的。。。
狭义的封装是在打包的基础上加上访问控制(access control),以实现信息隐藏。。。
抽象意味着用户可以从高层的接口来看待或使用一类对象,而不用关心它底层的实现,而黑盒封装意味着用户无权访问底层的实现。。。
访问控制不仅是一种语法限制,也是一种语义规范。。。
“通,则大处圆融合一而小处各具其妙;不通,则大处千变万化而小处无所分别。”冒号又打起了禅语 ,“领会OOP的精髓绝非一年半载之功,但若以抽象与封装为钥,必可早日开启通达之门。。。” 阅读全文
摘要:
适应变化的能力是衡量软件质量的重要标准
第七课刚一开堂,冒号就提了一个问题:“如果把一个Java程序中所有的private关键字换成public,请问该程序还能工作吗?”。。。
软件的难点有二:其一是逻辑的复杂,其二是需求的变化。许多程序员看重前者而看轻后者,大部分时间花在寻求解决方案上,而不是在选择解决方案上。。。
软件之软,体现在适应变化的能力。。。
软件的变化大致分两种:一种是出于内在需求而作的结构性变化,通常以改善软件质量为目的,即所谓的重构(refactoring);一种是出于外在需求而作的功能性变化,通常以满足客户需要为目的。。。
信息隐藏虽能将抽象接口与具体实现分离,但仍然封装在同一类中。桥梁模式则让二者彻底解耦(decouple),增强了对变化的适应力,具有更大的灵活性和可扩展性。。。 阅读全文
摘要:
软件接口服务的主客双方应遵循的准则
叹号幡然反省:“以前我们做OOP编程时,总是专注于如何利用其他类来解决问题,而较少考虑自己设计的类对其他类的影响。”。。。
作为服务的提供者,最重要的是讲诚信。首先,服务要有可靠性,不能阳奉阴违——即接口必须履行它的承诺;其次,服务要有稳定性,不能朝令夕改——即接口一经公开,不得随意变更。。。
此外,高质量的服务还要有纯粹性和完备性。Unix有一个哲学:‘一个程序只做一件事,但要做好’。用在OOP上,则是:‘一个类只提供一套服务,但要完善’。。。
关键不在于服务数量的多寡,而在于服务的一致性和关联性。。。
作为服务的享受者,最重要的是讲规矩。。。
以违背服务初衷的方式享受的服务,如同盛夏的豆腐——即使没有变质,也是不能持久的。。。 阅读全文
摘要:
OOP中的访问控制
问号提问:“信息隐藏是否专指用private来控制访问?”。。。
初级程序员的理想是为所欲为——能用编程解决一切问题;中级程序员的理想是尽善而为——追求最佳解决方案;高级程序员的理想是有所为有所不为——重在整体设计的选择,能抵制局部技巧的诱惑;最高理想是无为而无不为——无论宏观设计还是微观实现,均非刻意选择,却自然合度。。。
从软件应变的角度来看,访问控制是对修改所带来的副作用的控制。。。
客户意识对一个程序员的重要性,丝毫不亚于对一个企业的重要性。。。
千万不要为追求廉价的重用而轻易扩大接口范围,莫以自身之便而致客户之不便,莫以一时之便而致长期之不便。。。 阅读全文
摘要:
Introduction This tutorial could well be the simplest windows program you could ever write. All you need to understand this tutorial is the basics of windows messaging. This tutorial is about the CB... 阅读全文
摘要:
This class is a simple owner-draw CButton class that allows you to play animation files (AVI's) within the button. This class can be used like any other owner drawn control - simply include the heade... 阅读全文
摘要:
Introduction I was actually experimenting with different brush option to create a glassy orb but it does not work .. But i still like the effect even though it wasnt really what i want .. So i turn t... 阅读全文
摘要:
Introduction SBButton control is a button control from a set of controls (Sysbytes Controls) I'm developing to use with an application I'm writing. This button control can be customized in almost any... 阅读全文
摘要:
Introduction ThemeButton is a CButton derived class. It is a very simple graphical button, and has special bitmaps representing five button states: normal, hot, pressed, disabled, and default. Button... 阅读全文
摘要:
Contents Introduction Background Owner-draw DRAWITEMSTRUCT Inside WndProc() The function to handle WM_DRAWITEM Additional information History Introduction Although ... 阅读全文
摘要:
Introduction I wanted to draw a button which is transparent to its back ground image and hence had gone through several articles about button styles - transparent buttons. They were all very tedious ... 阅读全文
摘要:
Introduction The idea was to have a small piece of code which makes it easy to create a button with an icon on it. I saw a lot of great code, but it was not exactly what I want. So I decided to creat... 阅读全文