gpt4 book ai didi

c# - 具有许多可选属性的对象的工厂模式

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:26 25 4
gpt4 key购买 nike

我正在重构一个表示某些 XML 中的数据的类。目前,类加载 XML 本身,属性实现每次都解析 XML。我想分解出 XML 逻辑并使用工厂来创建这些对象。但是有几个“可选”属性,我正在努力寻找一种优雅的方式来处理这个问题。

假设 XML 如下所示:

<data>
<foo>a</foo>
<bar>b</bar>
</data>

假设 foo 和 bar 都是可选的。类实现看起来像这样:

interface IOptionalFoo
{
public bool HasFoo();

public string Foo { get; }
}

// Assume IOptionalBar is similar
public class Data : IOptionalFoo, IOptionalBar
{
// ...
}

(不要问我为什么混合使用它的方法和属性。我没有设计那个接口(interface),它也不会改变。)

所以我有一个工厂,它看起来像这样:

class DataFactory
{
public static Data Create(string xml)
{
var dataXml = new DataXml(xml);

if (dataXml.HasFoo())
{
// ???
}

// Create and return the object based on the data that was gathered
}
}

这是我似乎无法找到一个优雅的解决方案的地方。我做了一些搜索,发现了一些我不喜欢的解决方案。假设我从构造函数中省略了所有可选属性:

  • 我可以将 Foo 和 Bar 实现为对 Data 的读/写。这满足了界面,但从设计的角度来看我不喜欢它。这些属性应该是不可变的,这会弄巧成拙。
  • 我可以在 Data 中提供 SetFoo() 和 SetBar() 方法。这只是最后一种涂口红的方法。
  • 我可以使用内部访问说明符;在大多数情况下,我认为此类不会在其程序集之外使用,因此它只是执行第一种技术的另一种方式。

我能想到的唯一其他解决方案涉及向数据类添加一些方法:

class Data : IOptionalFoo, IOptionalBar
{
public static Data WithFoo(Data input, string foo)
{
input.Foo = foo;
return input;
}
}

如果我这样做,Foo 上的 setter 可以是私有(private)的,这让我更开心。但我也不太喜欢用大量创建方法来乱扔数据对象。有很多可选属性。我考虑过为每个属性制作某种具有可为空版本的获取/设置 API 的 DataInitialization 对象,但是很多属性都是可选的,它最终更像是我正在重构的对象成为读取的外观/写版本。也许这是最好的解决方案:类的内部读/写版本。

我是否列举了选项?我是否需要停止如此挑剔并选择上述技术之一?还是有其他我没有想到的解决方案?

最佳答案

可以把virtual/caSTLe dynamic proxy/reflection/T4 scripts之类的关键字想成——每一个都可以从稍微不同的角度解决问题。

另一方面,这似乎非常合理,除非我误解了你:

private void CopyFrom(DataXml dataXml) // in Data class
{
if (dataXml.HasFoo()) Foo = dataXml.Foo;
//etc
}

关于c# - 具有许多可选属性的对象的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20409051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com