Будет ли это хорошим случаем для полиморфизма

Извините, если это действительно базовый вопрос, но я боролся с тем, как мне следует это атаковать. Я пытаюсь обернуть некоторые команды для объекта OLE, базовая спецификация выглядит следующим образом:

Set Window window_id
    //Units is part of the position setter.
    [ Position ( x, y ) [ Units paper_units ] ] 
    [ Width win_width [ Units paper_units ] ] 
    [ Height win_height [ Units paper_units ] ]
    ..... this goes on for about 20+ commands, all optional.

Где что-либо между [] необязательно.

Поэтому мне нужно создать класс, давайте назовем его « CommandBuilder », который может иметь методы set для всех этих опциональных сеттеров, и это нормально, я могу справиться с этим, основная проблема, с которой я столкнулся, - это метод ToCommandString, который должен выводить строку, которая будет выглядеть примерно так:

Set Window 1 Position (x,y) Units "m" Height 100 Units "m" + what ever else the user added

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

Мне было интересно, смогу ли я решить эту проблему, используя полиморфизм, делая что-то вроде этого.

interface ICommand
{
    string ToCommandString();
}

class PositionCommand : ICommand
{
    double X;
    double Y;
    string Units;

    public PositionCommand(double x, double y)
    {
        this.X = x;
        this.Y = y;
    }

    public PositionCommand(double x,double y, string units)
    {
        this.X = x;
        this.Y = y;
        this.Units = units;
    }

    public string ToCommandString()
    {
        //Add more stuff here to handle empty units.
        return String.Format(" Postion ({0},{1})", X.ToString(), Y.ToString());
    }
}
....more command classes.

Тогда все мои методы set в « CommandBuilder » могут просто создать правильный тип команды, добавить его в список, тогда основная ToString в методе « CommandBuilder » может перебрать все те, которые были установлены, и вызвать ToCommandString, и вам не нужно беспокоиться о делать какие-либо проверки или нулевые проверки.

Будет ли это правильный путь?

PS Если вам нужна дополнительная информация, я был бы рад добавить, просто не хотел делать это долго сначала.

12.12.2008 02:57:06
2 ОТВЕТА

Да. Я думаю, вы достаточно хорошо это поняли.

0
12.12.2008 03:04:10

Это звучит разумно для меня. Я бы определенно сохранил конструкцию экземпляров ICommand внутри CommandBuilder:

class CommandBuilder
{
  private List<ICommand> _commands = new List<ICommand>();

  public CommandBuilder Position(double x, double y)
  {
    _commands.Add(new PositionCommand(x,y))
    return this;
  }

  ...
}

Скорее чем просто

class CommandBuilder
{
  public void AddCommand(ICommand cmd)
  { ... }
}
2
12.12.2008 03:07:59
Могу я просто спросить что-нибудь? Почему вы возвращаете объект CommandBuilder из функции position?
Nathan W 12.12.2008 04:01:32
Идея состоит в том, что CommandBuilder предоставляет свободный интерфейс ( en.wikipedia.org/wiki/Fluent_interface ), который позволяет вам построить объект в структуре, подобной естественному языку.
Andrew Kennan 14.12.2008 00:26:00