【问题标题】:Using inheritance as a naming convention使用继承作为命名约定
【发布时间】:2017-11-01 15:00:57
【问题描述】:

我想知道继承的用例。具体来说,我在 C# 中有一个情况,我有一个 Axis 类,您可以在其中给类一个字符串名称,以及其他属性。因此,您可以编写 (new Axis(“X”)) 来创建一个名为 X 的 Axis。

因为通常您会想要创建 X、Y 和 Z 轴,所以我倾向于创建名为 X、Y 和 Z 的 Axis 的三个子类,每个子类在构造函数中指定 Axis 名称是什么。

目前 Axis 类中的代码并不多,因此代码重用非常少(当然这可能会改变)。公平地说,用 (new Axis(“X”)) 代替 (new X()) 也没有那么麻烦。

无论如何,我想知道的是这样编写我的代码是否有任何缺点,或者这样写代码是否不常见。非常感谢!

【问题讨论】:

  • 为什么不将Axis 上的静态属性称为XYZ?这些可以返回Axis 的新实例或(可选)共享实例(取决于Axis 是否具有可变状态)。您认为这些子类添加需要它们成为不同的类吗?
  • 一般来说,创建一个新类的原因是为了增加功能。但是,有时,如果您像您正在考虑的那样创建一个“代理名称”,它确实可以提高可读性。尝试像阅读故事一样阅读您的代码,并根据使故事更易于理解的原因做出决定。
  • 这是正确设计的可能性不是很大。轴的方向只是一个属性,我想不到很多理由仅仅因为轴指向不同的方向而重写或添加方法。如果您想隐藏“X”,请考虑使用对象工厂。
  • 如果您希望限制应该使用哪些值构建轴,您可以考虑创建一个值为 X、Y、Z 的 emum。您可以将枚举传递给轴构造函数,并在其中设置名称(如果仍然需要)。

标签: c# inheritance naming-conventions conventions


【解决方案1】:

这取决于你要如何处理这个值:

  • 将其用作标题:我可以想象一个图表(您正在创建图表吗?),其中 x 轴代表 时间string 构造函数参数在这里非常合适,即使您决定始终将 x 轴命名为“X”。
  • 使用它来识别轴:如果代码的其他部分主动寻找"X"-轴,您可能希望使用枚举来代替,即AxisType.X
  • 什么都没有:如果应用程序不依赖此值,也许您可​​以改用“匿名轴”,而省略参数?

除非每个子类都有不同的行为,否则我不会创建子类。

【讨论】:

    【解决方案2】:

    就像 Damien 提到的那样,如果只是为了让创建它们更简单,那么使用辅助方法/属性来创建它们可能是一个更好的主意。

    public class Axis
    {
        public Axis(string name)
        {
            Name = name;
        }
    
        public string Name { get; }
    
        public static Axis X { get; } = new Axis("X");
    
        public static Axis CreateX() => new Axis("X");
    }
    

    如果你有一个属性,你需要确保 Axis 是不可变的。你总是可以在属性中返回一个新的,但这不是属性应该做的。

    【讨论】:

      【解决方案3】:

      考虑以下问题。

      1. 通常认为变量名称为 x 和 y 是不好的做法。像这样的名称使其他开发人员无法深入了解变量的性质及其用途。类命名也应使用相同的主体。创建名为 x 和 y 的子类并不是很有用的名称。我会使用 xAxis 和 yAxis 这样的名称来帮助提供清晰性。
      2. 您的 XYZ 坐标是否具有不同的属性,或者将由专门针对每种类型的不同方法调用?如果不是,为什么要使用不同的类型。子类将不等效或不可互换。因此,您计划将它们互换使用的任何地方都将引用基类 any 或在代码中具有多个版本来处理每种类型。
      3. 如果您只是想缩短类的实例化,我会提醒您注意的是,除非您受到某种大小限制。

      【讨论】:

        猜你喜欢
        • 2013-09-20
        • 2010-11-26
        • 1970-01-01
        • 2017-09-27
        • 2010-09-12
        • 2012-12-25
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        相关资源
        最近更新 更多