游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2785|回复: 7

“面向对象”一词指2方面:面向类和实例,与面向东西

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-9-15 12:35:00 | 显示全部楼层 |阅读模式
引言

之前的文章“面向对象语言的语义学中的意味不明之处”中,我主要从类库用户的观点上进行了分析(方便用户)----但忽视了开发者方面,本文将论述这个问题。

我看到现在各种各样的语言,都在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() 这样的形式。

----------------------------------------------------------------------------
就是说,不要站在编码实现人员的角度来设计接口,而要迎合我们的设计蓝图,这同时也等于迎合我们的用户
----------------------------------------------------------------------------
( * 其实,在上一篇文章中阐释了,有些时候,采用“格语法”来表达你的类库接口更好些。不过,据我了解,那样的话你就需要自己写编译器 )

23

主题

515

帖子

552

积分

高级会员

Rank: 4

积分
552
发表于 2008-9-15 23:55:00 | 显示全部楼层

Re:“面向对象”一词指2方面:面向类和实例,与面向东西

再多学两年

3

主题

79

帖子

79

积分

注册会员

Rank: 2

积分
79
发表于 2008-9-16 00:48:00 | 显示全部楼层

Re:“面向对象”一词指2方面:面向类和实例,与面向东西

两年不够

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-9-16 12:57:00 | 显示全部楼层

Re:“面向对象”一词指2方面:面向类和实例,与面向东西

楼上两位看来功夫比我深多了嘛。那么请两位来谈谈,在下洗耳恭听,如何?

3

主题

79

帖子

79

积分

注册会员

Rank: 2

积分
79
发表于 2008-9-16 16:12:00 | 显示全部楼层

Re:“面向对象”一词指2方面:面向类和实例,与面向东西

两年之后你再来看你自己的贴

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-9-16 16:20:00 | 显示全部楼层

Re:“面向对象”一词指2方面:面向类和实例,与面向东西

谢谢。
我可以预想得到会是什么情形。

比如我现在回头看2年前自己的帖子,真垃圾阿。

-----------------------------------------------------

其实本文主要是想补充上一篇文章中的疏漏,
避免读者对OO产生片面的看法。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-12-23 19:43:00 | 显示全部楼层

Re: Re:“面向对象”一词指2方面:面向类和实例,与面向

疯子阿虹: Re:“面向对象”一词指2方面:面向类和实例,与面向东西

再多学两年


algorism based one ?

39

主题

170

帖子

170

积分

注册会员

Rank: 2

积分
170
发表于 2008-12-26 00:03:00 | 显示全部楼层

Re: “面向对象”一词指2方面:面向类和实例,与面向东西

实践 出 真理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 15:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表