设计代码以避免在维护期间重写

时间:2015-05-25 15:35:30

标签: haskell lens

我有基于lens的代码,需要某种数据结构:

makeLenses ''Pool
...
pool ^. objects ^? _head :: Maybe Object

此代码假定:

objects ::
  Functor f =>
  ([Object] -> f [Object]) -> Pool -> f Pool

但我想向结构中引入新信息,新镜头将成为:

objects ::
  Functor f =>
  ([DebugInfo Object] -> f [DebugInfo Object]) -> Pool -> f Pool

我的目标是避免对现有代码进行任何更改,就好像它是维护中的复杂项目一样。

由于我使用lens库,我认为应该可以提供一个提供“backported”objects镜头的新模块,这样我就不需要更改旧代码了(除了导入之外)

这种看似合理的方法吗?某处潜伏着某种限制吗?我们会想到类型类或模块系统。我还怀疑我可能遇到旧代码无法“重建”新结构的问题。我需要行类型多态来做到这一点吗?

最后,如果可以这样做,我应该如何构建我的模块以保持适当的分离?

1 个答案:

答案 0 :(得分:1)

我不确定为什么你需要修改MainActivity函数而不是创建一个新函数。但是,对于您的上一个问题:旧代码重构新结构,标准方法是使用默认值并使用此值构建任何新值并对其进行修改,例如

onActivtyResult()

这样,当您向objects添加新字段时,您只需要升级data Foo = Foo { foo :: String, bar :: Int } fooDef = Foo "" 0 newFoo :: String -> Int -> Foo newFoo f b= fooDef { foo = f, bar = b } 。但是,最好不要使用它,并在它破坏时手动更新代码。这就是你毕竟使用静态打字的原因,不是吗?