将C ++类转换为过程API:替换成员变量的常用方法?

问题描述 投票:0回答:1

我正在转换一个C ++类,我们称之为render,它只使用了一个实例(单例但非正式),纯粹用于C程序的程序风格。它本身就是一个简单的软件渲染器,可能应该首先编写。

ex-class主要处理大量一般命名的私有变量,从单个字节到大型二进制数据数组。 unsigned char frame_counterchar* frame_dataunsigned char palette[256][128][3]等等,这正是我想要取代的。

我正在以一种简单的方式重命名我的函数,例如:render::load_sprite(const char* file) - > render_load_sprite(const char* file)

全局“成员”变量:

  • 一般认为不好/要避免。在某些时候可能发生冲突。
  • 不知道我应该如何重命名成员。也许像renderer_palette这样的前缀?有点从内部冗长。
  • 如果我想在没有包装函数的情况下修改某些变量怎么办?

状态结构:

  • 像OOP一样,但我正在处理一个单一的静态API。
  • 必须到处传播。有点从外面啰嗦。
  • 必须初始化。

在这个例子中首选的是globals,struct,还是有其他选择?

c++ c global-variables member procedural-programming
1个回答
2
投票

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无处不在(即使在C中允许也不要使用this,因为你在使用C ++时会遇到问题)
  • 保持文件名和结构名称相同
  • 使用struct name为结构上运行的所有方法添加前缀
  • 不要使用typedef结构...它使代码更难以查看
  • 始终将所有数据保存在源自根应用程序对象的结构中。即struct application {struct object obj; ......}。这使您可以轻松地根据需要创建任意数量的应用程序(假设您使用的所有库都设计为没有静态的OOP对象)。无论如何,这对您的代码来说是一个很好的做法。
  • 这样做可以让您完全控制:重入,数据位置,数据所有权,数据修改,代码可读性。通常你也可以获得更好的质量,并且可以轻松地使你的应用程序成为多线程,因为没有全局状态,所有需要锁定的东西都在同一个结构中。
  • 随着时间的推移,你开始越来越多地欣赏冗长,因为你对代码的一切变得更容易,你可以通过查看代码来理解代码的作用。您知道self-> member是对传递给current方法的变量的引用。您知道此变量是对象的本地变量。您知道self是您当前正在操作的对象。您知道,如果需要互斥,则可能必须通过名为self-> lock的锁来锁定对self成员的任何访问。像这样的简单推论确实加快了开发时间并使您的生活更轻松。
© www.soinside.com 2019 - 2024. All rights reserved.