2017-09-05 113 views
1

我们有一个约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); 
    } 
} 
+7

打破它,许多较小的班用更少的责任在任何类 –

+0

50〜60个属性仅仅是在一类太多的代码。这是基本原则,像你不会像这样膨胀一类的担心分离。所以解决方案与属性无关,并且会基础。 – Christopher

+2

您可以使用''“'属性名称['INotifyPropertyChanged.PropertyChanged'](https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged.aspx)事件',这将会使用* one *事件使所有*属性失效。最好的做法是实际执行[代码审查](https://codereview.stackexchange.com/)。 – Sinatr

回答

0

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

如果您设法让基类定义“基本”属性,则可以派生出承载依赖(例如计算)属性的类。因此,如果基本属性发生更改,则派生类也应该使用此事件,更新其属性并激发其自己的事件。

未经检验的,但我希望你明白了吧:

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); } 
    } 
} 
+0

我已经添加了示例代码,可能会有所帮助。 – user8562599

相关问题