OO软件设计处理约束 - 使用哪种设计模式?

时间:2015-04-10 09:21:23

标签: oop design-patterns constraints

我对软件设计有疑问。我认为我正在寻找的是一个众所周知的问题,因此必须有一个设计模式或混合模式来解决它。但我无法弄明白。

好的,这是一个问题。例如,假设我有以下类和属性:

CTask

  • 名称
  • 持续时间
  • TaskArea

CTaskArea

  • 名称

CPerson

  • 名称
  • 能力

CAbility

  • 名称

CTool

  • 名称
  • CleaningTime

CConstraint

  • 名称
  • 约束

CTask,CPerson,CTool可能有限制,例如任务A只能由具有X能力的人完成,或者A人不能完成TaskArea X的任务等等。例如,当我创建一个新的CTask,CPerson或CTool时,我可以想象一个带有dropdwons的约束配置对话框,如:

班级|运营商|班级|财产|值

CPerson |不是| CTool |名称|锤

设计此方法的最佳方法是有机会为可能具有约束的所有类动态配置约束吗?我开始查看观察者模式,以便注册所有coinstraint功能类,但我认为有更好的方法。你觉得怎么样?

修改: 更确切地说。我想避免的是CPerson或CTool等包含彼此的信息。 我想像一个约束接口,必须由可能有约束的类实现。然后,在运行时,我查找已实现该接口的实例,并将它们放入列表中以进行进一步操作,如定义约束等。 当我第一次想到如何实现它时,我想知道是否已经有一个现有的设计模式,因为它似乎是一个常见的问题。不幸的是,我找不到真正符合问题的那个。有什么想法吗?

提前致谢!

编辑:我目前正在使用基于继承的解决方案,我将在其工作时将其发布到此处:)

2 个答案:

答案 0 :(得分: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);
    }
}

这当然是一个虚构的例子。由于您将constraintsAbcsetConstraintsAbcsetAbc作为不同的硬编码字段,因此某些代码重复存在问题。但是如果你愿意的话,你可以把它抽象成一些虚拟的“约束”字段集合。

答案 1 :(得分: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;
}

是否有足够的代码来弄清楚我是如何思考的?

此致 添