У меня есть класс 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;
}
}
Да, он наиболее тесно связан с сегментом. Он никогда не изменится на уровне элемента. Я мог бы сделать его статическим на уровне сегмента, но опять же, я боюсь статических свойств. –
«делает его статичным на уровне сегмента» не имеет для меня особого смысла. Существует только один конкретный статический объект, а не один экземпляр. –
Сэм, я сделал образец и добавил его к вышеуказанному образцу вопроса. Каждый парсер фактически является подклассом, и каждый подкласс имеет собственное статическое свойство, поэтому существует только один из определенного статического объекта. Я не говорю, что это хорошая идея, просто возможная. –