gpt4 book ai didi

c# - 谁应该负责膨胀数据对象?

转载 作者:太空宇宙 更新时间:2023-11-03 11:31:01 29 4
gpt4 key购买 nike

在我当前的项目中,我有很多对象需要保存到 XML 并在运行时扩充。我一直在通过 .NET 的 DataContracts 管理它。我现在正在做的是创建一个单独的类来表示我正在序列化的对象,并将这些对象读取/写入磁盘以避免在单个类中承担太多责任。这是一个例子:

public class Range
{
private float _min;
private float _max;

public float Min { get { return this._min; } }
public float Max { get { return this._max; } }

// Constructrs & Methods...

public SerializedRange GetAsSerializable();
}

Range 类有免费类:

[DataContract]
public class SerializedRange
{
[DataMember]
public float Min;

[DataMember]
public float Max;

// Constructor...
}

那么我的问题是,谁应该负责实际获取对象的序列化版本并将其膨胀到实际对象中?我看到了三个选项,但我不确定哪个(如果有的话)是最好的:

  1. 使用姊妹类的可用构造函数/工厂,为对象的序列化版本提供一个实例方法,该方法吐出一个膨胀的实例。
  2. 为姊妹类提供一个工厂,该工厂采用序列化版本的实例来构造自身。
  3. 不要让类或它的可序列化对应物做任何事情 - 让读取序列化对象的代码使用它们通常拥有的任何构造函数/工厂手动创建常规对象。

我意识到在某些情况下,由于这个有些人为的示例之外的限制,您必须以一种或另一种方式进行操作。虽然有不止一种方法可以做到这一点,但我真正想要的是一个通用的经验法则,它可以产生整洁、可读和可扩展的代码。

最佳答案

如果您将应用程序“分解”为组成部分,您会得到哪些逻辑组件?根据我的理解,这里有一些:

  1. 域对象(您存储的数据)
  2. 数据层 - 负责保存数据(并检索数据)

和许多其他人(但只是根据您的描述取了一个子集)

现在,数据层的工作是将内容写出到一些存储设备——在您的例子中是将 XML 文件写到磁盘。

现在,当您“查询”文件时,谁来获取它?数据层。谁“应该”填充相应的域对象?那么数据层本身。

数据层是否应该将填充的责任“委托(delegate)”给单独的类/工厂?这取决于它是否会被其他人重复使用。如果没有,像内部类这样的概念可能会有很好的帮助(它们存在于 java 世界中,不确定它是否等同于 C#.NET)。这样您就可以将它模块化为一个特定的类,除非您希望这样,否则其他类不公开可见。

你应该和工厂一起去吗?是的你可以。但要确保这样做在逻辑上是正确的。您可能会遇到许多对象充气器 - 可以将充气功能隔离到一个类中,并且工厂本身可以成为数据层的一部分(如果您希望那样的话)。

一旦您描述了关注点,您就可以更好地决定将那段代码放在哪里。我提供了一些可能会派上用场的建议。

希望对你有帮助

关于c# - 谁应该负责膨胀数据对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7788100/

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