软件设计原则之ISP接口隔离原则

(ISP) 接口隔离原则 Interface Segregation Principle

核心原则

不应该强迫客户程序依赖它们不用的方法。

场景描述

在大家的认知中,大多数鸟类都有翅膀并可以飞行。但是在奇妙的大自然中总有一些特例,如鸵鸟虽然有翅膀,但是不会飞行。

如果我们设计一个鸟的基类,并含有飞行相关方法,则这类方法将不适用于鸵鸟。

因此一些设计者会喜欢在这类方法中抛出异常或者使用断言的方式来进行处理。

复制代码
#include <cassert>
#include <iostream>

class Bird {
public:
    virtual void sleep() = 0;
    virtual void fly()   = 0;
};

// 鸽子
class Pigeon : public Bird {
public:
    void sleep() override {
        std::cout << "The pigeon is sleeping" << '\n';
    }
    void fly() override {
        std::cout << "The pigeon is flying" << '\n';
    }
};

// 鸵鸟
class Ostrich : public Bird {
public:
    void sleep() override {
        std::cout << "The ostrich is sleeping" << '\n';
    }
    void fly() override {
        std::cout << "The ostrich can not fly" << '\n';
        assert(false);
    }
};

int main() {
    Ostrich bird;
    bird.sleep();
    // 鸵鸟不会飞,不合理
    bird.fly();
}

问题暴露

显然,既然方法是存在的,那难免会有不熟悉的开发者去调用它。并且在一些多态接口中,接口内部不知道外部传入的对象是什么,极有可能会去调用这些不合理的函数。

因此我们需要解耦,将各类方法的力度更加细化,不同的对象只去实现它应该并且能够实现的接口。

复制代码
#include <cassert>
#include <iostream>

class CanSleep {
public:
    virtual void sleep() = 0;
};

class CanFly {
public:
    virtual void fly() = 0;
};

// 鸽子
class Pigeon : public CanSleep, public CanFly {
public:
    void sleep() override {
        std::cout << "The pigeon is sleeping" << '\n';
    }
    void fly() override {
        std::cout << "The pigeon is flying" << '\n';
    }
};

// 鸵鸟
class Ostrich : public CanSleep {
public:
    void sleep() override {
        std::cout << "The ostrich is sleeping" << '\n';
    }
};

int main() {
    Ostrich bird;
    // 只使用,该对象可以使用的方法
    bird.sleep();
}
相关推荐
ccbw169 天前
从一颗录音豆说起:AI会议转写的端侧方案与选型
人工智能·接口隔离原则·码率·采集
星核0penstarry14 天前
企业 API 向后兼容实战:版本控制、废弃字段通知与灰度发布策略
人工智能·后端·api·接口隔离原则·版本控制·架构设计·后端架构
OCR_1337162127516 天前
户外强光下护照OCR为什么崩?从ISP到边缘AI,拆一下ER阅读器的抗眩光架构
人工智能·ocr·接口隔离原则
ccbw1616 天前
CH634 四端口 USB3.0 HUB 控制器方案拆解与国产替代选型
接口隔离原则·摄像头
xunyan623419 天前
4-2 动态数码管显示(SDCC + Notepad++ + STC-ISP/普中ISP)
接口隔离原则
xunyan62341 个月前
4-1 静态数码管显示(SDCC + Notepad++ + STC-ISP/普中ISP)
接口隔离原则
xunyan62341 个月前
3-1 独立按键控制LED亮灭(SDCC + Notepad++ + STC-ISP/普中ISP)
单片机·嵌入式硬件·接口隔离原则
kyle~1 个月前
实时系统通信抖动(Jitter)
计算机视觉·机器人·接口隔离原则·传感器
xunyan62341 个月前
3-1 独立按键控制LED状态(SDCC + Notepad++ + STC-ISP/普中ISP)
notepad++·接口隔离原则
xunyan62341 个月前
3-3 独立按键控制LED显示二进制(SDCC + Notepad++ + STC-ISP/普中ISP)
接口隔离原则