TDD、持续部署和持久性——如何协调它们?

TDD, Continous Deployment, and Persistence - how to concile them?

在我的公司,我们正在重构一些应用程序,要重构的方面之一是表示 "user objects" 的数据的 classes,即用户创建的对象,并且必须是本地持久化。

我们正在努力实现持续部署工作流,例如应用程序应该在功能上增长,而安装基数应该在数量上增长。

但是由于每个被序列化的 class 的设计是由它们如何支持用例来定义的,并且考虑到设计会随着功能被更好地理解和建模而改变,我们应该如何处理本地、客户端-side 持久对象 - 从每个用户的角度来看都是有价值的资产 - 当最终设计 "breaks"?

以下示例仅用于说明,因为问题可以有多种可能形式,可以是 属性 类型的更改,也可以是 adding/removal 属性。下面的 class 有一个 Platform 属性 告诉给定设备与哪个平台兼容:

public class Device
{
    public PlatformEnum CompatiblePlatform {get; set;}
}

因此,我们将系统部署给一些客户,他们开始使用它并将大量 Device 实例保存到他们的文件系统中。

但最终 need/possibility 出现,因为每个设备与 兼容的 多于一个 Platform,因此 class 现在包含集合 而不是 CompatiblePlatform:

的单个值
public class Device
{
    public IEnumerable<PlatformEnum> CompatiblePlatforms {get; set;}
}

那么现在我们有一个问题:如何处理大量的序列化文件,让它们被新版本的设计自动加载?

而且,更广泛地说,在设计可序列化 classes 的情况下,我应该如何尝试调和 "Design up front" 与基于用户故事的 ATDD "Emergent Design" ?我应该使用某种版本控制,还是应该采取一些众所周知的预防措施?

一种常见的方法是为每个序列化对象写一个版本号,并改进反序列化代码以处理旧版本。例如在您的示例中,版本 2 Device 代码将读取版本 1 序列化 Device 并将单个 PlatformEnum 作为其枚举 PlatformEnum.[=14 中的单个条目加载=]