重构同步和异步方法实现

发布于 2025-01-27 19:44:12 字数 779 浏览 2 评论 0原文

假设我们有一个抽象类,该类具有一种抽象方法,可以在同步和异步变体中使用。

abstract class Base
{
    abstract do(): number | Promise<number>;
}

现在,我创建了两个班级的孩子以进行同步和异步用法:

class SyncBase extends Base
{
    do(): number
    {
        console.log('Start');

        /* Sync-class specific code */
        let result = 5;

        console.log('End');

        return result;
    }
}

class AsyncBase extends Base
{
    async do()
    {
        console.log('Start');

        /* Async-class specific code */
        let result = await /* ... */;

        console.log('End');

        return result;
    }
}

如您所见,我在特定于类的代码之前和之后重复代码。

有没有办法重构此代码,所以我只编写一次之前的代码,而不是重复自己?

Let's say we have an abstract class which has an abstract method that can be use both in sync and async variants.

abstract class Base
{
    abstract do(): number | Promise<number>;
}

Now I create two children of this class for sync and async usage:

class SyncBase extends Base
{
    do(): number
    {
        console.log('Start');

        /* Sync-class specific code */
        let result = 5;

        console.log('End');

        return result;
    }
}

class AsyncBase extends Base
{
    async do()
    {
        console.log('Start');

        /* Async-class specific code */
        let result = await /* ... */;

        console.log('End');

        return result;
    }
}

As you can see, I repeat the code before and after class specific code.

Is there a way to refactor this code so I only write before-after code once and not repeat myself?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鲸落 2025-02-03 19:44:12

摘要应该是do函数结果的逻辑。和do函数将处理您的重复逻辑:

abstract class Base {
    do(): number | Promise<number> {
        console.log('Start');

        const result = this.getResult(); // call abstract function

        console.log('End');

        return result;
    };

    abstract getResult(): number | Promise<number>;
}

// Then
class SyncBase extends Base {
    getResult(): number {
        const result = 5;
        // ...
        return result;
    }
}


class AsyncBase extends Base {
    async getResult()
    {
        const result = await Promise.resolve(5);
        // ...
        return result;
    }
}

我的建议:不要混合同步和异步返回类型(numberm | promise&lt; number&gt;),只需返回Promise&lt ; number&gt;getResultdo将始终是async始终。

The abstract should be the logic for the result of do function. And do function will handle your duplicated logic:

abstract class Base {
    do(): number | Promise<number> {
        console.log('Start');

        const result = this.getResult(); // call abstract function

        console.log('End');

        return result;
    };

    abstract getResult(): number | Promise<number>;
}

// Then
class SyncBase extends Base {
    getResult(): number {
        const result = 5;
        // ...
        return result;
    }
}


class AsyncBase extends Base {
    async getResult()
    {
        const result = await Promise.resolve(5);
        // ...
        return result;
    }
}

My recommendation: Don't mix sync and async return type (number | Promise<number>), just return Promise<number> and getResult and do will be async function always.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文