矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 1978|回复: 14

求助:面向对象 与 面向过程 及全局变量

[复制链接]
     
发表于 2024-12-13 14:49:33 | 显示全部楼层 |阅读模式
C++环境,编写一个打怪物的游戏,分为 主角 和 怪物。
这其中肯定涉及到主角和怪物的一系列数据:精灵图片的高宽、位置、速度、生命值、……

如果采用(面向过程)全局变量方式,则这些数据可以直接使用。程序清单也简洁漂亮。

而推荐的面向对象方式,需要设置两个类:主角类CLASS、怪物类CLASS
类内各自的数据成员(高宽、位置、速度)都是private的。还必须添加很多的SetPosition(int X, int Y) 、getPosition()……成员函数,程序长度增加很多,代码显得繁琐、凌乱。在类外使用一个变量,必须调用一次函数,才能得到想要的值。为什么推荐这种脱裤子放屁的方法?

若是开发操作系统、PhotoShop这些大型软件,倒还可以理解。
     
发表于 2024-12-13 14:59:01 | 显示全部楼层
你自己最后一句都说明白了。
想想多人协作开发一个软件;想想软件比较大的时候;想想人员不断的更换,而软件需要迭代版本的情况。

这个时候你用全局变量的话,在哪里被非法修改了,你自己都不知道。而如果用类封装的话,你自己的私有数据,你不开接口,别人就没法修改。


再说了,也没说面向对象一定比面向过程优秀,Linux内核都是C语言写的,没有class的概念,不也是一样吗?

所以说合适就好。
回复 支持 反对

使用道具 举报

     
发表于 2024-12-13 15:17:43 | 显示全部楼层
这是后来者底看法,其实人家早就把裤子脱了20年了,直接放就可以了。优点就是张三放的屁李四没办法只能直接闻,让你闻多少你就只能闻多少。想换个味道没办法。
回复 支持 反对

使用道具 举报

     
发表于 2024-12-13 15:34:37 | 显示全部楼层
当程序结构非常复杂的时候,重要的就不是如何放屁,而是如何让别人知道你放屁了,这时候脱了裤子放屁就非常有用了

而且,可能你对面向对象和面向过程的理解还停留在语言特性上,但面向对象还是面向过程,只是程序建模方式的区别,与语言本身没有直接关联,语言的区别只是对模型的支持程度不同,比如C++对面向对象的支持比C语言深,但C语言对数据结构的支持要比C++好,但不代表C语言无法体现面向对象的特性,也不代表C++无法实现高效的数据结构,无法是难度不同而已。Linux内核的很多模块都是在C语言下使用面向对象的方式建模的,典型的就是Linux驱动程序模型。

而且不同功能的程序,适用的建模方式不同,所以面向对象还是面向过程并无优劣之分,主要看适用场合
回复 支持 反对

使用道具 举报

发表于 2024-12-13 15:49:06 | 显示全部楼层
面向对象和C++没有关系,面向过程和C也没有关系。至于项目用什么,有很多种因素,比如可用的SDK,人员能力擅长,投入等等。

还梦想全局变量呢,全局变量这种东西早就被无数的编码规范禁用。你可以去了解一下,稍微大点的游戏,哪个主要部分不用C++来写...
回复 支持 反对

使用道具 举报

     
发表于 2024-12-13 15:55:37 | 显示全部楼层
老哥牛逼,比那些编发论文、搞方法论的行业大佬牛逼俩档次
回复 支持 反对

使用道具 举报

     
发表于 2024-12-13 15:56:35 | 显示全部楼层
chipset009 发表于 2024-12-13 15:49
面向对象和C++没有关系,面向过程和C也没有关系。至于项目用什么,有很多种因素,比如可用的SDK,人员能力 ...


说到全局变量,其实很多编程规范明文禁止的还有比如goto这种东西,但不论全局变量还是goto,并非完全不能用,编程重要的是看设计,而非规范,规范只是为了避免产生不好的设计,但如果设计能力强,自然可以超出规范,所以根本在于编程者能否掌控这种自由度。

编程实际上和书法绘画一样,是一种技艺,任何技艺,当使用者能力不足时,还是老老实实按规范搞,当技艺足够时,自然百无禁忌

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2024-12-13 16:22:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2024-12-13 19:32:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2024-12-13 19:44:40 | 显示全部楼层
MF35_ 发表于 2024-12-13 15:56
说到全局变量,其实很多编程规范明文禁止的还有比如goto这种东西,但不论全局变量还是goto,并非完全不 ...

