Предположим, что у меня есть класс "Приложение". Для инициализации он принимает определенные настройки в конструкторе. Предположим также, что количество настроек настолько велико, что оно вынуждает их размещать в своем классе.
Сравните следующие две реализации этого сценария.
Реализация 1:
class Application
{
Application(ApplicationSettings settings)
{
//Do initialisation here
}
}
class ApplicationSettings
{
//Settings related methods and properties here
}
Реализация 2:
class Application
{
Application(Application.Settings settings)
{
//Do initialisation here
}
class Settings
{
//Settings related methods and properties here
}
}
Для меня второй подход очень предпочтительнее. Это более читаемо, потому что оно сильно подчеркивает связь между двумя классами. Когда я пишу код для создания экземпляра класса Application в любом месте, второй подход будет выглядеть красивее.
Теперь представьте себе, что у самого класса настроек в свою очередь был некоторый аналогичный "родственный" класс, и этот класс в свою очередь тоже сделал это. Перейдите только к трем таким уровням, и название класса выйдет из-под контроля в "не-вложенном" случае. Однако, если вы гнездились, все по-прежнему остается изящным.
Несмотря на вышеизложенное, я читал людей, говорящих в StackOverflow, что вложенные классы оправданы, только если они не видны внешнему миру; то есть, если они используются только для внутренней реализации содержащего класса. Часто цитируемое возражение вызывает раздувание размера содержащего исходный файл класса, но частичные классы являются идеальным решением для этой проблемы.
Мой вопрос: почему мы опасаемся "публично выставленного" использования вложенных классов? Существуют ли другие аргументы против такого использования?