Пример исправления неудачных названий переменных и метода в коде переключения режимов


Исходный код

private void set_mode(bool mod)
{
    if(mod==true)
    {
        label1.Enabled=true;
        button1.Enabled=true;
        button2.Enabled=true;
        button3.Enabled=false;
        button4.Enabled=false;
    }
    else
    {
        label1.Enabled=false;
        button1.Enabled=false;
        button2.Enabled=false;
        button3.Enabled=true;
        button4.Enabled=true;
    }
}

Что не так в исходном коде

Недавно я уже рефакторил код похожей структуры, поэтому не буду повторять решение один в один.

Вместо этого хочу обратить внимание на другой недостаток исходного кода: глядя на него совершенно невозможно понять, о чём идёт речь — в чём смысл одного и второго режима, и что это за кнопки такие, на которые он влияет. Другими словами, здесь хромают нейминг и семантика.

В целом же рефакторинг я хочу провести исходя из следующих соображений:

  • там, где есть два режима, легко могут возникнуть и третий, и четвёртый,
  • отображение элементов интерфейса не обязательно должно быть полностью взаимоисключающим, поэтому стремление что-то склеивать может быть не оптимальным решением,
  • элементы интерфейса также могут добавляться, или их логика отображения может меняться.

Вариант рефакторинга исходного кода

enum CodeReviewMode {
    Expert,
    Novice
}
private void setCodeReviewMode(CodeReviewMode mode) {
    switch (mode) {
        case CodeReviewMode.Expert:
            approveLabel.Enabled = true;
            approveButton.Enabled = true;
            mergeButton.Enbled = true;
            commentButton.Enabled = false;
            viewedButton.Enabled = false;
            break;
        case CodeReviewMode.Novice:
            approveLabel.Enabled = false;
            approveButton.Enabled = false;
            mergeButton.Enbled = false;
            commentButton.Enabled = true;
            viewedButton.Enabled = true;
            break;
    }
}

Теория