【问题标题】:Howto refactor legacy code with constant如何用常量重构遗留代码
【发布时间】:2015-03-16 10:44:44
【问题描述】:

我有一个类用作数据库中特定表的包装器。在这个类的构造函数中(我们称之为MyLookup)我们进行了一些初始化(例如读取一些元数据)。现在我应该在数据库中创建第二个表,它或多或少是第一个表的副本。

class MyLookup {
    public const TABLE_NAME = "MYTABLE";
    private readonly ITable table;

    MyLookup() { 
        this.table = OpenTable(TABLE_NAME); 
        /* further init */
    }
}

问题在于初始化代码或多或少与“基”表相同。唯一的区别是它的实际名称。通常我只需将常量TABLE_NAME 更改为可以在派生表类中覆盖的虚拟属性。但是该 const 可以在遗留代码中使用,因此将其更改为属性将导致也更改其访问权限(实例而不是静态)。那么如何通过只对MyLookup 进行最少更改来调用具有不同TABLE_NAME 的基本初始化?

【问题讨论】:

  • 作为其中的一部分,您是否也不能更改旧代码?
  • @Belogix 不,不幸的是它的客户代码。
  • TABLE_NAME 常量真的是私有常量吗?我认为您在覆盖属性的情况下走在正确的轨道上 - 只需将其命名为不同的(属性)并让 TABLE_NAME 与 [Obsolete] 属性保持原样。
  • 我不完全确定,但据我所知,如果你有一些 const,编译器不会生成变量,而是在每次使用 const 时传递确切的值。这发生在编译时。因此,如果您进行更改,这不会破坏现有代码(但将来会更难调试)。
  • @OndrejSvejdar 我已经考虑过将 const 标记为过时。可能是这样。

标签: c# inheritance constants


【解决方案1】:

在所有 cmets 之后,这是(希望)零冲突的方法:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class TableNameAttribute : Attribute
{
  public string TableName { get; set; }
}

public class BaseLookup<TSelfReferenceType>
{
  public static string TABLE_NAME
  {
    get 
    { 
      var attributes = typeof(TSelfReferenceType).GetCustomAttributes(typeof(TableNameAttribute), false); 
      if (attributes == null || attributes.Length == 0)
      {
        return null;
      }
      return ((TableNameAttribute)attributes[0]).TableName;
    }
  }
}

[TableName(TableName = "MyLookup")]
public class MyLookup : BaseLookup<MyLookup>
{
}

[TableName(TableName = "ChildLookup")]
public class ChildLookup : BaseLookup<ChildLookup>
{
}

// write out MyLookup
Console.Out.WriteLine(MyLookup.TABLE_NAME);
// write out ChildLookup
Console.Out.WriteLine(ChildLookup.TABLE_NAME);

【讨论】:

  • 哇,看起来有点奇怪,但它确实有效。我不明白为什么这种带有静态成员的继承有效。
  • @HimBromBeere - 它实际上不是静态继承;它只是滥用泛型:)
  • 据我从这里阅读stackoverflow.com/questions/2281775/… 它实际上与继承有关,尽管在这种情况下它是一个误导性术语。 ChildLookup-class 没有任何TableName-member,它从BaseLookup“继承”它。即使没有泛型,您的代码也可以编译。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多