5

为什么openGL不是面向对象的?每个人都教面向对象编程+设计模式,但是OpenGL有很多全局功能。这不是很糟糕的风格吗?

4

5 回答 5

17

低级 API 的全部意义在于使其尽可能小且可移植。给它一个面向对象的架构将不允许这样做:

  • 多态性增加了不必要的函数调用开销。
  • 它迫使您使用一些相对困难的调用约定,从而降低了可移植性。
  • 您不能包装面向对象的体系结构以使其具有程序性,但您可以反其道而行之;因此,使事情尽可能灵活是有意义的。如果您愿意,围绕 OpenGL 编写一个面向对象的包装器是微不足道的。

最后,你真的应该质疑你所学到的关于 OOP 的知识。不管你的学院或大学会告诉你什么,OOP 都不是程序设计的灵丹妙药。有很好的理由说明 C++ STL 中绝对没有面向对象(以及大多数 Boost)。

面向对象在某些情况下很有用,但您应该了解它什么时候有用,什么时候没用,在任何情况下,您都不应该相信任何不是 OOP 的东西都是“坏风格”。

于 2010-01-30T03:10:00.403 回答
11

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 全局函数……

于 2010-01-30T03:55:26.280 回答
8

一般来说,OpenGL面向对象的。它只是用一种不直接支持 OOP 的语言实现的。但是 API 是面向对象的:它由许多不同的对象类型以及在每个对象上定义的一组操作组成。并且每个对象类型的内部对用户都是隐藏的。它满足 OOP 的所有要求。它恰好是在 C 中实现的,它没有方便的类或成员方法语法。

除此之外,全局函数绝对没有错。在 C++ 中,一个常见的建议是尽可能优先使用它们而不是成员方法。在函数式编程中,全局函数是默认的。

于 2010-01-30T03:21:22.320 回答
4

OpenGL 是为 C 语言创建的,当时这些东西都不存在。即使是现在,他们仍然希望保留一个 C 接口,因为 C 仍然是一种广泛使用的语言。

他们应该同时维护 C 接口和 C++ 包装器,抛弃 C 并只使用 C++,还是保留 C 接口?我认为后者是最好的解决方案:对他们轻松,对我们来说不太难。

也就是说,OpenGL 界面确实很糟糕。很多东西是“假设”被弃用的,但可惜的是,这已经移到了以后的日期。

于 2010-01-30T02:43:54.127 回答
4

嗯,有几个原因。

  • 您应该将 OpenGL 上下文视为状态机。任何时候只有其中一个处于活动状态。将一点 Opengl.whatever 放在一切前面没有区别。
  • 速度,OpenGL 被设计成一个最小的 API
  • 如果它是面向对象的,你会用什么语言编写它?C++?然后每个人都会编写复杂的绑定。C更容易包装。
于 2010-01-30T02:47:15.810 回答