【问题标题】:large number of Property which depend on other properties大量依赖于其他属性的属性
【发布时间】:2017-09-05 10:16:11
【问题描述】:

我们有一个包含大约 50~60 个属性的类,这些属性依赖于同一类的属性 + 其他类的属性。目前在更改一个属性时,我们正在提高其他 20 个属性的属性更改,这使代码变得混乱且容易出错。处理这种情况的最佳方法是什么?任何建议的设计模式来解决这个问题?

public class ClassA 
{
    public ClassB classB;

    public int Prop1
    {
        get { return CalculateValueForProp1(); }
    }

    private int prop2;
    public int Prop2
    {
        get { return prop2; }
        set
        {
            prop2 = value;
            OnPropertyChange(nameof(Prop2));
            OnPropertyChange(nameof(Prop1));
        }
    }


    private int prop3;
    public int Prop3
    {
        get { return prop3; }
        set
        {
            prop3 = value;
            OnPropertyChange(nameof(Prop3));
            OnPropertyChange(nameof(Prop1));
        }
    }

    public int CalculateValueForProp1()
    {
        return (this.prop2 * 10 + this.Prop1 * 20 + classB.AnotherProperty*10);
    }
}

【问题讨论】:

  • 把它分解成许多责任更小的小类
  • 50~60 任何类中的属性只是一个类中的代码太多。像分离关注点这样的基本原理,你不会像那样膨胀一个类。所以解决方案与属性无关,将基础知识。
  • 您可以使用"" 作为属性名称来引发INotifyPropertyChanged.PropertyChanged 事件,这将使只有一个 事件的所有 属性无效。最好的办法是实际执行您所做的code-review

标签: c# design-patterns properties dependency-properties


【解决方案1】:

尝试将属性的依赖关系映射到对象结构。因此,您必须找到属性之间的依赖关系。

如果您设法拥有一个定义“基本”属性的基类,您可以派生具有依赖(例如计算)属性的类。因此,如果基属性发生更改,派生类也应该使用此事件,更新其属性并触发自己的事件。

未经测试,但我希望你明白这一点:

public class ClassA 
{
    private int prop2;
    public int Prop2
    {
        get { return prop2; }
        set
        {
            prop2 = value;
            OnPropertyChange(nameof(Prop2));
        }
    }

    private int prop3;
    public int Prop3
    {
        get { return prop3; }
        set
        {
            prop3 = value;
            OnPropertyChange(nameof(Prop3));
        }
    }
}

public ClassB classB
{
    public ClassB(ClassA classAinstance)
    {
        classAinstance.PropertyChanged += (s,e) => OnPropertyChange(nameof(Prop1));
    }

    public int Prop1
    {
        get { return (this.prop2 * 10 + this.Prop1 * 20 + classB.AnotherProperty*10); }
    }
}

【讨论】:

  • 我已经添加了示例代码,可能会有帮助。
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 2016-07-08
  • 2011-09-09
  • 2017-02-08
  • 2011-08-20
  • 1970-01-01
  • 2018-03-26
  • 2021-06-22
相关资源
最近更新 更多