C#:您如何建议重构这些类?(接口,聚合或其他任何东西)

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实例的访问权限.

这是一个好方法吗?

我已经简洁地阅读了接口而不是具体的类,我应该从接口继承吗?

还有,不变性呢?

我觉得我经常迷失于让我的域名课程正确.有人对此有一些建议吗?

And*_*are 5

由于你有很多共同的状态和行为,我会推荐一个基类.尝试这样的事情:

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)


Chr*_*isW 5

遏制还是继承?

如果这两个东西都是维度,那么属性可以放入名为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接口,其他事物的子类.

这些论点都不一定适用于您的情况.


不变性呢?

如果事物是​​结构的话,不变性尤其重要(在这里它们不是重要的而是结构而不是结构).