Слишком много внутренних классов?

Я узнал, что внутренние классы должны использоваться, когда объект тесно связан с другим объектом. Таким образом, класс LinkedList может содержать внутренний класс Node, поскольку каждый Node существует только в LinkedList.

Я думаю о создании игры и рассматриваю создание объекта Map с двойным массивом Tiles, где каждый Tile является внутренним классом.

Но потом я подумал, что действительно, класс Map должен быть внутренним классом внутри класса Game.

Таким образом, мы имеем

class Game {
  class Map {
    Tile[][] grid;
    class Tile {
      ...
    }
  ...
  }
  class Unit {
    ...
  }
  class Player {
    ...
  }
  ...
}

Однако это кажется чрезмерным, так как в результате получается только один массивный файл. Это проблема? Или я полностью недопонимаю точку внутренних классов?

Каковы факторы, которые следует учитывать при выборе того, чтобы ваш новый класс был внутренним или внешним, и если выбор является внутренним, когда внутренний класс должен быть static?

Ответ 1

Когда использовать внутренние классы - это такое же искусство, как и наука. В основном посмотрите, насколько большой ваш файл кода получает и насколько большой каждый класс, если. Если класс большой и сложный, он должен, вероятно, идти в своем собственном файле. Если она небольшая (например, реализация одной функции интерфейса прослушивателя) и неоправданно используется для повторного использования в другом месте, то она, вероятно, должна быть внутренним классом.

Фактически повторное использование, вероятно, является одним из наиболее важных критериев. Все, что может быть повторно использовано, должно быть повторно использовано и должно быть ограничено соответствующим образом, чтобы включить это.

Важным преимуществом внутренних классов является то, что они могут помочь в инкапсуляции, сохраняя внутреннюю реализацию вашего класса внутри. Если другим классам не нужно знать о ваших внутренних классах (или, в некоторых случаях, даже о том, что они существуют), то это отличная причина для их внутреннего.

Ответ 2

Это не вопрос "слишком много", по крайней мере, пока вы не нажмете какой-то жесткий предел. Это вопрос о том, что можно разумно сказать, что внутри него. Карта всегда будет иметь записи, которые могут быть внутренним классом. У игры не всегда будет карта, поэтому карта не должна быть внутренней для игры.

Ответ 3

Вопрос, который я задал бы: "Является ли внутренний класс понятным для себя?" Имеет ли объект типа Map значение или Game.Map добавляет значимое значение?

Я бы Map имел смысл сам по себе и поэтому должен быть внешним классом. Затем вы можете указать тесную взаимосвязь игры и карты с помощью пространств имен.

Ответ 4

В примере игры, который вы пытаетесь реализовать, y. Карта и плитка могут быть соответствующей структурой данных, а не отдельными внутренними классами. Любые конкретные требования к их использованию в качестве классов?

Ответ 5

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

(По моему мнению, конечно)