是否有更好的方法来构建应用程序选项
本文关键字:构建 应用程序 选项 方法 更好 是否 | 更新日期: 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
静态
如果Options
与Segment
的关联比与Element
的关联大,则您的Element
可能甚至不需要Options
属性,它可以简单地使用Segment
的,也可以在其方法中使用Options
参数。
现在,你的程序已经抽象到无法判断这是否合适,但这是需要记住的。
Segment
和Element
似乎只是普通的DTO,因此它们不应该使用自己的构造。
AddABunchOfElements()
属于包含一个或多个Options
的SegmentWriter
实例。