游戏开发论坛

 找回密码
 立即注册
搜索
查看: 21525|回复: 88

面向对象语言的语义学中的意味不明之处,剧本中常出现

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

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

有些时候,一些代码很难按照面向对象进行划分。有时候,面向对象会引起你思维上的不清晰,即使用了面向对象的语句的意义如何。本文将探索这些问题。。。

/* 先看看一个 C-style 的例子代码 */
Move( Player, Door );
SetHP( Player, NewHP );

// 再来看一个 C++ style的版本
Player->Move( Door );
Player->SetHP( NewHP );

上面这两个版本实际上是等价的.
前者,类似于菲律宾语等,后者类似于英语等。

现在我们看一个不同的C++版本:
Manager->Move( Player, Door );
Manager->SetHP( Player, NewHP );

这3种版本完成的都是同样的事情,
现在我们按照实际意义,用人类语言,分析代码的一下语义:

Manager->Move( Player, Door ); 这句可以用一下几种句子解释:

Move谓语,移动动词: Player主格 Door目的格
Move谓语,移动动词使役: Manager主格 Player宾格 Door目的格

Manager->SetHP( Player, NewHP ); 这句可以用一下几种句子解释:

SetHP自动词: Player主格 NewHP目的格
SetHP他动词,反身: Player主格 Player宾语 NewHP目的格
SetHP他动词: Manager主格 Player宾格 NewHP目的格

上述过程中发现的问题:
我们发现,人们在阅读代码时,对于理解第2个SetHP的语义,要比Move的思维复杂些。
实际上,当问题变得更加复杂时,尤其是在用面向对象的思想去描述剧本时,在语句叙述上有时难免要“想一下”,比如 “SetHP”这样的东西具体是什么意义?等等。

顺便说一个别的例子,比如我们现在有这样一个句子:
AAA->GiveItem( BBB, CCC ); 试问,这是什么意思?虽然“GiveItem”是一个有意义的单词,但仍然没有告诉我们整个句子的意义。

再来看一个更有意思的情况:

string->append(tmp); 这句可理解为:

append他动词: (未知)主格 string目的格 tmp宾格
append自动词: tmp主格 string目的格
append他动词被动态: string主格 tmp宾格

-----------------------------------------------------------------------------
我想,这有可能是一部分程序员不愿意用面向对象的原因之一
-----------------------------------------------------------------------------

在继续后面的论述之前,我提醒一下读者,包括我自己:
----面向对象是思想(语义),不是书写风格( C ? C++ ? )

因为面向对象引入了一个“对象”之概念,现抛开名称空间问题和软件工程等问题不谈,单就语言层面上来说,“对象”可以说是函数(动词)的参数(名词)的特殊化!

比如,不用面向对象思想:
func( a, b, c ); 这里 a,b,c 三者都是平等的;

而采用面向对象思想之后,同样用C-style以方便对比
method( pObj, s, t ); 这就变得不一样了----你心里明白,pObj是一个对象----换言之可以把对象看作是一个特殊地位的argument。

但是,这个特殊的arg----对象----其到底在句子中具有什么地位值得我们将它特殊化?
----不知道阿,有些情况下很难确定“对象”在句子中的确切意义。

