gpt4 book ai didi

c - 可读性与可维护性 : Condensing statements to loops

转载 作者:太空狗 更新时间:2023-10-29 15:32:52 25 4
gpt4 key购买 nike

首先,我指的是一个例子:

UINT f, i, s;
CONST UINT k[5] = { VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, VK_XBUTTON1, VK_XBUTTON2 };

for (f = RI_MOUSE_LEFT_BUTTON_DOWN, i = 0, s = RI_KEY_MAKE; f != RI_MOUSE_WHEEL; f <<= 1, i += s, s = !s)
if ((pMouseData->usButtonFlags & f) == f)
SetVKeyState(k[i], s);

与此相比:

if (pMouseData->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
SetVKeyState(VK_LBUTTON, RI_KEY_MAKE);

if (pMouseData->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
SetVKeyState(VK_LBUTTON, RI_KEY_BREAK);

if (pMouseData->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
SetVKeyState(VK_RBUTTON, RI_KEY_MAKE);

if (pMouseData->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
SetVKeyState(VK_RBUTTON, RI_KEY_BREAK);

if (pMouseData->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN)
SetVKeyState(VK_MBUTTON, RI_KEY_MAKE);

if (pMouseData->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP)
SetVKeyState(VK_MBUTTON, RI_KEY_BREAK);

if (pMouseData->usButtonFlags & RI_MOUSE_X1_BUTTON_DOWN)
SetVKeyState(VK_XBUTTON1, RI_KEY_MAKE);

if (pMouseData->usButtonFlags & RI_MOUSE_X1_BUTTON_UP)
SetVKeyState(VK_XBUTTON1, RI_KEY_BREAK);

if (pMouseData->usButtonFlags & RI_MOUSE_X2_BUTTON_DOWN)
SetVKeyState(VK_XBUTTON2, RI_KEY_MAKE);

if (pMouseData->usButtonFlags & RI_MOUSE_X2_BUTTON_UP)
SetVKeyState(VK_XBUTTON2, RI_KEY_BREAK);

后面的代码显然是一个完全展开的循环。

从长远来看,这实际上是一个关于可读性减少冗余(如代码不同区域的重复语句)哪个更好的问题。

我更关心稍后在大型代码库的上下文中访问它。减少修改区域的数量当然是一件好事; for 循环的初始化和更新语句有点困惑有关系吗?

有没有人在这个可能微不足道的问题上有经验。

最佳答案

关键是只压缩完全相似的语句:

const UINT k[5] = { VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, VK_XBUTTON1, VK_XBUTTON2 };

static_assert( (RI_MOUSE_LEFT_BUTTON_DOWN << 2) == RI_MOUSE_RIGHT_BUTTON_DOWN );

for ( UINT i = 0; i < _count_of(k); ++i ) {
if (pMouseData->usButtonFlags & (RI_MOUSE_LEFT_BUTTON_DOWN << 2*i))
SetVKeyState(k[i], RI_KEY_MAKE);
if (pMouseData->usButtonFlags & (RI_MOUSE_LEFT_BUTTON_UP << 2*i)))
SetVKeyState(k[i], RI_KEY_BREAK);
}

所有的逗号运算符都没有了,异常的循环增量也没有了,键状态仍然使用符号变量。

我认为这实际上比原来更容易阅读,因为它适合一页代码,而且重复很明显。

编辑:现在记录了标志关系假设。

我实际上可能会做到:

struct { UINT vk;      UINT downflag;                 UINT upflag;
} const k[] = {
{ VK_LBUTTON, RI_MOUSE_LEFT_BUTTON_DOWN, RI_MOUSE_LEFT_BUTTON_UP },
{ VK_RBUTTON, RI_MOUSE_RIGHT_BUTTON_DOWN, RI_MOUSE_RIGHT_BUTTON_UP },
...
};
for ( UINT i = 0; i < _count_of(k); ++i ) {
if (pMouseData->usButtonFlags & k[i].downflag)
SetVKeyState(k[i].vk, RI_KEY_MAKE);
if (pMouseData->usButtonFlags & k[i].upflag)
SetVKeyState(k[i].vk, RI_KEY_BREAK);
}

为了消除关于以正确顺序使用相邻位的标志的假设。

可以使用后一个版本,使 SetVKeyState 的第二个参数成为表格列之一,但 IMO 失去了有值(value)的配对结构。

关于c - 可读性与可维护性 : Condensing statements to loops,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20832999/

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