使用Optional方法的接口

时间:2018-03-22 20:29:31

标签: c++ c++14 c++17

我创建了一个IMessage接口。它用于确保所有消息都有一个Header和Body。我遇到了一个问题,一条消息没有Header,但它需要接口。

我有3个选项:

  1. 对于getHeader()
  2. 的这一个实现,使用可选的,我们总是返回一个空的可选项
  3. 抛出异常,需要抓住才能继续
  4. 为标题
  5. 返回一个空数组

    我使用选项1是否正确?

    我简化了我的程序,通常getHeader,getBody和getFull返回某种类型的数组。问题是如何处理getHeader,因为一条消息没有标题。

    struct IMessage
    {
        virtual int getHeader() = 0;
        virtual int getBody() = 0;
        virtual int getFull() = 0;
    };
    
    class Message1 : public IMessage
    {
        int header;
        int body;
        int full;
    
        public:
        int getHeader() { return header;}
        int getBody() { return body;}
        int getFull() { return full;}
    };
    
    class Message2 : public IMessage
    {
        int body;
        int full;
    
        public:
        int getHeader() { //Optional or exception }            //I don't have a header
        int getBody() { return body; }
        int getFull() { return full; }
    };
    

2 个答案:

答案 0 :(得分:3)

如果界面的目的是表示带有标题和正文的消息,那么为什么没有标题的消息需要"界面?

相反,也许你应该有两个接口。一个代表所有消息,唯一的要求是一个正文。另一个扩展了该接口以及具有标题的要求。然后使用适当的。

或者,考虑一个缺少的标题实际上是一个存在但空的标题。这是你的选择3。

答案 1 :(得分:2)

  

我创建了一个IMessage接口。它用于确保所有消息都有一个Header和Body。

如果这实际上是IMessage的工作,那么你的新事物不是IMessage

当然,像IMessage这样的类型通常都是错误的想法,正因为如此;绝对规则很少见。

  
      
  1. 对于getHeader()
  2. 的这一个实现,使用可选的,我们总是返回一个空的可选项   
  3. 抛出异常,需要抓住才能继续
  4.   
  5. 为标题
  6. 返回一个空数组   

(2)似乎是一个可怕的想法。例外情况应保留为"如果程序因此结束,则优于继续"或类似情况。出于多种原因,将它们用于控制流是一个坏主意。

(3)vs(1)取决于空数据块是否与丢失的数据不同。有时他们是相同的,有时不是。如果它们是相同的,(1)是坏的,因为你得到了代表相同事物的2个状态;如果它们不同,则(3)是不好的,因为你得到一个代表两件事的状态。