Acabo de empezar a aprender Scala. Me siento bastante cómodo con el diseño de OO, y menos con la programación funcional; aunque, he estado programando lo suficiente para que FP no sea completamente antinatural tampoco para mí. Desde el primer día de mi aventura en Scala, tuve esta, digamos, inquietud con la aparente dialéctica que está ocurriendo entre OO y FP. Claramente, uno puede recorrer todo el camino de una forma u otra. Mi primera tendencia fue ver las clases como una especie de paquetes que mantienen juntas las funciones que quiero pasar, que equilibra las escalas hacia el lado funcional. Siento que tiene que haber una mejor forma de equilibrar el acto. Tampoco estoy seguro de cómo proceder con ciertas situaciones familiares en este escenario. Por ejemplo, si tuviera la (artificial) de clase siguiente:Función Scala vs clase Dicotomía
class ValueGenerator {
def value() = {
"1"
}
def value(line: String) = {
line
}
}
en la programación OO yo llamaría el value
con la firma apropiada cuando lo necesitaba, para obtener el resultado que necesito. Los métodos tienen la misma firma, porque lógicamente corresponden a acciones similares. En OO, me gustaría pasar alrededor de la referencia del objeto, y los métodos que reciben un objeto ValueGenerator
haría la llamada a la derecha value
dependiendo de la situación. Por lo que puedo ver, al menos es mi tendencia, que en Scala la norma es pasar el método. Pero en este caso, aunque los métodos hacen lo mismo, no tienen la misma firma, por lo tanto no pueden sustituirse entre sí (¿o sí?). En otras palabras, ¿puede el método emisor decidir la función que se enviará independientemente de la firma de la función? Esto parece poco probable ya que el receptor no sabría cómo invocarlo. ¿Cuál es la acción correcta en una situación como esta? ¿O uno va con su instinto? ¿Hay una regla general que sigas cuando se trata de OO vs FB?
Como nota al margen, fue interesante ver que un amigo mío que también está aprendiendo a Scala tenía los mismos pensamientos (o falta de ellos) que yo sobre este tema.
Los métodos no tienen la misma firma: uno toma un argumento de tipo Cadena, el otro no tiene argumentos. De la sección 2.10.2 de la Especificación JVM: "La firma de un método consiste en el nombre del método y el número y tipo de parámetros formales (§2.10.1) del método [...]" –
Además, usted debería notar que un método es algo, una función es otra cosa. No pasa métodos, solo puede pasar funciones. Sin embargo, puede elevar un método a una función. –
Véase también http://jim-mcbeath.blogspot.com/2009/05/scala-functions-vs-methods.html –