为什么先写接口后写实现类

今天的遇到的问题、问为什么写代码的时候要先写接口在写实现类、说是和事务有关

在写代码时,先写接口再写实现类是面向对象编程的一种基本设计原则,也是软件工程中的一个重要原则。这种做法的好处有以下几个方面:

  1. 代码的可维护性更强:接口定义了模块与模块之间的契约,如果模块的实现不再满足契约,只需要在不影响其他模块的情况下修改实现即可。这种做法降低了模块间的耦合性,提高了代码的可维护性。
  2. 接口可以提高代码的可读性:接口只包含方法名、参数列表和返回值类型,使得代码更加简洁、易读,使开发者更加容易理解模块的作用。
  3. 接口可以方便地进行单元测试:使用接口进行单元测试可以隔离模块的实现,提高测试的可靠性和代码的质量。
  4. 接口有助于事务管理:将事务控制逻辑集中在接口中实现,可以提高事务管理的可靠性、易用性和效率。

在实现类的设计中,我们可以使用事务代理模式来将事务逻辑从实现类中分离出来。这种设计方式的主要思想是将事务控制逻辑封装在代理类中,代理类在调用实现类方法之前和之后开启和关闭事务,保证事务的完整性和一致性。

下面是一个示例代码,展示了如何使用事务代理模式来实现一个简单的事务控制逻辑:

c++

class IUserManager {
public:
    virtual void addUser(User* user) = 0;
    virtual void deleteUser(int userId) = 0;
};

class UserManager : public IUserManager {
public:
    void addUser(User* user) override {
        // 添加用户逻辑
    }
    void deleteUser(int userId) override {
        // 删除用户逻辑
    }
};

class TransactionProxy : public IUserManager {
public:
    TransactionProxy(IUserManager* userManager) : m_userManager(userManager) {}
    void addUser(User* user) override {
        // 开始事务
        // 调用实现类方法
        m_userManager->addUser(user);
        // 提交事务
    }
    void deleteUser(int userId) override {
        // 开始事务
        // 调用实现类方法
        m_userManager->deleteUser(userId);
        // 提交事务
    }
private:
    IUserManager* m_userManager;
};

int main() {
    IUserManager* userManager = new UserManager();
    IUserManager* proxy = new TransactionProxy(userManager);

    // 使用代理对象调用方法
    proxy->addUser(new User());
    proxy->deleteUser(1);

    delete proxy;
    delete userManager;
    return 0;
}

在这个示例代码中,IUserManager是一个接口,定义了添加和删除用户的方法。UserManager是一个实现类,实现了I

这是至上而下的思维逻辑。接口代表上层思维逻辑
就比如建筑, 你得先设计,确定房子与窗户、楼梯、水电等等的接口,然后才能建筑工人砌砖、水电工布线、窗户供应商根据设计尺寸生成窗户,否则谁都不知道做成什么样
软件也是一样,很多人参与开发,相互之间如何衔接?就要进行相应的接口设计,统一规划,然后各自按照规划进行独立开发。因此要先接口后开发,不然很容易大量返工