【问题标题】:preserve backward compatibility without a separate class在没有单独的类的情况下保持向后兼容性
【发布时间】:2015-04-16 22:18:11
【问题描述】:
假设有一个名为Animal 的类接收包含动物属性(type、color、size)的请求,然后将其序列化并存储在数据库中。随着时间的推移,动物的属性会发生变化。添加了一些东西,现在我们还有location。
会有一个版本标志,可用于随时分支请求。
您将如何调整动物类以使其既能处理旧请求又能处理新请求?这有什么设计模式吗?
【问题讨论】:
标签:
oop
design-patterns
language-agnostic
backwards-compatibility
ooad
【解决方案1】:
我认为您不需要特定的设计模式来实现这一点。您可以尝试以下两种方法并评估哪一种更适合您的情况:
- 用额外的参数位置重载当前请求方法,如
Animal::Request(type,color,size,location),这样你的类就可以同时处理这两个。更多关于重载here。
- 例如,为您现有的 Request 方法添加一个默认位置参数,并让它将旧的
type,color,size 调用视为 type,color,size,'' 调用。更多关于默认参数here。
【解决方案2】:
有时您无法使某些东西向后兼容,这取决于您的域逻辑(规则)。
如果像“位置”这样的新属性有一些默认值并且您对此感到满意,那么您可以处理旧请求,但如果您的应用程序需要该值才能正常工作,那么旧请求将无效。