- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
首先,我指的是一个例子:
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/
如果我有以下矩阵,输入格式是列表的列表: BTE010011021120 如何构建以下 python 矩阵: 0 1 D = [[{1}, {1,2}], 0 [{2
我是 python 的新手,所以我可能使用了不正确的术语,但我该如何“压缩”这段代码? for i in self.letterWord[0:1]:
我有几种谷歌字体,我使用@import 规则导入到样式表中。除了 Roboto Condensed 之外,它们都渲染得很好。它回落到默认的无衬线字体,在我的例子中是 Helvetica。 @impor
我想减少 Google Charts' Area chart 的 hAxis 上的刻度数。我尝试使用 tick 选项,但它并不能完全实现我的目标。 例如,如果 hAxis 值如下:['Jun 2016
我正在开发一种方法,该方法返回一个整数,该整数对应于一年中第一天的一周中的某一天。 Int 0 是星期日,1 是星期一,2 是星期二,3 是星期三... 6 是星期六。方法头如下: private s
我有一个返回表格的函数。 如果您运行 SELECT * FROM some_function(12345),结果是: object_id | name ---------------- 123
我有一个看起来像这样的数据框 name time value1 value2 apple 8:30 17 21 apple
首先,我指的是一个例子: UINT f, i, s; CONST UINT k[5] = { VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, VK_XBUTTON1, VK_X
我有一个列表,如我附加的代码中所示。如果有任何共同值,我想链接每个子列表。然后我想用一个精简的列表列表替换列表列表。 示例:如果我有一个列表 [[1,2,3],[3,4]] 我想要 [1,2,3,4]
我想在我的网站上使用阿拉伯字体并希望压缩标题,但在文本中没有效果,但是当我使用像 Arial 这样的英文字体时,CSS 会有效地压缩字符。 请帮我把阿拉伯字体压缩一下。 .heading{ font-
我正在使用一个元组来存储 find -exec stat 命令的输出,并且需要压缩它以便在其上运行 du。输出是一个元组,每个项目都是 (username,/path/to/file) 我想将它压缩成
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this q
我看到一个 Driod Sans Condensed字体在 android 上可用,但据我所知,android:typeface 属性只能具有以下值 - normal、sans、 serif 和 mo
问这个问题让我觉得自己像个布偶,但我怎样才能让 Futura Condensed Extra Bold 出现在 CSS 中。 在有人说之前,是的,我知道那些使用 Windows 的人看不到它,但这是针
我正在尝试使用 table-condensed,但仅在 xs.我试过这个,但没有运气。 它隐藏了第二张 table 的整个 table 。有没有一种方法可以只在 xs 中压缩而不重复整个表结构?
我注意到字体 Helvetica Neue Condensed 在 macOS 上没有正确呈现。实际上,如下图所示,macOS 不会根据 line-height 使字体居中。根据我的测试,它完全不依赖
我正在尝试使用 100 字重的 Avenir Next Condensed 字体(非常轻)。它在我尝试过的所有浏览器上都运行良好,除了 iOS,它显示为斜体。有什么解决办法吗? 这是一个测试页面,当在
我试图将 Gotham 字体文件链接到我的页面,但我无法让它工作!我错过了什么吗?这些是我使用的 css: @font-face { font-family: 'Gotham Condensed';
PDDocument document = PDDocument.load(file); if( document.isEncrypted() ) { document
我正在执行哈希操作,我需要一致、准确、高效等附加原始字节。 我不能乱用 ASCII 编码的数字字符串,我只需要获取原始字节。 MySQL 的转换函数非常困惑,并且不会产生对像我这样的 SQL-Serv
我是一名优秀的程序员,十分优秀!