Каков наилучший способ поддержки нового свойства в устаревшем коде - PullRequest
0 голосов
/ 23 апреля 2011

У меня есть вопрос архитектуры о наследии. Например, у меня есть класс, который используется везде в проекте. Проекты не имеют юнит-тестов

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

Мне нужно изменить тип словаря на другой тип, например IEnumerable<KeyValuePair<TKey, TValue>>. Что является лучшим способом изменить это и не изменять часть кода, где используется словарь MyLegacyProperty.

Ответы [ 2 ]

1 голос
/ 23 апреля 2011

Ну, Dictionary<T,U> действительно реализует IEnumerable<KeyValuePair<T,U>>, поэтому все, что хочет использовать IEnumerable, может ссылаться на свойство 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; }
}

Если свойство замены не может быть преобразовано в словарь, то вы говорите о внесении реальных изменений во внешний интерфейс вашего класса. Я не верю, что есть какая-то замена для того, чтобы кусать пулю и вносить изменения без обратной совместимости. Единственный совет, который я могу вам дать, - сделать так, чтобы новое свойство имело имя, отличное от старого: вы сможете использовать функцию «Найти в файлах», чтобы найти код, который нужно изменить, и это приведет к ошибкам компилятора. Вы получаете ясные и однозначные.

1 голос
/ 23 апреля 2011

Если вы можете создать новое свойство с новым именем, вы можете пометить старое как [Obsolete] и медленно перенести базу кода для использования нового свойства, пока не останется ссылок на старое, и вы не сможетеудалите его.

Если вам нужно использовать старое имя свойства, и если свойство используется только в одном решении в Visual Studio, вы можете использовать рефакторинг с переименованием и изменить имя на что-то вроде MyLegacyProperty_Old, а затемсоздайте новое свойство со старым именем.

В любом случае рекомендуется написать несколько модульных тестов для вашего класса.

...