#ооп #рефакторинг
Помогите пожалуйста разобраться с "запахом кода", который называется Большой класс.
У меня есть класс, в котором создается GUI. На GUI добавляется панель, на которую добавляется
много элементов управления. В общем, все это имеет достаточно сложную структуру.
Вот метод, с которого начинается создание этой панели:
private static JPanel createTasksMainInfoPanel(JTabbedPane taskTabbedPane) {
JPanel panelForMainInfo = new JPanel();
//code...
addComponentForMainInfoBox(verticalBoxForTaskMainInfo, new String(),
createTypeChoicePanel(max, min));
JButton ok = new JButton("OK");
createListenerForOk(ok, fieldForName, fieldForVarQuantity,
FieldForLimitQuantity, FieldForCritQuantity, max,
taskTabbedPane);
addComponentForMainInfoBox(verticalBoxForTaskMainInfo, new String(), ok);
panelForMainInfo.add(verticalBoxForTaskMainInfo);
return panelForMainInfo;
}
Здесь я привел только начало и конец метода. В середине еще строк 50. Плюс в конце
у меня идут вызовы других методов, которые так же нужны что бы создать эту панель.
В них приходится передавать кучу параметров. В общем, в результате я имею длинные методы
с большим списком параметров. И мой класс, где создается GUI разрастается до огромных
размеров. Не лучше ли мне выделить для создания этой панели отдельный класс? Тогда
все что я передавал в параметрах можно было бы сделать полями этого класса. И можно
было бы выделить более компактные методы и без огромных списков параметров. Или может
я вообще зря это затеял. Ведь добавится еще один класс, а значит новые связи между
классами. К тому же, не противоречит ли это принципу единственной обязанности(single
responsibility principle)? Ведь эта панель входит в GUI, то есть ее отрисовка входит
в обязанность этого класса GUI?
Ответы
Ответ 1
Под "большим классом" Фаулер понимает не размер в строках, а размер функциональности. То есть когда в классе много разнородных ответсвенностей класс считается "большим". Следовательно чтобы назвать класс "большим" надо составить перечень его ответсвенностей и определить насколько они разнородные. В вашем случае функция класса состоит в сопоставлении визуальной структуры гуя и внутренней структуры гуя. Поэтому на нем лежит две ответсвенности: знать визуальную структуру и знать внутреннюю структуру. Визуальная структура гуя это то, что мы видим на экране: кнопка внутри панельки, панелька на форме, форма слева на окне, нажатие на кнопку выводит диалог, и так далее. Тут все понятно. Внутренняя структура гуя это то, как связаны объекты контролов между собой: кто кого содрежит, кто кому сообщения посылает, как контролы создаются и настриваются, и прочее. Но к внутренней структуре гуя (именно гуя) не относится то как объекты контролов связаны с другими объектами неконтролами! Это другая ответсвенность. Судя по коду, который вы привели, у вас ничего такого не наблюдается, поэтому ваш класс нельзя назвать "большим". Если вас смущает его размер посмотрите на это с другой стороны. Сейчас у вас одно место где весь гуй создается и настривается, то есть когда вы хотите что-то поменять на форме вам не надо вспоминать в какой файл смотреть - это один и тот же файл. Если вы разнесете эту логику по 10 классам, то у вас будет 10 мест для поиска.
Комментариев нет:
Отправить комментарий