为什么openGL不是面向对象的?每个人都教面向对象编程+设计模式,但是OpenGL有很多全局功能。这不是很糟糕的风格吗?
5 回答
低级 API 的全部意义在于使其尽可能小且可移植。给它一个面向对象的架构将不允许这样做:
- 多态性增加了不必要的函数调用开销。
- 它迫使您使用一些相对困难的调用约定,从而降低了可移植性。
- 您不能包装面向对象的体系结构以使其具有程序性,但您可以反其道而行之;因此,使事情尽可能灵活是有意义的。如果您愿意,围绕 OpenGL 编写一个面向对象的包装器是微不足道的。
最后,你真的应该质疑你所学到的关于 OOP 的知识。不管你的学院或大学会告诉你什么,OOP 都不是程序设计的灵丹妙药。有很好的理由说明 C++ STL 中绝对没有面向对象(以及大多数 Boost)。
面向对象在某些情况下很有用,但您应该了解它什么时候有用,什么时候没用,在任何情况下,您都不应该相信任何不是 OOP 的东西都是“坏风格”。
OpenGL
- OpenGL 应该支持所有平台——在这方面 C 没有什么可比的——这要归功于几乎每个设备都可以使用相同的 API
- OpenGL 应该支持所有语言——在这方面也没有 C 语言——多亏了这一点,每一种支持调用 C 库的语言(几乎所有语言都支持)都可以使用 OpenGL
- OpenGL 是一种 API,而不是引擎——它旨在为图形硬件提供低级接口,但足够高级,可以作为对不同硬件的抽象——C 比 C++ 低得多,OOP 也不低等级
- OpenGL 是一个可以构建的框架,而不是一个完整的解决方案——没有一种真正的方式来编写图形代码,而且 OpenGL 不应该强迫我们做任何事情——作为 OOP,它会迫使我们接受他们的“解决方案”
- OpenGL不依赖于任何特定的编程范式——因此我们可以将 OpenGL 包装成一种功能性、逻辑性或 OOP 语言——或者在程序上使用它
- OpenGL 是关于效率的——没有比直接函数调用更高效的了。OOP 与适用于特定任务一样有效。
总的来说——OpenGL 的设计目的是让我们拥有所有的自由,并且不为我们做出任何选择。我所说的自由是指选择平台、语言、编程范式、引擎设计、方法论以及效率与可读性水平的自由。
为此我赞美 OpenGL,而我讨厌 Direct X。
阿门。
旁注:每个人都教面向对象编程,因为它最容易掌握。它不是唯一且唯一的真正范式。有函数式编程、逻辑编程、契约式编程,甚至还有一种面向对象的 C 语言编写方式。计算机科学中没有一个真理。至于设计模式,我可以列举出不止一些在 OpenGL 架构中使用的模式。风格不好?我见过漂亮的 C 程序,它们具有 aaaaallll 全局函数……
一般来说,OpenGL是面向对象的。它只是用一种不直接支持 OOP 的语言实现的。但是 API 是面向对象的:它由许多不同的对象类型以及在每个对象上定义的一组操作组成。并且每个对象类型的内部对用户都是隐藏的。它满足 OOP 的所有要求。它恰好是在 C 中实现的,它没有方便的类或成员方法语法。
除此之外,全局函数绝对没有错。在 C++ 中,一个常见的建议是尽可能优先使用它们而不是成员方法。在函数式编程中,全局函数是默认的。
OpenGL 是为 C 语言创建的,当时这些东西都不存在。即使是现在,他们仍然希望保留一个 C 接口,因为 C 仍然是一种广泛使用的语言。
他们应该同时维护 C 接口和 C++ 包装器,抛弃 C 并只使用 C++,还是保留 C 接口?我认为后者是最好的解决方案:对他们轻松,对我们来说不太难。
也就是说,OpenGL 界面确实很糟糕。很多东西是“假设”被弃用的,但可惜的是,这已经移到了以后的日期。
嗯,有几个原因。
- 您应该将 OpenGL 上下文视为状态机。任何时候只有其中一个处于活动状态。将一点 Opengl.whatever 放在一切前面没有区别。
- 速度,OpenGL 被设计成一个最小的 API
- 如果它是面向对象的,你会用什么语言编写它?C++?然后每个人都会编写复杂的绑定。C更容易包装。