我有关于遗产的架构问题。 例如,我有一个在项目中随处使用的类。项目没有任何单元测试
public class LegacyObject
{
public Dictionary<string, string[]> MyLegacyProperty { get;set;}
}
我需要将字典类型更改为其他类型,例如IEnumerable<KeyValuePair<TKey, TValue>>
。
更改它的最佳方法是什么,不要更改字典MyLegacyProperty使用的代码部分。
答案 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,那么您正在谈论对类的外部接口进行真正的更改。我认为没有任何替代品可以咬住子弹,并且无需向后兼容即可进行更改。我可以给你的唯一提示是使新属性与旧属性具有不同的名称:您将能够使用“在文件中查找”来查找需要更改的代码,这将使编译器出错你明白而且毫不含糊。