将构建器方法与服务方法相结合 - 不好的做法?

时间:2014-03-25 20:27:24

标签: c# java design-patterns builder fluent

这是一般模式/最佳实践问题。我正在使用C#,但我认为它同样适用于Java和其他环境。对于库来说,暴露一个与更加面向服务的类有些相似的构建器类是很常见的。采用允许您执行此操作的假设ORM:

var sql = SQLBuilder.Select("*").From("Users");
var users = db.ExecQuery<User>(sql);

作为一名图书馆开发人员,很有可能将这些组合成一个更流畅,可发现的API,只有一个对象需要关注:

var users = db.Select("*").From("Users").ExecQuery<User>();

请注意,差异严格地在API表面;在引擎盖下,我们仍然有多个课程,并且正确地分离了关注点。

第二种方法的一个潜在缺点是可测试性。在第一种方法中,隐藏服务对象要容易得多。但是,如果库开发人员通过暴露某种静态TestMode属性来解决这个问题,该属性可以在应用启动或测试设置上配置,并且表明服务调用应该被记录/伪造?

从纯粹主义的角度来看,除了可测试性之外,第二种方法有什么“错误”吗?我实际上正在讨论是否要在我正在研究的几个库中执行此操作,而我的主要红旗是第一种方法似乎更常见。

2 个答案:

答案 0 :(得分:1)

我认为第二种方法很好,只要公共API类只关注提供流畅的界面并正确委派工作。

答案 1 :(得分:1)

我实际上打算为我的微观orm的下一个版本采取第二种方法。在我看来,可测性会受到影响并且现在正在考虑它,我认为它不会。因为那个流利的构建器只是一个外观,至少在最后一部分我可能会将它作为一种易于测试的扩展方法来实现