在很多流水线教学里,总是会出现一些教条主义的强调语句,比如不要使用 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