2013-07-29 3 views
1

У меня есть класс Translator, который имеет два экземпляра Parser(Options options) - парсер ввода и выходной синтаксический анализатор. Каждый из них получает свои собственные варианты.Есть ли лучший способ архитектования приложений?

В каждом анализаторе есть список ElementParser(Options option), который передает параметры вниз.

Если у каждого анализатора есть сотня элементов, это означает, что для каждого экземпляра опции имеется более ста ссылок.

Это кажется чрезмерным.

Очевидным ответом является создание статического имущества Parser.Options, но традиционная мудрость говорит, чтобы держаться подальше от них.

Так есть ли лучший способ сделать это?

Вот рабочий пример:

public class Options { 
    public int Value { get; set; } 
} 

public class ElementParser { 
    public object ElementData { get; set; } 
    public ElementParser(Options options) { 
     this.Options = options; 
    } 
    public Options Options { get; set; } 
    public void DoesSomethingWithOptions() { 
     if (Options.Value == 1) 
     { 
      //Do something(); 
     } 
     else 
     { 
      //Do something else(); 
     } 
    } 
} 

public class SegmentParser{ 

    public object SegmentData { get; set; } 
    public Options Options { get; set; } 
    public List<ElementParser> ElementParsers { get; set; } 

    public SegmentParser(Options options) { 
     this.Options = options; 

    } 

    public void AddABunchOfElements() { 
     this.ElementParsers = new List<ElementParser>() {new ElementParser(this.Options), new ElementParser(this.Options)}; 
    } 

} 
class Program 
{ 
    static void Main(string[] args) { 

     var options1 = new Options() {Value = 1}; 
     var options2 = new Options() {Value = 2}; 

     var segment1 = new SegmentParser(options1); 
     segment1.AddABunchOfElements(); 

     var segment2 = new SegmentParser(options2); 
     segment2.AddABunchOfElements(); 
     //There are now 3 references of each options. If there were 100 elements, there would be over 200 references. 
    } 
} 

Вот вторая попытка с помощью статического свойства. Обратите внимание, что класс Parser является подклассом, поэтому на самом деле существует только один экземпляр статического свойства. Этот образец работает правильно.

public class Options 
{ 
    public int Value { get; set; } 
} 

public class Parser{ 
} 

public class Parser1 : Parser 
{ 
    public Parser1(Options options) { 
     Options = options; 
    } 
    public static Options Options { get; set; } 
} 

public class Parser2 : Parser { 
    public Parser2(Options options) { 
     Options = options; 
    } 
    public static Options Options { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) { 

     var options1 = new Options(); 
     options1.Value = 1; 

     var options2 = new Options(); 
     options2.Value = 2; 

     var test1 = new Parser1(options1); 

     var test2 = new Parser2(options2); 

     Console.WriteLine(Parser1.Options.Value); //Should be 1 
     Console.WriteLine(Parser2.Options.Value); //Should be 2; 

    } 
} 

ответ

2

Нет ничего плохого в том, что вы опубликовали. Несколько сотен ссылок на объект не так велики в великой схеме вещей.

Я бы только сделать Options статическим, если есть только один Options (который не существует)


Если Options больше ассоциируется с Segment, чем с Element, чем ваш Element не может даже нужно чтобы иметь значение Options, он может использовать Segment или может принять параметр Options в своем методе.

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

+0

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

+0

«делает его статичным на уровне сегмента» не имеет для меня особого смысла. Существует только один конкретный статический объект, а не один экземпляр. –

+0

Сэм, я сделал образец и добавил его к вышеуказанному образцу вопроса. Каждый парсер фактически является подклассом, и каждый подкласс имеет собственное статическое свойство, поэтому существует только один из определенного статического объекта. Я не говорю, что это хорошая идея, просто возможная. –

1

Segment и Element кажутся просто DTO, который должен, таким образом, не сможет с их собственной конструкции.

AddABunchOfElements() принадлежит к экземпляру SegmentWriter, содержащему один или несколько Options.

+0

Вы правы. Я обновил образец, чтобы показать, что они не DTO. –

+0

@Greg your edit показывает, что ваш синтаксический анализатор не только анализирует, но и удерживает данные. Refactor, сделайте 'ElementParser' выплюнуть список' Element'. Тогда вам нужен только один экземпляр «ElementParser», который может содержать все параметры. – CodeCaster

+0

Хороший код CodeCaster. –

Смежные вопросы