Булевы перечисления: улучшенная ясность или просто перебор? [закрыто]

Предположим, что мы пишем инструментарий GUI в C ++ (хотя этот вопрос может также применяться к другим языкам). У нас есть кнопочный класс с функцией-членом hide, который скрывает кнопку. Эта функция-член принимает логический параметр animated для управления, если кнопка должна быть скрыта с анимацией.

class Button {
public:
  // Rule of three, etc…

  void hide(bool animated);
};

При вызове этой функции-члена может быть неясно, что она делает.

Button button;
button.hide(false); // well, does it hide the button or not?
                    // what does "false" even mean here?!

Мы могли бы переписать это с помощью булевого перечисления.

class Button {
public:
  // Rule of three, etc…

  enum Animated : bool {
    Animate = true,
    DoNotAnimate = false,
  };
  void hide(Animated animated);
};

Теперь, если мы его назовем, все станет более понятным.

Button button;
button.hide(Button::DoNotAnimate);

Это хорошая вещь? Улучшает ли он код кода, или это просто избыточно, и нужно ли вместо этого использовать отдельную документацию (Doxygen-like)?

29 голосов | спросил daknøk 29 PMpSun, 29 Apr 2012 13:41:24 +040041Sunday 2012, 13:41:24

4 ответа


23

Я думаю, что перечисление - очень приятное решение. И каким-то образом я не согласен с Johannes, даже для одноразового использования перечисление улучшает читаемость и открытость API, и писать это незначительно; и я опасаюсь использовать комментарии, как в его примере, они кричат ​​«хак».

ответил Konrad Rudolph 8 J0000006Europe/Moscow 2012, 17:23:21
7

Я думаю, что всегда полезно улучшить ясность кода, и ваши изменения действительно улучшают ясность.

Если это единственное использование этого перечисления, я бы счел слишком высоким стоимость, чтобы ввести эту перечисление. Я пришел, чтобы принять практику Clang по этому вопросу

Button button;
button.hide(false /* don't animate */);

Doxygen не помогает навязывать ясность в вызывающем коде, что является проблемой здесь.

ответил Johannes Schaub - litb 29 PMpSun, 29 Apr 2012 13:46:33 +040046Sunday 2012, 13:46:33
6

В общем, я все для перечислений над булевыми элементами, особенно когда у вас есть строка «flags», которую вам нужно передать в функцию, поскольку booleans ... неразумны в этой точке.

В этом случае и подобные, хотя есть еще один вариант; hide() и show() являются версиями функций «сделать это прямо сейчас» и animate_hide() и animate_show() выполняют ту же работу, но асинхронно. Я рассказываю об этом, потому что подозреваю, что тело «комбинированной» функции в основном будет одним из операторов if /else:

void Button::hide(bool animated)  // or whatever parameter type is appropriate
{
   if (animated)
   {
      // do animated work, set up timers and callbacks etc.
   }
   else
   {
      // do immediate work
   }
}
ответил dash-tom-bang 31 Jam1000000amThu, 31 Jan 2013 06:29:40 +040013 2013, 06:29:40
0

Если метод делает одну вещь, в этом случае скрывает кнопку, то не должно быть параметра вообще: void Hide(). И наоборот, вы можете создать метод void Show(), который показывает только кнопку. У вас может даже быть другой, чтобы проверить, отображается ли оно в настоящее время: bool IsVisible(), который просто возвращает текущее состояние элемента bool.

Методы void Show() и void Hide() могут делегировать свои вызовы методу, который изменяет состояние элемента bool : void Visible(bool is_visible):

Определение:

class Button {
    public:
        //Other methods...
        void Show();
        void Hide();
        bool IsVisible();
    private: //or protected:, depending on your requirements
    //Other methods...
    void Visible(bool is_visible);
    //Other members...
    bool _visible;
};

Реализация:

void Button::Show() {
    Visible(true);
}

void Button::Hide() {
    Visible(false);
}

bool Button::IsVisible() {
    return _visible;
}

void Button::Visible(bool is_visible) {
    _visible = is_visible;
}

Элемент void Visible(bool is_visible) предусматривает, что только одна функция несет ответственность за изменение члена _visible и делает это так, что есть только одно место, которое необходимо для изменения при изменении требования.

Все эти методы делают код намного более чистым и менее двусмысленным. Каждый метод также выполняет только одну вещь.

ответил Casey 8 J0000006Europe/Moscow 2012, 19:55:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132