Обзор
В моей (Android) Java-игре у меня есть класс под названием resources. Как следует из названия, этот класс содержит ресурсы для игры. Здесь созданы все мои объекты OpenGL (Sprites)
Он выглядит примерно следующим образом (очевидно, это упрощенная версия по сравнению с тем, что появляется в реальном проекте):
public class Resources {
Hero hero;
Enemy enemy;
MenuButtons mainMenuButtons;
Background background;
Scene mainMenu;
public void createObjects(){
hero = new Hero();
enemy = new Enemy();
mainMenuButtons = new MenuButtons();
background = new Background();
mainMenu = new Scene(this);
}
}
Итак, в моей сцене mainMenu мне нужно получить доступ к моим объектам, чтобы мы могли увидеть что-то вроде этого:
public class mainMenu implements Scene {
Resources resources;
public mainMenu(Resources resources){
this.resources = resources;
}
@Override
public void render(){
resources.background.draw();
resources.hero.draw();
resources.enemy.draw();
mainMenuButtons.draw();
}
@Override
public void updateLogic(){
resources.hero.move();
resources.enemy.move();
resources.mainMenubuttons.animate();
}
}
Теперь этот метод является всего лишь одним из способов получить доступ к объектам в ресурсах и их методам. Но разве это действительно нарушает "сильный" закон Деметры? Если нет, почему бы и нет? Если да, то каков наилучший способ получить доступ к этим объектам таким образом, чтобы это не нарушало LOD?
Accessors?
Один из вариантов (который я исключал из TBH - см. ниже) помещает методы доступа в класс ресурсов. Чтобы я мог сделать что-то вроде:
resources.drawBackround();
У меня много объектов, и мне нужен аксессор для каждого метода/переменной каждого объекта. Не очень практично, мне кажется, что я пишу тонну дополнительного кода и, что самое важное, он делает класс ресурсов смехотворно длинным, когда он заполняется этими аксессуарами. Поэтому я не пойду по этому пути.
Передача объектов в конструктор сцены
Конечно, я также могу сделать что-то вроде этого:
hero = new Hero();
enemy = new Enemy();
mainMenuButtons = new MenuButtons();
background = new Background();
mainMenu = new Scene(hero, enemy, mainMenuButtons, background);
Поэтому я могу просто сделать это:
background.draw(); //etc....
Это работает для простой сцены (например, систем меню, для которых не требуется много объектов), но для основной игры она может быстро стать беспорядком, поскольку мне придется передавать ссылки на некоторые 30+ объектов в конструктор, который на самом деле не совсем прав...
Поэтому я был бы очень признателен, если бы кто-нибудь мог указать лучший способ продолжить и почему.