Я только что начал изучать Scala. Я достаточно доволен дизайном OO, а тем более с функциональным программированием; хотя, я программировал достаточно долго, чтобы FP не совсем неестественна для меня. С первого дня моего приключения в Скале у меня было это, скажем так, неудобство с очевидной диалектикой, которая происходит между OO и FP. Ясно, что каждый может идти так или иначе. Моя первая тенденция заключалась в том, чтобы рассматривать классы как свои пакеты, которые объединяют функции, которые я хочу передать, что уравновешивает шкалы по функциональной стороне. Я чувствую, что должен быть лучший способ сбалансировать действие. Я также не уверен, как приступить к некоторым знакомым ситуациям в рамках этого сценария. Например, если у меня был следующий (искусственный) класс:Scala Function vs Class Dichotomy
class ValueGenerator {
def value() = {
"1"
}
def value(line: String) = {
line
}
}
в ОО программирования я бы назвал value
с соответствующей подписью, когда мне нужно, чтобы получить результат, что мне нужно. Методы имеют одинаковую подпись, поскольку они логически соответствуют аналогичным действиям. В OO я передал бы ссылку на объект, и методы, которые получают объект ValueGenerator
, сделают звонок справа value
в зависимости от ситуации. Насколько я вижу, по крайней мере, это моя тенденция, что в Скале норма должна пройти вокруг метода. Но в этом случае, хотя методы делают то же самое, у них нет одинаковой сигнатуры, поэтому они не могут быть заменены друг на друга (или они могут?). Другими словами, может ли метод отправителя решить, какую функцию нужно отправить независимо от подписи функции? Это кажется маловероятным, поскольку получатель не знает, как его вызывать. Какое правильное действие в такой ситуации. Или один идет с инстинктом кишки? Есть ли эмпирическое правило, которое вы придерживаетесь, когда дело доходит до OO vs FB?
В качестве примечания было интересно видеть, что мой друг, который также изучает Скала, имел точные мысли (или их отсутствие), как я по этому вопросу.
Методы не имеют одинаковой сигнатуры: один принимает один аргумент типа String, другой не принимает аргументов. Из раздела 2.10.2 спецификации JVM: «Подпись метода состоит из имени метода, количества и типа формальных параметров (§2.10.1) метода [...]» –
Кроме того, вы должен заметить, что метод - это что-то, функция - это что-то другое. Вы не проходите мимо методов, вы можете передавать только функции. Вы можете, однако, поднять метод в функцию. –
См. Также http://jim-mcbeath.blogspot.com/2009/05/scala-functions-vs-methods.html –