AberSheeran
Aber Sheeran

代码教条主义

起笔自
所属文集: 程序杂记
共计 1530 个字符
落笔于

在很多流水线教学里,总是会出现一些教条主义的强调语句,比如不要使用 goto 语法不要使用 do while 结构。诚然,对于初学者来说,避免这些语法有利于更好地入门,但当你成为了一个编程老鸟还这么想,那或许你真的需要考虑转行了。

do-while 优于 while(true)-break

有人在我一个开源项目里提了这样一个 PR,并解释说“do...while 循环修改成 while 循环,增加可读性”。

然而在这个例子中,第一份代码可读性明显要更好。do-while 语法表示了循环内语句必定至少执行一次,并且明确了循环条件是 r2_objects.truncated 为真。而第二份代码里,第一眼看去 while (true) 总会给人一种无限循环的先入暗示,然后才能看到原来在这里 break 了。

async function* listAll(bucket: R2Bucket, prefix: string, isRecursive: boolean = false) {
    let cursor: string | undefined = undefined;
    do {
        var r2_objects = await bucket.list({
            prefix: prefix,
            delimiter: isRecursive ? undefined : '/',
            cursor: cursor,
            include: ['httpMetadata', 'customMetadata'],
        });

        for (let object of r2_objects.objects) {
            yield object;
        }

        if (r2_objects.truncated) {
            cursor = r2_objects.cursor;
        }
    } while (r2_objects.truncated)
}
async function* listAll(bucket: R2Bucket, prefix: string, isRecursive: boolean = false) {
    let cursor = undefined;
    while (true) {
        const r2_objects = await bucket.list({
            prefix,
            cursor,
            delimiter: isRecursive ? undefined : '/',
            include: ['httpMetadata', 'customMetadata'],
        });
        for (const object of r2_objects.objects) {
            yield object;
        }
        if (!r2_objects.truncated) break;
        cursor = r2_objects.cursor;
    }
}

... to be continue

如果你觉得本文值得,不妨赏杯茶
在 1C 1G 的服务器上跑 mastodon
让一份代码同时支持同步与异步