我刚刚开始学习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/