我正在转换一个 C++ 类,我们称它为 render
,它只使用过一个实例(单例但非官方),以用于 C 中的纯过程样式程序。事实上,一个简单的软件渲染器,可能一开始就应该这样编写。
ex-class 主要处理大量通用命名的私有(private)变量,从单独的字节到大型二进制数据数组。 unsigned char frame_counter
, char* frame_data
, unsigned char palette[256][128][3]
等我就是试图取代。
我正在以一种简单的方式重命名我的函数,例如:render::load_sprite(const char* file)
-> render_load_sprite(const char* file)
全局“成员”变量:
- 通常被认为是不好的/应该避免的。 可能在某些时候发生冲突。
- 不知道该如何重命名成员。也许像
renderer_palette
这样的前缀?从内部看有点冗长。 - 如果我希望某些变量无需包装函数即可修改怎么办?
状态结构:
类似于 OOP,但我处理的是单一的静态 API。
必须到处传递。从外面看有点冗长。
必须初始化。
此实例中的首选是全局变量、结构体还是其他选项?
最佳答案
Eeek..全局变量?射击你自己。永远不要使用全局变量。大不不。破坏可重入性并终止您的代码。
我写的所有 C 代码都是这样的:
struct object {
int data;
};
void object_init(struct object *self);
void object_update(struct object *self, float dt);
int object_write_to_file(struct object *self, const char *file);
- 对于任何像弧度(浮点度数)这样不重要的东西,使用一个结构并将其作为第一个参数传递给
self
到处(不要使用this
即使允许在C,因为你在使用 C++ 时会遇到问题) - 保持文件名和结构名相同
- 使用结构名称为所有操作该结构的方法添加前缀
- 不要使用 typedef struct ...它会使代码更难浏览
- 始终将所有数据保存在源自根应用程序对象的结构中。即 struct application { struct object obj; ... }。这使您可以轻松地创建任意数量的应用程序实例(前提是您使用的所有库也被设计为没有静态的 OOP 对象)。无论如何,这对您的代码来说是一个很好的做法。
- 这样做可以让您完全控制:重入、数据局部性、数据所有权、数据修改、代码可读性。通常你也可以获得更好的质量并且可以轻松地使你的应用程序多线程,因为没有全局状态,所有需要锁定的东西都在同一个结构中。
- 随着时间的推移,您开始越来越喜欢冗长的代码,因为您使用代码所做的一切都变得更加容易,并且您只需查看代码就可以理解代码的作用。您知道 self->member 是对传递给当前方法的变量的引用。你知道这个变量是对象的本地变量。你知道 self 是你当前正在操作的对象。你知道,如果需要互斥,任何对 self 成员的访问都可能必须被称为 self->lock 的锁锁定。像这样的简单推理确实可以加快开发时间并让您的生活更轻松。
关于c++ - 将 C++ 类转换为过程 API : common way of replacing member variables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48069096/