在遗留代码中支持新属性的最佳方法是什么

时间:2011-04-23 04:01:26

标签: c# dictionary properties ienumerable legacy-code

我有关于遗产的架构问题。  例如,我有一个在项目中随处使用的类。项目没有任何单元测试

 public class LegacyObject 
    {
      public Dictionary<string, string[]> MyLegacyProperty { get;set;} 
    } 

我需要将字典类型更改为其他类型,例如IEnumerable<KeyValuePair<TKey, TValue>>。  更改它的最佳方法是什么,不要更改字典MyLegacyProperty使用的代码部分。

2 个答案:

答案 0 :(得分:1)

如果您可以使用新名称创建新属性,则可以将旧属性标记为[Obsolete]并慢慢迁移代码库以使用新属性,直到没有对旧属性的引用为止你可以删除它。

如果必须使用旧属性名称,并且该属性仅在Visual Studio中的一个解决方案中使用,则可以使用重命名重构并将名称更改为MyLegacyProperty_Old,然后创建新属性用旧名称。

在任何一种情况下,为您的班级编写一些单元测试是个好主意。

答案 1 :(得分:1)

好吧,Dictionary<T,U>确实实现了IEnumerable<KeyValuePair<T,U>>,所以任何想要使用IEnumerable的东西都可以引用Dictionary属性,它会起作用。既然你想做出这样的改变,我假设你想要做一些字典不允许的事情,也许是重复键。

如果替换属性可以转换为Dictionary,我会做这样的事情。您是否有旧物业坐在您的新物业旁边,并处理旧物业的吸气剂和制定者的转换。请注意,如果MyLegacyProperty的用例是检索,修改它,而不是将其设置回来,则此模式将失败;在这种情况下,你需要做一些类似于ObservableCollection的事情。 (有ObservableDictionary吗?)

public class LegacyObject 
{
    public Dictionary<string, string[]> MyLegacyProperty
    {
        get { return ConvertMyNewProperty(); }
        set { this.MyNewProperty = ConvertMyLegacyProperty(value); }
    }

    IEnumerable<KeyValuePair<string, string[]>> MyNewProperty { get; set; }
}

如果替换属性无法转换为Dictionary,那么您正在谈论对类的外部接口进行真正的更改。我认为没有任何替代品可以咬住子弹,并且无需向后兼容即可进行更改。我可以给你的唯一提示是使新属性与旧属性具有不同的名称:您将能够使用“在文件中查找”来查找需要更改的代码,这将使编译器出错你明白而且毫不含糊。

相关问题