Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Architecture 如何实现“类版本控制”(使用同一类的不同版本)_Architecture_Versioning - Fatal编程技术网

Architecture 如何实现“类版本控制”(使用同一类的不同版本)

Architecture 如何实现“类版本控制”(使用同一类的不同版本),architecture,versioning,Architecture,Versioning,问题是:我们的主课说:每年都有合同变更。添加了一些属性,删除了其他属性。我们不知道明年会是什么样子。它可能会改变很多,或者根本不会改变 另一方面,我们现在有了新的要求。。。必须保存每一份合同的历史记录。每次用户更新合同时,整个对象都必须存储在备份中,例如序列化在表中 当然,我们必须能够读回它。。。一个选择是每年都有一个新的合同类Contract2008,Contract2009 但这将是非常麻烦和丑陋的,因为许多类依赖于契约——事实上,我们每年都必须创建一批新类 有过这种问题吗?有什么建议吗 提

问题是:我们的主课说:每年都有合同变更。添加了一些属性,删除了其他属性。我们不知道明年会是什么样子。它可能会改变很多,或者根本不会改变

另一方面,我们现在有了新的要求。。。必须保存每一份合同的历史记录。每次用户更新合同时,整个对象都必须存储在备份中,例如序列化在表中

当然,我们必须能够读回它。。。一个选择是每年都有一个新的合同类Contract2008,Contract2009

但这将是非常麻烦和丑陋的,因为许多类依赖于契约——事实上,我们每年都必须创建一批新类

有过这种问题吗?有什么建议吗

提前谢谢

我们使用的是C2.0


补充:谢谢你的回答。我们现在在问自己,如何在不破坏所有代码的情况下使用字典/XML文件来实现版本控制。在这种情况下,字典似乎很性感:我能想到的第一件事就是我的脑袋。实现一种功能文档。详细说明联系人版本及其包含的属性的列表或XML文档

在契约上运行的每个函数都应该检查是否支持特定的属性和功能

例如:

Contract2008 Capabilities
-----
has Name
has Stipulations
can DoMagic
-----
>     
>     Contract2009 Capabilities
>     -----
>     has Name
>     has Stipulations
>     can DoMagic
>     -----
合同类将存储能力文档和一些通用getter setter

Contract
  GetCapabilities()
  Set(field, value)  
  Get(field, value)
set和get将在设置或获取值之前检查功能中是否支持该字段


这一定是一种模式或什么的,任何人?

我能想到的第一件事就是我的头脑。实现一种功能文档。详细说明联系人版本及其包含的属性的列表或XML文档

在契约上运行的每个函数都应该检查是否支持特定的属性和功能

例如:

Contract2008 Capabilities
-----
has Name
has Stipulations
can DoMagic
-----
>     
>     Contract2009 Capabilities
>     -----
>     has Name
>     has Stipulations
>     can DoMagic
>     -----
合同类将存储能力文档和一些通用getter setter

Contract
  GetCapabilities()
  Set(field, value)  
  Get(field, value)
set和get将在设置或获取值之前检查功能中是否支持该字段

这一定是一种模式或什么的,任何人?

很可能您不必将属性实现为C属性。实际上,您可以将属性存储在某种字典中,并使用Get和Set方法来读取/枚举它们。在这种情况下,您可以每年使用相同的类

如果属性必须是属性,那么我建议每年使用该类构建一个新程序集,并动态加载该程序集。然后,您可以使用反射来查看每个契约对象支持哪些属性。为了让您的生活更轻松,我建议您为不会更改的属性提供一个接口,并使在程序集中标识合同类更简单。

很可能您不必将属性实现为C属性。实际上,您可以将属性存储在某种字典中,并使用Get和Set方法来读取/枚举它们。在这种情况下,您可以每年使用相同的类


如果属性必须是属性,那么我建议每年使用该类构建一个新程序集,并动态加载该程序集。然后,您可以使用反射来查看每个契约对象支持哪些属性。为了让您的生活更轻松,我建议您为不会更改的属性提供一个接口,并使在程序集中标识合同类更简单。

停止序列化对象。以关系方式存储数据。序列化的目的是为了缩短持续时间,比如说像在网络上传输流一样;不是永久存储


而不是将字段编码到类中;听起来您可能需要更多类似于字典的结构,它可以根据按年份存储的数据库配置值动态地提取字段。然后基于这些值构建一个动态UI。每年都要创建一个新类并测试代码,维护成本似乎不可能高。

停止序列化对象。以关系方式存储数据。序列化的目的是为了缩短持续时间,比如说像在网络上传输流一样;不是永久存储

而不是将字段编码到类中;听起来您可能需要更多类似于字典的结构,它可以根据按年份存储的数据库配置值动态地提取字段。然后基于这些值构建一个动态UI。每年都要创建一个新类并测试代码,维护成本似乎高得不可思议