scala - 使用松散耦合实现新功能
问题描述
trait paymentTasks{
def calculatePayment()
def getData()
}
class paymentcalculator{
override def calculatePayment() ={
//Implementation }
}
override defGetData() ={
}
}
如何调用该方法以减少代码依赖性并且不想使用 new 关键字
class MyApp{
val payment = new paymentcalculator
//I don't want to instantiate like this wants this to be decoupled
}
请建议我如何实现这一点,也可以在不更改现有代码的情况下完成未来的新更改。此外,建议在功能上执行此操作是否会更有效
解决方案
如果您想要编译时选择,那么只需将代码放入object
trait PaymentTasks {
def calculatePayment()
def getData()
}
object PaymentCalculator extends PaymentTasks {
def calculatePayment() = ???
def getData() = ???
}
class MyApp {
val payment = PaymentCalculator.calculatePayment()
}
如果您想要运行时选择,最好的方法是使用依赖注入并在顶层创建支付对象并将其传递给需要它的代码。
object SimplePaymentCalculator extends PaymentTasks
object ComplexPaymentCalculator extends PaymentTasks
class MyApp {
def myImplementation(tasks: PaymentTasks) = {
val payment = tasks.calculatePayment()
}
val payment =
if (???) {
SimplePaymentCalculator
} else {
ComplexPaymentCalculator
}
myImplementation(payment)
}
推荐阅读
- python - 如何在 pydantic 中使用没有值的嵌套模型
- node.js - MongoDB 数据库是否容易受到恶意 npm 包的攻击?
- python - 计算均值和 SD 时出现空向量错误
- python - 无法更新模块 Base odoo 10
- python - django 迁移在更改我的 model.py 后没有对我的管理站点进行任何更改
- asp.net-core-mvc - 启动应用程序时,身份不要求应用您的迁移 - Asp.net Core 2.2
- python - 为什么我的 tkinter 标签由 .pack() 排列奇怪,我该如何解决
- c# - 为什么 ClaimsPrinciple.Identity.Name 在 Azure Function 中为 null?
- java - Kotlin 密封类类型检测的 Java 等价物
- android - 使用生成的模板在 VScode 中启动一个 android 项目