国内小公司就是乱堆代码垃圾,胡弄出来完事。用什么随意,根本就没有管。
大公司,尤其老外的,事可多了。同样都是禁用,有的是Mandatory, 有的是Required,有的是Advisory,程度可是差多了。
goto属于Advisory级别,备注原因,只要理由充分(例如多维数组里跳出),代码评审时通过就可以了。
全局变量属于Mandatory级别,备注清楚只是必要条件,一级级通过,最后得说服总工[架构师Leader]才行。
回复 支持 反对

使用道具 举报

     
发表于 2024-12-13 21:09:36 | 显示全部楼层
本帖最后由 MF35_ 于 2024-12-13 21:12 编辑
chipset009 发表于 2024-12-13 19:44
国内小公司就是乱堆代码垃圾,胡弄出来完事。用什么随意,根本就没有管。
大公司,尤其老外的,事可多了 ...



没错,这些东西不是不能用,而是要用的合理,用的必要。比如goto一般用于错误处理跳出是没问题的,因为C没有C++的throw机制,所以goto在需要抛出多种错误时是必要的,这些情况不用goto反而逻辑非常混乱。而全局变量有的时候也是必要的,但要设计的合理,而且不能滥用,小学生程序员爱犯的错误就是搞什么都弄个全局变量,C语言又没有name space,全局一多,然后链接器再开了no common,一旦重名完全是灾难性的

至于代码质量问题,就我的经验来看,规范制定的再完善,构架设计的再合理,也架不住一群小学生程序员乱搞,所以即便大公司,屎山代码也是常有的事,审核机制的功能非常有限,做不到多深入,顶多避免一些低级问题,如果靠审核避免bug,那审核的人还不如自己写效率高呢
回复 支持 反对

使用道具 举报

     
发表于 2024-12-14 00:44:11 | 显示全部楼层
楼主实在是过于后知后觉了,近些年面向对象编程热度已经开始下降了,而函数式编程在逐渐兴起 ......
回复 支持 反对

使用道具 举报

     
发表于 2024-12-14 13:50:50 | 显示全部楼层
scoopydoo 发表于 2024-12-14 00:44
楼主实在是过于后知后觉了,近些年面向对象编程热度已经开始下降了,而函数式编程在逐渐兴起 ......

面向对象在新世纪初完全被国内神话了,以至于当时国内UML火热,搞什么设计都用UML,只要是搞程序的,不会UML就低人一等。大概08年前后热度逐渐下去了,开始意识到面向对象不能解决一切问题,UML也是万能药,针对应用特点采取不同的建模方式才开始被广泛接受。其实编程建模根本就不可能有放诸四海皆准的东西,人机交互、过程控制、通信、数据库、业务流,这些应用的特点差别很大,不可能有一种编程模型把它们全部涵盖。

真应了那句话,高手驾驭工具,庸人只能被工具驾驭,试图找出一种万能工具解决一切问题,只能说明行业水平有待提高
回复 支持 反对

使用道具 举报

发表于 2024-12-14 14:10:07 | 显示全部楼层
任何行业都没有包治百病的灵丹妙药。OO有OO擅长的地方,面向过程有面向过程擅长的地方,泛型有泛型擅长的地方。只靠语言显然不行,那么的库都要根据实际项目情况选用。

就拿楼主说的游戏为例,常规的画面最起码也得DirectX或OpenGL,如果想更好的利用硬件资源那得DirectX12或者Vulcan。这种东西只能做画面,想要文字还得做文字处理,比如为了提升渲染速度,字符光栅化可用FreeType,字体需要做子集可用Harfbuzz等等。了解这些东西免不了看大量的文档和实践,英语和程序调试能力都不能差。其实这些还都是基础,真正要解决问题的时候需要运用各种算法。

如果还纠结在语言的某种特性上,觉得那些规定这么不顺那么不应该,别说实战,距离入门还有十万八千里...
回复 支持 反对

使用道具 举报

     
发表于 2024-12-14 17:59:05 | 显示全部楼层
MF35_ 发表于 2024-12-14 13:50
面向对象在新世纪初完全被国内神话了,以至于当时国内UML火热,搞什么设计都用UML,只要是搞程序的,不会 ...


本世纪初的时候一个美国同事送了俺两本原版书,一本是大名鼎鼎的四人帮的 Design Pattern,还有一本就是十八摸 Rational Rose 的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-29 07:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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