oop - Scala函数与类二分法

标签 oop scala functional-programming

我刚刚开始学习Scala。我对OO设计相当满意,对函数式编程则不太满意。虽然,我已经进行了足够长的编程,以至于FP对我来说也不是完全不自然的。从我的Scala冒险的第一天开始,我就对OO和FP之间明显的辩证法感到不安。显然,一个人可以一路走向另一边。我的第一个趋势是将类视为将要传递的功能保持在一起的包的一种,这平衡了向功能方面扩展的规模。我认为必须有一种更好的平衡行为的方法。我也不确定在这种情况下如何进行某些熟悉的情况。例如,如果我有以下(人工)类(class):

class ValueGenerator {
    def value() = {
        "1"
    }
    def value(line: String) = {
        line
    }
}

在OO编程中,我会在需要时调用带有适当签名的value,以获得所需的结果。这些方法具有相同的签名,因为它们在逻辑上对应于相似的 Action 。在OO中,我将传递对象引用,并且接收ValueGenerator对象的方法将根据情况对正确的value进行调用。据我所知,至少是我的趋势,在Scala中,规范是要绕过该方法的。但是在这种情况下,尽管这些方法执行相同的操作,但是它们没有相同的签名,因此不能彼此替代(或者可以吗?)。换句话说,无论函数的签名如何,sender方法都可以决定要发送的函数吗?这似乎不太可能,因为接收者不知道如何调用它。在这种情况下正确的措施是什么?还是他们的直觉本能?关于OO vs FB,您遵循的经验法则吗?

顺便说一句,很有趣的是,我的一个也在学习Scala的 friend 对我在这个问题上有确切的想法(或缺乏想法)。

最佳答案

它们没有相同的签名,通常,您希望不具有相同签名的方法具有不同的名称。重载可以使您少花钱,也要花很多钱(即,类型推断和隐式解析)。

也就是说,它们不能互相替代,因为它们的类型不相同。如果将这些方法转换为函数,则一个方法的类型为Function0[String],而另一个方法的类型为Function1[String, String]

关于oop - Scala函数与类二分法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5455195/

相关文章:

c# - 在没有数据重复的情况下转换/实例化/转换为子类/父类(super class)

xml - Jerkson 让 Scala JSON 变得如此简单,XML 也能一样吗?

scala - 如何使此Scala函数(一种 “flatMap”变体)尾部递归?

scala - 使用 pyspark 读取 csv 文件时获取格式错误记录的列名称

javascript - 原型(prototype)和 document.getElementById()

C++ 使用非常量变量模板初始化对象

C++常量如何使它们工作

ruby - 如何在 Ruby 中编写条件 lambda?

r - 应用于嵌套函数

java - 链接 Optional.orElseThrow