您如何处理Haskell中的功能可见性和单元测试?
如果在模块中导出每个函数,以便单元测试可以访问它们,则可能会冒其他人调用不应在公共(public)API中使用的函数的风险。
我想到了使用{-# LANGUAGE CPP #-}
,然后用#ifdef
围绕导出:
{-# LANGUAGE CPP #-}
module SomeModule
#ifndef TESTING
( export1
, export2
)
#endif
where
有没有更好的办法?
最佳答案
通常的惯例是将模块分为公共(public)部分和私有(private)部分,即
module SomeModule.Internal where
-- ... exports all private methods
然后是公共(public)API
module SomeModule where (export1, export2)
import SomeModule.Internal
然后,您可以在测试和其他对访问内部实现至关重要的地方导入
SomeModule.Internal
。这个想法是您的库的用户永远不会意外调用私有(private)API,但是如果知道自己在做什么(调试等),他们就可以使用它。与强制隐藏私有(private)API相比,这大大提高了库的可用性。