我在这个问题中使用了 Scala,但我也可以用 Java 或任何其他语言来回答。
<小时/>我可以通过以下方式公开服务:
def doSomethingOnUser(user: User): Result
问题是:也许在实现中不需要加载完整的用户,只需使用 userId 就足够了,因此客户端可能不必提供完整的用户并避免不必要的数据库调用。
def doSomethingOnUser(userId: String): Result
问题是:可能界面客户端由于某种原因已经加载了完整的用户,然后使用 doSomethingOnUser(loadedUser.getId()) 调用此方法
因此,在服务实现中,我们现在只有 userId,同时可能需要加载完整的对象:这将导致在客户端和服务实现上加载对象。
这两种可能性似乎都有缺点。一个简单的解决方案可能是公开这两种方法,以便根据上下文和已加载的数据,您可以使用其中之一。
<小时/>在您添加许多方法属性之前,这可以正常工作。
您最终可以得到一个服务接口(interface):
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 所说:它使用起来并不优雅,因此任何更合适的数据结构都会受到欢迎(例如,如果没有像客户端那样提供完全加载的对象,则从数据库中延迟获取对象?)
最佳答案
如果您无法在实现上强制执行某些操作,请将其保留在接口(interface)之外(因此,请使用 userId)。对我来说,doSomethingOnUser(loadedUser.getId())
比
def sendDocumentToUser(document: Either[Document,String],
user: Either[User,String]): Result
您有义务接口(interface)和实现的每个客户端实时调用您的方法
sendDocumentToUser(Right("doc"), Left(user))
这是难以阅读的困惑,请不要。
将您的界面定义为
def sendDocumentToUser(document: String, user: String): Result
如果实现需要使用已加载的文档和用户,他们可能会定义自己的重载,并退回到库存sendDocumentToUser
。
class SomeImplementation extends YourInterface {
def sendDocumentToUser(document: Document, user: User) = {
this.sendDocumentToUser(document.getId, user.getId)
}
// ....
}
如果您确实不希望用户编写 .getId
,请定义两个隐式方法 User => String
和 Document => String
code>,尽管我不会这样做。
关于java - 在服务接口(interface)上,公开 doSomethingOnUser(user : User) or doSomethingOnUser(userId: String),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16772672/