Хорошая архитектура кода для этой проблемы?

Я разрабатываю игру стрелка пространства с настраиваемыми поставками. Можно увеличить силу любого количества свойств поставки через пару радара charts*. Внутренне, я представляю каждую поставку как разделенный на подклассы SpaceObject класс, который содержит a ShipInfo это описывает различные свойства той поставки.

Я хочу разработать относительно простой API, который позволяет мне питаться в блоке относительных преимуществ (от минимума до максимума того, что радарная диаграмма позволяет) для всех свойств поставки (часть из который является упрощениями базового фактического набора свойств), и возвратите класс ShipInfo, который я могу дать a PlayerShip класс (который является объектом, который инстанцируют, чтобы быть поставкой плеера).

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

* = не на самом деле реализованный все же, но это - план.

6
задан RCIX 18 May 2010 в 09:21
поделиться

4 ответа

А как насчет паттерна Строитель? У вас может быть статический метод FillDefaults в вашем классе ShipInfo, а затем назначить каждое свойство ShipInfo через метод экземпляра, который возвращает экземпляр, с которым вы работаете, например:

ShipInfo.FillDefaults().CalculateSomething(50).AssignName("Testing...").RelativeFiringPower(10).ApplyTo(myShip);

В ShipInfo это будет выглядеть примерно так:

public static ShipInfo FillDefaults()
{
    ShipInfo newInstance = ...;
    // Do some default setup here
    return newInstance;
}

public ShipInfo CalculateSomething(int basis)
{
    // Do some calculation
    // Assign some values internally
    return this;
}

// Keep following this pattern of methods
public void ApplyTo(SpaceObject obj)
{
    // Some checks here if you want
    obj.ShipInfo = this;
}
5
ответ дан 9 December 2019 в 22:30
поделиться

Я бы сказал, что паттерн Фасад идеально подходит для такого рода задач. Если у ваших методов более 5 аргументов, подумайте о том, чтобы инкапсулировать хотя бы часть из них в новый тип.

5
ответ дан 9 December 2019 в 22:30
поделиться

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

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

// Didn't set properties 2 3 and 6, only set the ones needed in this case.
SpaceObject ship = new SpaceObject(someRequiredValue) {
  Property1 = 50,
  Property4 = Game.Settings.Ships.Armor.Strong,
  Property5 = new PropertySet1{
    Prop51 = "Enterprise",
    Prop53 = true,
    Prop57 = false
};
1
ответ дан 9 December 2019 в 22:30
поделиться

Для меня это похоже на случай использования шаблона декоратора .

0
ответ дан 9 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: