Sté*_*écy 1 c# refactoring model interface
拥有以下类,在两个不同的程序集中:
class Member
{
public string Label {get;set;}
// Lots of other fields...
public double Thickness {get;set;}
public double Width {get;set;}
public double Length {get;set;}
public double GetVolume ()
{
return Thickness * Width * Length;
}
// Other methods
}
class OtherMember
{
public string CompositeLabel {get;set;}
// Lots of other fields (not related to other class: Member)
public double Thickness {get;set;}
public double Width {get;set;}
public double Length {get;set;}
public double GetVolume ()
{
return Thickness * Width * Length;
}
// Other methods
}
Run Code Online (Sandbox Code Playgroud)
我想将厚度,宽度,长度属性和GetVolume方法重构为另一个类(Dimensions?)以及DRY ......
然后,我可以在这些类中拥有一个字段/属性,以授予对Dimensions实例的访问权限.
这是一个好方法吗?
我已经简洁地阅读了接口而不是具体的类,我应该从接口继承吗?
还有,不变性呢?
我觉得我经常迷失于让我的域名课程正确.有人对此有一些建议吗?
由于你有很多共同的状态和行为,我会推荐一个基类.尝试这样的事情:
class Member
{
public string Label { get; set; }
public double Thickness { get; set; }
public double Width { get; set; }
public double Length { get; set; }
public double GetVolume()
{
return Thickness * Width * Length;
}
}
class OtherMember : Member
{
public string CompositeLabel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
根据Label属性的不同,您可以选择将其设置为虚拟并覆盖派生类中的实现:
class Member
{
public virtual string Label { get; set; }
public double Thickness { get; set; }
public double Width { get; set; }
public double Length { get; set; }
public double GetVolume()
{
return Thickness * Width * Length;
}
}
class OtherMember : Member
{
string label;
public override string Label
{
get { return this.label; }
set { this.label = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
遏制还是继承?
如果这两个东西都是维度,那么属性可以放入名为Dimensions的超类中,这些东西都可以继承.
如果这些东西都有维度,那么可以将属性放入名为Dimensions的类中,这些类可以包含为属性/数据成员.
其他人已经证明了继承的样子; 这就是遏制的样子:
class Dimensions
{
public double Thickness {get;set;}
public double Width {get;set;}
public double Length {get;set;}
public double GetVolume ()
{
return Thickness * Width * Length;
}
}
class Member
{
public string Label {get;set;}
// Lots of other fields...
public Dimensions Dimensions {get;set;}
// Other methods
}
class OtherMember
{
public string CompositeLabel {get;set;}
// Lots of other fields (not related to other class: Member)
public Dimensions Dimensions {get;set;}
// Other methods
}
Run Code Online (Sandbox Code Playgroud)
有人说,作为一种设计原则或经验法则,"更喜欢遏制继承"; 另请参阅继承与聚合.
接口而不是具体的类?
接口而不是具体类添加了额外的间接层.它们在两个方面优于子类:
它们完全独立于实施; 我可能想要两个实现的东西,一个用于现实生活,一个用于单元测试,它们具有相同的接口,但其实现没有任何共同之处.
一个类可以实现多个接口(但只能有一个子类).这就是为什么IEnumerable和IDisposable的是作为接口不是子类更好:因为有些东西可能是IEnumerable的,和 IDisposable接口,和其他事物的子类.
这些论点都不一定适用于您的情况.
不变性呢?
如果事物是结构的话,不变性尤其重要(在这里它们不是重要的而是结构而不是结构).