Позвольте мне привести пример использования вложенных классов, которые могут прояснить, когда этот тип архитектуры уместен. Недавно мне нужно было сгенерировать таблицу HTML, извлекая выбранные столбцы из таблицы данных и «поворачивая» их так, чтобы строки становились столбцами, и наоборот. В моем случае было две важные операции: поворот данных и создание довольно сложного вывода (я не просто отображал данные: каждый столбец / строка таблицы данных подвергался операциям по извлечению заголовка, созданию тегов изображения, настройке ссылок, и т.д., таким образом, использование SQL Pivot тоже не совсем правильно).
После первоначальной попытки создать один класс, чтобы сделать все это, я понял, что большая часть данных / методов делится на три отдельных раздела: обработка заголовка, обработка строки и поворот. Таким образом, я решил, что лучшим подходом было бы заключить логику для «заголовка» и «строки» в отдельные вложенные классы. Это позволило мне разделить данные, хранящиеся в каждой строке, и очень аккуратно запрограммировать операции сводки (вызывая отдельный объект строки для каждого столбца в вашей таблице данных). В конце сводных операций я сгенерировал вывод, вызвав объект заголовка, а затем каждый объект строки по очереди, чтобы сгенерировать вывод обратно в основной класс.
Отдельные классы были неподходящими, потому что A) вложенные классы действительно нуждались в некоторых данных из мастер-класса и B) обработка была очень специфичной и бесполезной в других местах. Просто программирование одного большого класса было просто беспорядочным из-за путаницы вокруг таких терминов, как «столбец» и «строка», которые различались в зависимости от того, говорите ли вы о данных или выводе HTML. Кроме того, это была необычная работа: я генерировал HTML в своем бизнес-классе, поэтому я хотел отделить чистую бизнес-логику от генерации пользовательского интерфейса. В конце концов, вложенные классы обеспечили идеальный баланс инкапсуляции и обмена данными.