关于重构大量连续 if 检查的建议

Advice on refactoring lots of consecutive if checks

提问人:Siddharth Shyniben 提问时间:9/23/2021 最后编辑:Siddharth Shyniben 更新时间:9/23/2021 访问量:38

问:

我有一些这样的代码:

export async function handleRefresh() {
    if (!existsSync('postr.toml')) fail('not a postr directory');

    const posts = expandGlob('posts/*');

    for await (const post of posts) {
        if (!post.isDirectory) {
            console.warn('warning: non-folder found in posts directory');
            continue;
        }

        let {parsedFrontMatter, contents} = extractFrontMatter(await read(post.path + '/post.md'));
        const adapters = parsedFrontMatter.adapters ?? [];

        if (!parsedFrontMatter) {
            fail('no frontmatter for ' + post.path);
            continue;
        }

        if (!Array.isArray(adapters)) {
            fail('adapters is not an array');
            continue;
        }

        if (isValidFrontMatter(parsedFrontMatter)) {
            fail('frontmatter is not valid');
            continue;
        }

        adapters.forEach(async (adapter: string) => {
            const adapterPlugins = parseToml(await read('postr.toml')).adapterPlugins ?? {};

            if (!isObject(adapterPlugins)) {
                fail('adapterPlugins in the configuration is not an object');
                return;
            }

            const adapterPath = adapterPlugins[adapter];

            if (!adapterPath) {
                console.warn('warn: an adapter was set' +
                    'but the corresponding plugin was not configured in `postr.toml`. Skipping');
                return;
            }

            if (!('path' in <any>adapterPath)) {
                fail(`adapter ${adapter} does not have a path`);
                return;
            }

            import((<any>adapterPath).path)
                .then(async module => {
                    const action = getActionForPost(parsedFrontMatter);

                    if (module[action]) {
                        await module[action](contents, parsedFrontMatter, (<any>adapterPath).config, {
                            updateFrontMatter(newData: {[x: string]: any}) {
                                parsedFrontMatter = Object.assign(parsedFrontMatter, newData);
                            },
                            mapID(remote: string | number) {
                                addMapping(parsedFrontMatter.id as string, remote.toString(), adapter);
                            }
                        })
                    } else {
                        console.warn(`Adapter ${adapter} does not support action \`${action}\``);
                        return;
                    }

                    writeFinalContents(parsedFrontMatter, contents, post.path)
                })
                .catch(error => fail(`could not run adapter because of ${error.name}: ${error.message}`));

        });
    }
}

巨大的功能。

有很多这样的必要检查。3/4 的功能是 if checks,你可以说。我想要一些关于如何重构这些语句的建议。if

正如你所看到的,检查并不总是相同的,那里有一些不同的检查。

编辑:我添加了真实的代码。

JavaScript IF语句 防御性编程

评论

2赞 Nina Scholz 9/23/2021
重构。为什么?为了什么?
4赞 trincot 9/23/2021
如果有必要,并且有效,那么问题就偏离了主题。
5赞 trincot 9/23/2021
对于工作代码的审查,站点代码审查更合适,但是应该完全重新格式化问题以与那里的规则保持一致。
1赞 Tsirsuna 9/23/2021
@Siddharth开关外壳比大森林更容易阅读,但是的,你是对的,你不能在任何地方使用它们,但它仍然是一个不错的选择
1赞 BraveVN 9/23/2021
我想这是一个很大的功能。要重构它,您需要了解逻辑,然后将它们创建/抽象为更小的函数。有了这样的伪代码,我无法给出任何其他更好的建议if

答: 暂无答案