gpt4 book ai didi

c - 确保重构后不良模式不会再次出现

转载 作者:太空宇宙 更新时间:2023-11-04 04:05:27 24 4
gpt4 key购买 nike

我正在重构旧的 C 代码。该代码绝对没有分层架构(所有内容都可以访问),我正在努力改变这一点。

我想减少对结构成员的直接访问(至少现在写),只允许通过访问函数进行访问。是否有某种工具(或者可能直接是编译器)可以为我检查这条规则?

我需要这个,因为我正在维护一个分支,而上游并不十分关心代码质量。

最佳答案

确保没有新代码直接访问结构的最佳方法是不使用完全封装使它们可用。这是以无法再使用堆栈上的结构为代价的。您提供一个函数来分配结构,另一个函数释放它,并且所有模块函数都接受一个指向该结构的指针。但是,结构本身的定义在 C 文件中,而不是头文件中。另一个缺点是您可能需要编写大量函数来操作/查询结构。

我将提供来 self 使用过这种方法的旧代码库的片段。 header 包含:

#ifndef INC_QUEUE_H
#define INC_QUEUE_H

typedef enum {
QUE_OK,
QUE_BAD_PARAM,
QUE_NO_MEMORY,
QUE_SYS_ERROR
} QUE_RV;

typedef struct Queue_st Queue_t;

QUE_RV QUE_New(Queue_t **ppQueue);
QUE_RV QUE_Put(Queue_t *pQueue, int priority, void *pData);
QUE_RV QUE_Get(Queue_t *pQueue, int *priority, void **ppData);
void QUE_Free(Queue_t *pQueue);

#endif /* INC_QUEUE_H */

C 文件定义结构 Queue_st 和函数的实现(大量修改以突出方法):

#include "queue.h"
#include "log.h"

#define QUE_INITIAL_CAPACITY 128

struct Queue_st {
/* SNIP: structure contents go here */
};

QUE_RV QUE_New(Queue_t **ppQueue)
{
QUE_RV rv;

*ppQueue = malloc(sizeof(Queue_t));

/* SNIP: Check malloc, Initialize the structure here ... */

return QUE_OK;
}

void QUE_Free(Queue_t *pQueue)
{
if (pQueue != NULL)
{
/* SNIP: Free contents of the structure before the free below... */
free(pQueue);
}
}

另一种方法是使用 typedef struct StructName *StructHandle;,并将 API 中的所有指针替换为 StructHandle。少一个 * 担心。


编辑:如果您希望某些成员可见,而某些成员不可见,也可以扩展上述方法。在您的 header 中,定义:

typedef struct StructPriv StructPriv;

typedef struct {
/* public members go here */

StructPriv *private;
} Struct;

Struct *STRUCT_Create();
void STRUCT_Free();

在 C 文件中,定义私有(private)成员以及操作它们的函数。

关于c - 确保重构后不良模式不会再次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6544877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com