Стиль кода может быть делом личного вкуса, но современная литература предполагает, что это нечто большее. Пусть глава о классах в Чистый код покажет вам путь.
Классы должны быть маленькими!
Первое правило занятий — они должны быть небольшими. Второе правило классов заключается в том, что они должны быть меньше этого размера. Нет, мы не будем повторять один и тот же текст из главы «Функции». Но, как и в случае с функциями, при проектировании классов основное правило — меньший размер. Как и в случае с функциями, наш непосредственный вопрос всегда звучит так: «Насколько мал?» С помощью функций мы измеряли размер, считая физические строки. С классами мы используем другую меру. Считаем обязанности...
Принцип единой ответственности (SRP) гласит, что у класса или модуля должна быть одна и только одна причина для изменения. Этот принцип дает нам как определение ответственности, так и рекомендации по размеру класса. У классов должна быть одна обязанность — одна причина для изменения...
Проблема в том, что слишком многие из нас думают, что с этим покончено, как только программа заработает. Мы не можем переключиться на другую заботу об организации и чистоте. Мы переходим к следующей проблеме, а не возвращаемся назад и не разбиваем переполненные классы на несвязанные единицы с отдельными обязанностями. В то же время многие разработчики опасаются, что большое количество небольших одноцелевых классов затрудняет понимание общей картины. Они обеспокоены тем, что должны переходить от класса к классу, чтобы выяснить, как выполняется большая часть работы. Однако в системе с множеством небольших классов движущихся частей не больше, чем в системе с несколькими большими классами. В системе с несколькими большими классами нужно учиться столько же. Итак, вопрос: хотите ли вы, чтобы ваши инструменты были организованы в ящики с множеством маленьких ящиков, каждый из которых содержит четко определенные и хорошо маркированные компоненты? Или вы хотите несколько ящиков, в которые вы просто бросаете все?
Каждая крупная система будет содержать большое количество логики и сложности. Основная цель управления такой сложностью — организовать ее так, чтобы разработчик знал, где искать нужные вещи, и ему нужно было понимать только непосредственно затронутую сложность в любой момент времени. Напротив, система с более крупными многоцелевыми классами всегда мешает нам, настаивая на том, чтобы мы пробирались через множество вещей, которые нам не нужно знать прямо сейчас. Повторим предыдущие пункты для акцента: мы хотим, чтобы наши системы состояли из множества небольших классов, а не из нескольких больших. Каждый небольшой класс инкапсулирует одну ответственность, имеет одну причину для изменения и сотрудничает с несколькими другими для достижения желаемого поведения системы.
Итак, исходя из этих эвристик, вложенные классы нарушают SRP. Они почти никогда не должны происходить. Вместо этого пусть ваши классы GUI включают члены экземпляров ActionListeners, которые они регистрируют. Держите прослушиватели в отдельном пакете *.listener. Используйте интерфейсы, чтобы сделать их заменяемыми (паттерн стратегии) везде, где это считается эффективным.