Я разрабатываю игру стрелка пространства с настраиваемыми поставками. Можно увеличить силу любого количества свойств поставки через пару радара charts*. Внутренне, я представляю каждую поставку как разделенный на подклассы SpaceObject
класс, который содержит a ShipInfo
это описывает различные свойства той поставки.
Я хочу разработать относительно простой API, который позволяет мне питаться в блоке относительных преимуществ (от минимума до максимума того, что радарная диаграмма позволяет) для всех свойств поставки (часть из который является упрощениями базового фактического набора свойств), и возвратите класс ShipInfo, который я могу дать a PlayerShip
класс (который является объектом, который инстанцируют, чтобы быть поставкой плеера).
Я могу разработать код, чтобы сделать преобразования между упрощенными и фактическими свойствами сам, но я хотел бы, чтобы некоторые рекомендации относительно какой архитектура обеспечили для уменьшения боли взаимодействия с этим кодом переводчика (т.е. никакие методы с 5 + аргументы или somesuch другая ерунда). У кого-либо есть какие-либо идеи?
* = не на самом деле реализованный все же, но это - план.
А как насчет паттерна Строитель? У вас может быть статический метод 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 аргументов, подумайте о том, чтобы инкапсулировать хотя бы часть из них в новый тип.
Похоже, вы хотите установить одни свойства, но не другие, но не в определенном порядке важности, чтобы вы могли определять перегрузки с постепенно увеличивающимся числом аргументов.
Вы можете реализовать конструктор с минимально необходимыми значениями, который устанавливает значения по умолчанию для других, а затем использовать инициализатор объекта для установки оставшихся соответствующих значений:
// 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
};