Java Класс самый чистый / самый эффективный способ хранения большого количества свойств - PullRequest
2 голосов
/ 13 июля 2020

Я кодирую проект, связанный с видеоигрой, и у меня есть класс Gun, представляющий каждое оружие. У нас будет около 30 уникальных орудий, и их настройки будут считываться из файла, чтобы можно было легко настраивать значения. Каждое ружье имеет 70-80 уникальных свойств. Есть 4-5 настроек, детализирующих их внешний вид, 5 настроек, связанных с их перезагрузкой (размер их обоймы, сколько времени это займет, какие боеприпасы для этого требуются), 10 или около того настроек, касающихся того, сколько урона они наносят другим игрокам. и так далее, до 80 или около того уникальных настроек, различных для каждого пистолета. Кроме того, около 30 из этих настроек являются необязательными, что означает, что они не применимы к каждому оружию (например, время между полностью автоматическими выстрелами не применяется к полуавтоматическому ружью, а свойства прицела прицеливания не применяются к выбранному оружию, которое 'не видны)

У меня проблемы с сохранением всей этой информации в классе Gun в удобочитаемом и быстром виде (к этим значениям будут обращаться довольно часто, поэтому загрузка из файла каждый раз кажется неэффективной). Трудно найти какой-либо хороший способ использовать наследование для многих из них, потому что существует множество различных комбинаций свойств (оружие различается в зависимости от типа огня, независимо от того, можно ли его увеличить или иметь прицел и т. Д. c)

В настоящее время у меня есть разные свойства, относящиеся к одному и тому же в их собственных классах настроек, причем каждый пистолет использует 7 разных классов настроек, содержащих соответствующие настройки, как показано:

    protected final int id;
    private final String name;
    private final String type;
    private final ItemCategory tier;

    private final AppearanceSettings appearanceSettings;
    private final ReloadSettings reloadSettings;
    private final ShootingSettings shootingSettings;
    private final AimingSettings aimingSettings;
    private final DamageSettings damageSettings;
    private final BulletImpactSettings impactSettings;
    private final SoundSettings soundSettings;```

Я не уверен, что есть много накладных расходов при выполнении чего-то вроде этого, когда в памяти есть ~ 30 * 7 = 210 классов, просто хранящих переменные, или если доступ к указанным переменным происходит медленнее.

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

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

Извините, что немного поболтаю, но я думаю, что понял свою проблему - как лучше всего хранить так много свойств в удобочитаемом и эффективном виде? Спасибо!

1 Ответ

0 голосов
/ 13 июля 2020

Как упоминалось в комментариях, вам необходимо выполнить первоклассную работу по проектированию ваших классов с использованием наследования и шаблонов проектирования. Я даю вам несколько советов.

Я не уверен, есть ли много накладных расходов при выполнении чего-то вроде этого, когда в памяти ~ 30 * 7 = 210 классов просто хранят переменные, или если доступ к указанным переменным происходит медленнее.

Я бы не стал беспокоиться о памяти. Предположим, что у вас есть 30 классов с 80 свойствами каждый, и в среднем свойство представляет собой строку размера 10. Строка длиной 10 символов занимает около 30 байт в памяти. Таким образом, 30 x 80 x 30 = 72 КБ (приблизительная оценка), что не соответствует средней емкости ОЗУ. Доступ к переменным в памяти в основном происходит мгновенно.

Что касается постоянства, если значения будут часто меняться, я предлагаю использовать базу данных. Таким образом, вам не нужно реализовывать logi c для сопоставления файлов с классами Java, но вы делегируете его JDB C.

Конструктор параметров 80 особенно будет кошмар.

Я согласен и предлагаю придерживаться вашего текущего решения. Вы можете использовать фабрику, которая с учетом настроек создаст класс Gun. Шаблон «Абстрактная фабрика» может здесь подойти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...