2015-04-10 4 views
0

У меня есть вопрос относительно дизайна программного обеспечения. Я думаю, что поиск - это хорошо известная проблема, поэтому для ее решения должен быть образец дизайна или сочетание шаблонов. Но я не могу понять это.OO Программное обеспечение для обработки ограничений - какой шаблон дизайна использовать?

Хорошо, это вопрос. Например позволяет сказать, что у меня есть следующие классы и свойства:

CTask

  • Имя
  • Продолжительность
  • TaskArea

CTaskArea

  • Имя

CPerson

  • Имя
  • Способности

CAbility

  • Имя

CTool

  • Имя
  • CleaningTime

CConstraint

  • Имя
  • Ограничение

CTask, CPerson, CTool могут иметь ограничения, например, Задача А может выполняться только лицами с умением X, или человек А не может выполнять задачи TaskArea X и так далее. Например, когда я создаю новый CTask, CPerson или CTool, я мог бы представить диалоговое окно конфигурации ограничений с dropdwons:

Класс | Оператор | Класс | Недвижимость | Значение

CPerson | НЕ | CTool | Имя | Hammer

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

EDIT: Чтобы быть более точным. Мне бы хотелось избежать того, что CPerson или CTool и т. Д. Содержат информацию друг о друге. Я думаю о чем-то вроде интерфейса ограничения, который должен быть реализован классами, которые могут иметь ограничения.Затем во время выполнения я ищу экземпляры, которые реализовали этот интерфейс, и помещают их в список для дальнейших операций, таких как определение ограничения и т. Д. Когда я впервые подумал о том, как его реализовать, мне было интересно, существует ли уже существующий шаблон дизайна, потому что это казалось такой общей проблемой. К сожалению, я не смог найти тот, который действительно подходит для этой проблемы. Есть идеи?

Заранее благодарен!

Tim

EDIT: Im в настоящее время работает в растворе на основе наследования и им будет разместить его здесь, когда его работы :)

ответ

0

Почему бы не иметь contraints_for_xxx собственности на каждом объекте, имеющие ограничение для конкретного xxx недвижимость?

Когда какое-либо дочернее свойство должно быть добавлено в коллекцию, оно сначала запускается через сбор ограничений. Если какой-либо элемент ограничения возвращает false ... Исключение выбрано, небесные громы и т. Д.

Ограничения могут быть заполнены в конструкторе объекта или позже через какой-то вызов setupConstraints().

CPerson может выглядеть (PHP пример):

class Person 
{ 
    protected $constraintsAbc = null; 

    public function setConstraintsAbc(array $constraints) 
    { 
     $this->constraintsAbc = $constraints; 
    } 

    public function setABC($value) 
    { 
     foreach ($this->constraintsAbc as $constraint) { 
      if (!$constraint->isValid($value)) { 
       throw new Exception("Constraint {$constraint->getName()} is not happy with value $value"); 
      } 
     } 
     $this->abc = $value; 
    } 
} 

class PersonSetup 
{ 
    public function setupPerson(Person $person) 
    { 
     $constrains[] = new PersonAbcConstraint("Value > 5"); 
     $person->setContraintsABC($constrains); 
    } 
} 

Это, конечно, фиктивный пример. Здесь возникает проблема в некотором дублировании кода, поскольку у вас есть constraintsAbc, setConstraintsAbc и setAbc как разные жестко закодированные поля. Но вы можете абстрагировать это в какую-то виртуальную «ограниченную» коллекцию полей, если хотите.

+0

Привет, спасибо за Ваш ответ. Я не знаю, полностью ли это понимаю. Вы имеете в виду, что человек должен знать свойства инструмента и наоборот? – GinSonic

+0

@ user3364279 Это зависит от ваших потребностей. Я просто рекомендовал схему. Вы можете заполнить ограничения из конструктора 'Person' (в этом случае Person будет знать их), или вы можете делегировать эту задачу на какой-то другой класс (например, PersonSetup). –

+0

Hi FractalizeR, можете ли вы дать мне небольшой пример того, как выглядят CPerson и CPersonSetup. И у вас есть представление о том, как может выглядеть интерфейс ограничения? Я могу немного усложнить ситуацию, но им интересно, как будет выглядеть решение проблемы, если мы будем использовать интерфейсы или наследование. Заранее спасибо – GinSonic

0

это им решение в порядке с:

class CCouldHaveConstraints_Base 
{ 
    public virtual GetInstance(); 
    public virtual GetClassName(); 
    public virtual GetPropertyListThatCouldHaveConstraints(); 

} 

class CPerson : CCouldHaveConstraints_Base 
{ 
    private String m_PersonName; 
    private String m_PersonAge; 

    public String PersonName 
    { 
     get {return this.m_PersonName;} 
     set {this.m_PersonName=value;} 
    } 

    public String PersonAge 
    { 
     get {return this.m_PersonAge;} 
     set {this.m_PersonAge=value;} 
    } 

    public override GetInstance() 
    { 
     return new CPerson; 
    } 
    public override GetClassName 
    { 
     return "Person"; 
    } 

    public list<string> GetPropertyListThatCouldHaveConstraints() 
    { 
      list <string> ConstraintPropsList = new list<string>; 
      ConstraintPropsList.Add ("PersonName") 
    } 

} 

// class contains a list of all objects that could have constraints 
class CConstraint_Lst 
{ 
    private list<CConstraint> m_ListOfConstraints; 
    private list<CCouldHaveConstraints_Base> m_ListOfObjectsThatCouldHaveConstraints; 
} 

// e.g Person | Person.Name | Tim | NOT | Tool | Tool.Name | "Hammer" 
class CConstraint 
{ 
     private String m_ClassName_A; 
     private String m_ClassProperty_A; 
     private String m_ClassProperty_A_Value; 
     private String m_Operator; 
     private String m_ClassName_B; 
     private String m_ClassProperty_B; 
     private String m_ClassProperty_B_Value; 
} 

Достаточно ли код, чтобы выяснить, как им думать?

С уважением, Tim

Смежные вопросы