是否有更好的方法来构建应用程序选项

本文关键字:构建 应用程序 选项 方法 更好 是否 | 更新日期: 2023-09-27 18:25:26

我有一个类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;
    }
}

是否有更好的方法来构建应用程序选项

您发布的内容没有任何问题。对一个物体的几百次引用在总体上并没有那么大。

如果只有一个Options(没有),我只会使Options静态


如果OptionsSegment的关联比与Element的关联大,则您的Element可能甚至不需要Options属性,它可以简单地使用Segment的,也可以在其方法中使用Options参数。

现在,你的程序已经抽象到无法判断这是否合适,但这是需要记住的。

SegmentElement似乎只是普通的DTO,因此它们不应该使用自己的构造。

AddABunchOfElements()属于包含一个或多个OptionsSegmentWriter实例。