此时此刻估计 C 程序员在嘲笑咱们 C++ 程序员----因为 C 程序中,对象的概念不明确,他们可以将设计重点放在具体意思上,而不是拘泥于“对象”“类”----因为C只有全局的函数,没有人强迫他们非要按照面向对象设计(如写成&quotlayerMoveTo(player,x,y);"之类)

C++风格引起的另一个耐人寻味的问题是,实际上你已经看到过了,比如:
是设计为 Manager->Move( Player, Door ); 呢?
还是 Player->Move( Door ); 呢?
此时此刻,估计 C 程序员又在嘲笑这边了。。。

C风格的好处在于,它使得程序员将注意力集中在问题的客观的处理上,而不是“接近于一个人做一个事,比较贴近生活”,后者经常被认为是OO的好处----但实际上,我们以上的论述实际上已经表明了:

-----------------------------------------------------------------------------
面向对象,并不意味着,类似于“一个人做一个事,比较贴近生活”
-----------------------------------------------------------------------------

让我们悲观一点,极端情况下,OO会让你的思维变得不必要的复杂,而实际上 C 程序员可以轻松搞定你的问题。

但是,实践证明OO思想在这个地方异常出色(至少!):
-----------------------------------------------------------------------------
用户界面
-----------------------------------------------------------------------------
没有用过vb6, .net等现代UI库的朋友,在反驳我这句话之前请先调查一下。
我的一个比较极端的观点,OO == 用户界面。

回到正题,因为我们不只关注UI,所以我们仍然需要继续探讨先前的OO话题。

!在继续之前,请读者注意,关于符号的作用域,书写格式的问题我们不研究。比如,如果说C++风格的优点是method属于某个class的作用域之内,使得书写方便,我承认。但我们不讨论这些。

在C++风格下,总是会让我们用OO的思想来设计程序,而C风格则不管我们是否采用OO。
OO造成的负面影响(比如上文提到的那些),而C的书写风格使得我们不去拘泥于OO,而用面向过程去轻松地看待一些问题。但是----
-----------------------------------------------------------------------------
面向过程是simple的,他只是提供了一个空泛的框架,而把问题基本上扔给了我们!
-----------------------------------------------------------------------------

在OO让你的思维混乱的情况下,如果你决定这样:
func(a,b,c);
可是,在极端情况下,这样的句子很令人讨厌(特别是比如书写游戏剧本)----讨厌之处在于,句子写的太空泛,这样的代码,一眼看上去都是一成不变的函数调用,看多了会腻烦不说,意义也较难被澄清。

于是我推荐,特别是书写游戏剧本时,采用:
-----------------------------------------------------------------------------
格语法
-----------------------------------------------------------------------------

(重申一次,符号作用域问题我们不讨论。仅仅为了这个而死守OO不一定是明智的)
我们可以把一个比较有实际意义的句子,用近似于人类语言的格语法来写:

func-谓语 a-主格 b-目的格 c-宾格

因为不同人有不同的喜好,比如喜欢English,日文,中文,或者菲律宾语等等,
这些都无所谓!----既然本文不讨论书写格式----你可以用你自己喜爱的方式去书写,
只要能够基本分清这些“格”即可。例如,上面那句话实际可以有e,j,c三种实现:

a func c to b
a が c を b に func
a 将 c func 到 b

如何?读者不妨回去试试

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-9-13 17:33:00 | 显示全部楼层

Re:面向对象语言的语义学中的意味不明之处,剧本中常出现

我觉得你想得太多,想到哲学上去了。

把OO说成更贴近自然语言只是一个自夸的说法,事实上也只是部分情况下能成立的说法,并不是说OO一定如此。希望语义上接近自然语言只是一个易用性上的愿望,这在任何编程语言语法中都是半斤八两。OO方法必须要做的事是封装,有时又需要考虑效率、复杂度,最后才是语义。

另外,我觉得你外语研究太多了,与其研究那些黏着语屈折语,不如好好用汉语这门孤立语思考,就不会有这么多问题了。

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2008-9-13 20:24:00 | 显示全部楼层

Re:面向对象语言的语义学中的意味不明之处,剧本中常出现

是啊,最近一阵看LZ这个状态似乎在半梦半醒之间,有点走火入魔了,估计是发现了C++的深奥美妙之处,有点欲罢不能了,可以去冰火岛闭关修炼了。 [em13]

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2008-9-13 20:57:00 | 显示全部楼层

Re:面向对象语言的语义学中的意味不明之处,剧本中常出现

个人比较陈恳地给楼主一点建议,把时间花点在线性代数和高等数学上,绝对比研究你现在思考的问题有价值。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-9-15 10:26:00 | 显示全部楼层

Re: Re:面向对象语言的语义学中的意味不明之处,剧本中常

qrli>>
孤立语...比如: 饭我吃完了。 我饭吃完了。 必须要根据词义才能判断宾格和主格。 那么。。。

ricohcanon>>
数学知识太多了,即使我只想看看概念,时间消耗也不小。所以在学习之余思考这些哲理,有助于更快地泛化。

justlikethewind>>
研究本贴其实也花不了多少时间。
比起线性代数和微积分,我现在主要是抽空学习度量空间,拓扑空间等数学。

本文的看法有些片面,为了防止读者对OO产生片面的看法,我又写了:
http://bbs.gameres.com/showthread.asp?threadid=116974

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

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

Re: Re:面向对象语言的语义学中的意味不明之处,剧本中常

ricohcanon: Re:面向对象语言的语义学中的意味不明之处,剧本中常出现

是啊,最近一阵看LZ这个状态似乎在半梦半醒之间,有点走火入魔了,估计是发现了C++的深奥美妙之处,有点欲罢不能了,可以去冰火岛闭关修炼了。 [em13]


那么我想请问您一个问题:
一个人一星期,如果没有现成的引擎用,只有d3d,能写多少图形代码出来?
比如我认为shader代码就是十分简单的,哭笑不得的是,相关的数据输入的C++代码非常烦琐,可以说写一个图形程序,几乎所有代码都是没有意义的机械重复劳动,真正有意义的代码(shader)非常好写,不就是几个公式嘛。
----解决这些问题,只有研究语言学。

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2008-9-17 15:35:00 | 显示全部楼层

Re:面向对象语言的语义学中的意味不明之处,剧本中常出现

研究本贴其实也花不了多少时间。
比起线性代数和微积分,我现在主要是抽空学习度量空间,拓扑空间等数学。
________
大侠你太猛了,我和你在一个贴子里面出现实在是对你的亵渎。我决定下次再也不出现在你的贴子里了。就此别过啊,大侠。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

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

Re:面向对象语言的语义学中的意味不明之处,剧本中常出现

学习拓扑空间(包括度量空间),是迫不得已,是为了看懂时空理论方面的书籍,只是一个基础而以。
而且拓扑也能够解释----为什么需要立方体帖图

4

主题

220

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2008-9-26 15:17:00 | 显示全部楼层

Re: 面向对象语言的语义学中的意味不明之处,剧本中常出现

AAA->GiveItem( BBB, CCC ); 试问,这是什么意思?虽然“GiveItem”是一个有意义的单词,但仍然没有告诉我们整个句子的意义。


字不离词,词不离句,句不离文. 你单独搞一个句子出来,谁能知道你表达的意思,靠! . 万物普偏联系的基本哲学理论都不知道, 还谈语仪学!

4

主题

220

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2008-9-26 15:31:00 | 显示全部楼层

Re: 面向对象语言的语义学中的意味不明之处,剧本中常出现

面向对象是思想(语义),不是书写风格( C ? C++ ? )

这句也不对,内涵要靠形式来表现,2者相辅相成. 所以,思想要靠语言来表述,或者借助于行动,一个眼神.......  不过不管是语言也好,行动也好,眼神也吧,那一样不是形式...不是风格?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 04:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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