Хорошая архитектура кода для этой проблемы? - PullRequest
6 голосов
/ 18 мая 2010

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

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

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

* = на самом деле еще не реализовано, но это план.

Ответы [ 4 ]

5 голосов
/ 19 мая 2010

А как насчет шаблона Builder? У вас может быть статический метод 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 голосов
/ 18 мая 2010

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

1 голос
/ 18 мая 2010

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

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

// 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
};
0 голосов
/ 18 мая 2010

Для меня это выглядит как случай для шаблона декоратора .

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