代码之家  ›  专栏  ›  技术社区  ›  Sylvain Rodrigue

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

  •  1
  • Sylvain Rodrigue  · 技术社区  · 17 年前

    问题是:我们的主要班级(比如:合同)每年都在变化。添加了一些属性,删除了其他属性。我们不知道明年会怎么样。它可能会改变很多,或者根本不会改变。

    另一方面,我们现在(新的要求…)必须保持每一个合同的历史。每次用户更新契约时,整个对象都必须存储在备份中(例如-在表中序列化)。

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

    但是这会很麻烦(而且很难看),因为很多课程都依赖于合同——事实上,我们每年都要创建一批新的课程。

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

    事先谢谢!

    (我们使用的是C 2.0。)

    补充:感谢您的回答。我们现在问自己如何使用字典/XML文件来实现版本控制而不破坏所有代码。在这种情况下,词典似乎很性感:o)

    3 回复  |  直到 17 年前
        1
  •  3
  •   DancesWithBamboo    17 年前

    停止序列化对象。以相对方式存储数据。串行化的目的是为了缩短持续时间,比如说,像在电线上传输;而不是永久存储。

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

        2
  •  2
  •   moogs    17 年前

    我能想到的第一件事就是。实现一种“能力”文档。详细说明联系人版本及其包含的属性的列表(或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将检查功能中是否支持该字段。

    (这必须是一个模式或什么东西,有人吗?)

        3
  •  2
  •   Danut Enachioiu    17 年前

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

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