У меня есть класс Camera, который обрабатывает поведение камеры. Среди его полей есть ссылка на целевой класс Cube (Cube - только один из объектов, но я не буду упоминать другие, чтобы упростить его). Чтобы рассчитать матрицу просмотра, мне нужно положение камеры и положение цели, чтобы я мог объяснить своей программе, что: «камера расположена здесь, а отсюда она смотрит на этот куб». Если кубик будет двигаться, то и точка зрения камеры изменится автоматически.
Пока все хорошо: есть класс Camera, который зависит от класса Cube, и есть класс Cube, который ни от чего не зависит (в этом примере).
Я сталкиваюсь с проблемой, когда мне нужно нарисовать куб или что-нибудь еще - для того, чтобы нарисовать что-то, среди требуемых значений это матрица просмотра камеры; это то, что я только что рассчитал в первом абзаце. По сути, это означает, что когда я начинаю рисовать объекты на экране, класс Cube также становится зависимым от класса Camera, и теперь они зависят друг от друга. Это будет означать, что я либо:
- необходимо сделать поле матрицы просмотра класса Camera статическим, чтобы я мог получить к нему доступ непосредственно из класса Cube.
- необходимо создать метод (например, SetView) в классе Cube, который я затем смогу вызвать из класса Camera (поскольку там у меня уже есть ссылка).
- необходимо сохранить матрицу просмотра вне области видимости.
- необходимо сделать двунаправленную зависимость.
Но мне не нравится ни один из этих:
- есть больше камер, которые обрабатывают несколько видов (в настоящее время их 3 на экране), и их может быть больше (или меньше).
- это делает код немного (иногда, может быть, очень) нечитаемым - например, когда я рисую куб, не совсем понятно, откуда взялась матрица представления, вы просто используете ее и не оглядываетесь назад .
- Я получал бы доступ к внешней области видимости из класса камеры, или внешняя область видимости получала бы доступ к камере, и мне бы это не понравилось, потому что внешний диапазон используется только для обработки механики выполнения.
- Мне нравится сохранять мои поля ссылок «только для чтения», так как они в настоящее время везде в этой системе - ссылки устанавливаются в конструкторе и используются только для получения данных из ссылочных классов.
И, если я не прояснил это, позвольте мне повторить, что есть несколько объектов Camera и несколько объектов Cube; тогда как любая Камера может зависеть или не зависеть от любого Куба, но обычно есть хотя бы одна Камера, зависящая от Куба.
Любые предложения будут оценены:)