|
|
引言
之前的文章“面向对象语言的语义学中的意味不明之处”中,我主要从类库用户的观点上进行了分析(方便用户)----但忽视了开发者方面,本文将论述这个问题。
我看到现在各种各样的语言,都在OO化,以加强功能,那么这里说的“OO”具体指什么?----本文要讨论之。
那篇文章中,我只是含糊地使用了"面向对象"一词,而并未严格定义之(何必?),
而这篇文章中,我将稍微细致一些,使用“面向类和实例”与“面向东西”这两个名词(稍后会解释)。。。
>> 面向东西
写完那篇文章后,昨天无意中回忆起,当初刚学习VB6和刚开发RpgDIY的时候的事情来。
话说当时阿,我对vb6的类库的 *使用* 已经比较熟悉,可是我纳闷,“我怎么样才能有自己的对象,方法?”---- 于是在大约3,4年前,开始写RpgDIY的最初代码时,我采用了:
ClickObject(playerIndex, toPlayerIndex);
Talk(playerIndex, toPlayerIndex, text);
等函数来表达我的意思。
在实现这些之前,我首先想到的接口的设计。而我熟悉vb6类库的使用,自然也想按照“obj.XXX(...)”这样去设计我自己的接口。可惜,当时还不知道怎么样才能以这样的 *语法格式* 去编程。无奈,只好牺牲语法格式,而采用 C 风格去书写了。
----------------------------------------------------------------------------
当时的思维还很肤浅,虽然感性地认识到了“vb6类库中的对象”,但尚不知道什么是“class”。那么,这种思想(“一个东西,有属性,有方法”),在本文中可以我把它叫做“面向东西”。
----------------------------------------------------------------------------
( * 顺便说下,之前那篇文章中写过,这种思想的字面表达可以是: C 风格, C++ 风格,以及类似于人类语言的“格语法”风格, 各有利弊 )
此外我又想起来一个典型的例子:
以前我一直以为,自定义的 Form1, Form2 之类的是“对象”(后来知道是子类)
----这说明在搞不清什么东西是class的情况下,我仍然有“面向对象”的观念----这里的“面向对象”,在本文中,为了避免歧义,我采用“面向东西”一词。
还有在gdi中我们不是也经常与“对象”打交道吗?----这种“对象”,本文叫做“东西”。
----------------------------------------------------------------------------
以上说明了,“面向东西”,与"class""instance"概念无直接关系
----------------------------------------------------------------------------
>> 面向类和实例
在win32平台下,每一个应用程序都是一个instance(实例)。实例是什么?简单说就是一类事物的一个具体化----你创建的整个工程可以看作一个“类”,而执行中的exe就是它的一个实例。即便是global变量,对于不同的实例来说,可能是不同的!
但这里的“类”“实例”,和我们工程的思想,架构,无任何关系----不管你编写多么糟糕的代码,也会有这样的“类”和“实例”。
再看一个稍微不同的例子:
先不管你的代码表示什么意思,实现什么功能。在你的代码中,经常会用到C++或其他语言的“class”这个东西不是吗?比如:
ManagerA->MovePlayer( Player, Door );
像这样的代码我们可以说:“有一个CManager类,该类有一个ManagerA实例”。但(大多数情况)实际表达的意思是, Player这个“东西”,移动到 Door 这个“东西”的位置去。----这里你用class CManager来编码实现你的脑海中的设计,但,这里的“class”“instance”和你脑海中的设计蓝图没有对应关系!(大多数情况下如此)
----------------------------------------------------------------------------
以上说明了,"class""instance"与“面向东西”无直接关系。我把采用了“类”“实例”的编成方式叫做“面向类和实例”
----------------------------------------------------------------------------
>> 能不能说“面向东西”是主要的,“面向类和实例”无关紧要?
RpgDIY中的早期代码就是极好的例子,和一部分 C 程序员一样,它很好地(也很直观地)采用了“面向东西”的设计思想。
可惜的是,那些早期代码太乱了!
而后来学习了class,instance,inherit,abstract等概念后的代码,比如其中的 UI 类库和 UI 应用层代码,以及游戏编辑器代码,我就比较满意(尤其是前者)----编程轻松,bug少,调试好,可扩充性好...
----------------------------------------------------------------------------
面向对象和实例,是实现我们脑海中设计蓝图的重要而强有力的武器
----------------------------------------------------------------------------
>> 正确区分“面向东西”与“面向类和实例”
学习了了class,abstract等概念后,作为当初的RpgDIY中的UI(以及后来的C++版本,这是第一个C++版本的UI,已经整改了),它的不足之处在于,认为“东西”与“类和实例”是一一对应的!----导致的问题比方说有:在许多细节上实现的难度,以及每当扩充一个新的小功能时,都需要考虑一遍,与其他类的合作。----后果是,别看现有代码 *使用* 起来挺爽的,但扩充其他功能难度就大了。(所以7月份我主要在做这个整改)
----------------------------------------------------------------------------
总而言之,不能直接按照“东西”的架构来创建类架构
----------------------------------------------------------------------------
但是反过来我又要说一个问题是,(通常是一些较传统的C++类库)一些类库的接口设计,只是方便了开发者的编码实现,对于用户来说一点也不方便,比如:
Engine->GetTextureWidth( iTextureIndex );
站在用户角度,我宁放弃 C++ 而转向 C ,也不愿意这样写代码!
----不要这样,请封装成 C 风格,要么更好一点,封装成 Texture->GetWidth() 这样的形式。
----------------------------------------------------------------------------
就是说,不要站在编码实现人员的角度来设计接口,而要迎合我们的设计蓝图,这同时也等于迎合我们的用户
----------------------------------------------------------------------------
( * 其实,在上一篇文章中阐释了,有些时候,采用“格语法”来表达你的类库接口更好些。不过,据我了解,那样的话你就需要自己写编译器 ) |
|