接口思考小笔记

学习上的笔记。

具体性接口

  • 从代码上看问题不大,接口也够直观
  • 缺点是,如果需要添加多个服务接口需要额外增加相应的接口
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Media {
    public:
    bool audioService();
    void setAudioService(bool enable);

    bool videoService();
    void setVideoService(bool enable);

    bool tvService();
    void setTvSerrvice(bool enable);

    bool broadcastService();
    void setBroadcastService(bool enable);

    ...
    };

统一性接口

  • 这里有一个好处就是避免了上一个接口操作所带来的多接口的问题。
  • 相同服务类型的可以使用一个枚举来包含,如果不同的服务类型使用这个方法就会觉得很怪(意义上的不明确)。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    enum MediaServices {
    Audio,
    Video,
    TV,
    Broadcast
    };

    bool services(MediaServices service);
    void setServices(MediaServices service, bool enable);

简洁的接口

  • 下面这个例子它不再需要维护一个枚举类型,接口更简洁
  • 但付出的代价是,时刻需要避免字符串容易写错的问题。
    1
    2
    3
    /* like: Audio, Video, TV, Broadcast */
    bool services(const char *service);
    void setServices(const char *service, bool enable);

进一步的思考

  • 无论上面的哪一种方式,都需要保存对应的变量值。
  • 常规做法是分别用四个变量保存(AudioService,VideoService,TVService,BoardcastService)。
  • 同样地思考,如果存在多个变量则需要添加多个变量。
    想了想这里我们可以这样做(通过操控整型异或来存储四个布尔变量):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class Media {
    public:
    enum MediaServices {
    Audio = 0x00000001,
    Video = 0x00000002,
    TV = 0x00000004,
    Broadcast = 0x00000008
    };

    bool services(MediaServices service)
    {
    return service & m_services;
    }

    void setServices(MediaServices service, bool enable)
    {
    if (enable)
    m_services |= service;
    else {
    m_services &= ~service;
    }
    }

    private:
    int m_services;
    };

最后

  • 无论是哪一种方法都有优缺点,没有谁更好,只有更适合你。
  • 公众号后台输入”接口“获取相关文章。