Как структурировать много событийных методов? - PullRequest
0 голосов
/ 16 июня 2011

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

  • Отмена
  • Запретить
  • Откажитесь
  • Продай
  • Разделить это
  • Истекает
  • ... и многое другое.

Я рассматриваю возможность отделить эти методы, подобные событиям, от класса и сделать его немного более универсальным, например шаблон Command. Но большинство методов имеют разные параметры, поэтому использование решения типа Run() или Execute() может быть проблемой?

Есть идеи, как структурировать это, сделать его гибким и простым для добавления новых команд или действий или как вы бы хотели их называть? (Я бы не назвал их настоящими событиями, поскольку там нет слушателей.)

Ответы [ 2 ]

0 голосов
/ 17 июня 2011

Инкапсулируйте параметры как один параметр:

public class SellCommand: Command {
   Product OwnerProduct;

   ProductCommand (AOwnerProduct)
   {
     this.OwnerProduct = AOwnerProduct;
   }

   public override void Execute(KeyValueArray Parameters)
   {
      double Price = (double)Parameters.ValueofKey("price");
      // do something else
   }
}

public class BuyCommand: Command {
   Product OwnerProduct;

   ProductCommand (AOwnerProduct)
   {
     this.OwnerProduct = AOwnerProduct;
   }

   public override void Execute(KeyValueArray Parameters)
   {
      double Cost = (double)Parameters.ValueofKey("cost");
      // do something else
   }
}


public class Product {
   public void AnyMethod()
   {
     KeyValueArray Parameters =  new KeyValueArray Parameters();
     KeyValueArray.Add("price", "12.5");
   } 
}

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

0 голосов
/ 16 июня 2011

Можете ли вы передать необходимые параметры для ваших команд в их конструктор?Таким образом, вы можете использовать команду без параметров.

class SellItCommand : ICommand {

  private decimal price;

  SellItCommand(decimal price) {
    this.price = price;
  }

  void Execute() {
    // Do whatever needs to be done with in the sell command using this.price
  }
}
...