我在这个问题中使用了 Scala,但我也可以用 Java 或任何其他语言回答。
我可以使用以下内容公开服务:
def doSomethingOnUser(user: User): Result
问题是:也许在实现中不需要加载完整用户,只需使用 userId 就足够了,因此客户端可能不必提供完整用户并避免不必要的数据库调用。
def doSomethingOnUser(userId: String): Result
问题是:也许接口客户端由于某种原因已经加载了一个完整的用户,然后它使用调用这个方法doSomethingOnUser(loadedUser.getId())
所以在服务实现中我们现在只有 userId 而加载完整的对象可能是必需的:这会导致加载客户端和服务实现中的对象。
这两种可能性似乎都有缺点。一个简单的解决方案可能是公开这两种方法,以便根据上下文和您已经加载的数据,您可以使用其中一种或另一种。
在您添加许多方法属性之前,这可以正常工作。
您最终可以得到一个服务接口:
def sendDocumentToUser(document: Document,user: User): Result
def sendDocumentToUser(documentId: String,user: User): Result
def sendDocumentToUser(document: Document,userId: String): Result
def sendDocumentToUser(documentId: String,userId: String): Result
我只是想知道您对这个主题的看法是什么,根据您的经验,什么最有效以获得干净的界面,客户端不必知道哪种方法最适合出于性能考虑而调用,而无需进行不必要的数据库调用。
使用 Scala 或 Haskell 之类的函数式编程语言,是否有一些可用的数据结构,以便我们可以使这些事情变得更容易?
而Java,这可能吗?
我正在考虑在 Scala 中使用类似的东西:
def sendDocumentToUser(document: Either[Document,String],user: Either[User,String]): Result
正如 om-nom-nom 所说:使用起来并不是很优雅,所以任何更合适的数据结构都会受到欢迎(例如,如果它没有像客户端那样完全加载,那么从 DB 中延迟获取对象?)