【发布时间】:2014-03-25 20:27:24
【问题描述】:
这是一个一般模式/最佳实践问题。我使用的是 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 属性来解决这个问题,并发出信号表明应该记录/伪造服务调用,该怎么办?
从纯粹的角度来看,除了可测试性之外,第二种方法有什么“错误”吗?实际上,我正在讨论是否要在我正在开发的几个库中执行此操作,而我的主要危险信号是第一种方法似乎更常见。
【问题讨论】:
标签: c# java design-patterns builder fluent