java - 在服务接口(interface)上,公开 doSomethingOnUser(user : User) or doSomethingOnUser(userId: String)

标签 java scala haskell

我在这个问题中使用了 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 => StringDocument => String code>,尽管我不会这样做。

关于java - 在服务接口(interface)上,公开 doSomethingOnUser(user : User) or doSomethingOnUser(userId: String),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16772672/

相关文章:

java - NetBeans 声明式操作注册与节点弹出菜单

java - 在改造中处理超过 1 个响应

Scala 匹配和引用相等性检查

scala - 如何让 sbt-assembly 合并正确?

haskell - 寻找通用的 `bisect` 函数

java - 这个不必要的方法引用背后的想法是什么?

java - 如何在 springboot 应用程序中管理更新

haskell - "Non type-variable argument in the constraint"到底是什么意思?

scala - Scala 中的两个函数有什么区别?

haskell - 为什么我不能使用 IO 构造函数