Разбор XML-объекта для нескольких классов с различной логикой - PullRequest
0 голосов
/ 30 октября 2018

У меня много узлов XML, созданных сторонней организацией:

<node id='8440' name='nodeOne' property_two='7.22' sorting_index='20'/>
<node id='8440' name='nodeTwo' property_two='7.22' sorting_index='subItemThree;30;subItemTwenty;50'/>
...

Каждый атрибут имеет одинаковый тип и значение среди всех узлов, кроме одного с именем sorting_index . Обычно он содержит int, указывающий, ну, в общем, индекс сортировки объекта. В первом вышеупомянутом узле индекс сортировки равен 20 для объекта с именем «nodeOne».

К сожалению, иногда эти узлы являются просто "носителями" индекса сортировки для нескольких подобъектов. Рассматривая второй узел, приведенный выше, мы видим, что он обеспечивает сортировку индексов для объектов с именами «subItemThree» и «subItemTwenty» со значениями 30 и 50 соответственно.

В моем подходе я создал два класса, первый из которых - представление узла с простым sorting_index, а второй - представление узла со сложной логикой sorting_index. Второй класс расширил первый и добавил метод для извлечения массива сортировочных индексов из геттера свойства SortingIndex . Поэтому я проанализировал все в базовом классе (свойство SortingIndex относится к типу string), а затем преобразовал некоторые из них в производный класс. Я описал логику этого в другом вопросе: Преобразование из базового в производный объект при огромном определении конструктора

Однако мне сказали, что такое преобразование не является хорошим подходом к проектированию. Каковы ваши предложения? Я чувствую, что иметь 2 абсолютно независимых класса с абсолютно одинаковой логикой, за исключением одного свойства, является излишним.

1 Ответ

0 голосов
/ 30 октября 2018

Независимо от того, следует ли наследовать одно от другого, следует подумать о том, может ли производный класс заменять базовый класс, см. Принцип замены Лискова

Если это не так, вы можете попробовать что-то подобное с общим базовым классом, который имеет все свойства, кроме индекса сортировки.

public abstract class BaseClass
{
    public string Property1 { get; }
    public int Property2 { get; }

    public BaseClass(string prop1, int prop2)
    {
        ...
    }
}

public class StringClass : BaseClass
{
    public int SortIndex { get; }

    public StringClass(string prop1, int prop2, int index) :
        base(prop1, prop2)
    {
        SortIndex = index;
    }
}

public class CollectionClass : BaseClass
{
    public Dictionary<string, int>  SortIndexes { get;}

    public CollectionClass(string prop1, int prop2, Dictionary<string, int> indexes) :
        base(prop1, prop2)
    {
        SortIndexes = indexes;
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...