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 中的单个条目加载=]
在我的公司,我们正在重构一些应用程序,要重构的方面之一是表示 "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 中的单个条目加载=]