May 2025
Intermediate to advanced
424 pages
6h 12m
Chinese
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
在 Java 中,我们使用接口来指定定义某些功能的代码和需要这些功能的代码之间的契约。 这些接口将双方结合在一起,这会使我们的软件更难维护。 函数类型如何帮助解决这个问题?
如果 可以的话,请想象一下,你需要从正在编写的代码中发送电子邮件。现在只需这样做,而不需要接收邮件,也不需要列出已发送的邮件,只需启动并忘记。
描述电子邮件的代码非常简单:
dataclass(valto:EmailAddress,valfrom:EmailAddress,valsubject:String,valbody:String)
给定Email ,客户端代码希望调用最简单的函数来发送,即
funsend(:){...}
当然,当我们实现这个功能时,我们会发现要真正发送电子邮件,我们还需要各种其他信息。 不是电子邮件本身的信息,而是关于如何发送电子邮件的配置。 比如发送服务器的主机名和安全证书--所有这些你的非技术亲戚都不知道的东西,但你需要为他们的新电脑进行设置。 我们将在sendEmail 中添加三个额外参数,以代替所有这些配置:
funsendEmail(:,serverAddress:InetAddress,username:String,password:String){...}
作为客户端,事情就变得不那么方便了。 我们想要发送电子邮件的每一个地方都必须知道这个配置;我们将把它从代码库的顶层传递到底层。 通过将细节隐藏在全局变量中来解决这个问题,效果还不错,直到我们发现单元测试套件的每次运行都会发送 50 封电子邮件!一定有更好的方法来隐藏这些琐碎的细节。
面向对象语言 对这一问题有现成的解决方案--对象可以封装数据:
classEmailSender(privatevalserverAddress:InetAddress,privatevalusername:String,privatevalpassword:String){funsend(:){sendEmail(,serverAddress,username,password)}}
现在,当我们要发送电子邮件时,我们需要访问EmailSender (而不是静态函数)。一旦我们有了EmailSender ,我们调用的就不是函数,而是方法,我们不需要告诉方法所有琐碎的细节,因为它已经知道了;这些细节是它的类的字段:
// Where we know the configurationvalsender:EmailSender=EmailSender(inetAddress("smtp.travelator.com"),"username","password")// Where we send the messagefunsendThanks(){sender.send((to=parse("support@internationalrescue.org"),from=parse("support@travelator.com"),subject="Thanks for your help" ...
Read now
Unlock full access