type parameter implicitly generic for comprehension scala companion-object

implicitly - type parameter scala



¿Cómo hablar de objetos acompañantes frente a objetos regulares? (8)

Estoy enseñando Scala por primera vez y mis alumnos consideran que los "juegos de palabras" deliberados que involucran objetos de compañía son muy confusos. Considere el siguiente ejemplo:

class Stack { ... methods such as push/pop } object Stack { ... factory method(s) and possibly others }

La confusión viene cuando uso frases verbales como "un objeto de pila" o "objetos de pila" o especialmente "el objeto de pila". Mis alumnos tienen dificultades para entender si me refiero al objeto singleton Stack u objetos de la clase Stack.

Estoy buscando formas alternativas de verbalizar cosas que los principiantes puedan entender más fácilmente. Siempre he considerado referirme a los objetos de la clase Stack como "Stack instances" o "instancias de Stack", pero parece una locura intentar enseñar OO a no poder llamar objetos a estas cosas. He intentado SIEMPRE usar la frase "objeto singleton" u "objeto acompañante" cuando hablo del objeto singleton Stack, pero la sintaxis de Scala me está funcionando porque solo usa la palabra "objeto".

En este caso, podría cambiar el nombre del objeto singleton StackFactory en lugar de Stack, pero eso es solo una opción para mis propias clases, no para los mil y un objetos complementarios ya integrados en Scala.

Editar:

Lo siento, no fui lo suficientemente claro en mi pregunta. La confusión principal ocurre NO cuando se refiere al objeto compañero. En ese caso, como lo han señalado varias personas, es bastante fácil utilizar una frase como "el objeto acompañante". En cambio, la confusión principal ocurre cuando se refiere a instancias ordinarias. Entonces, si digo "un objeto de pila" (que significa una instancia de pila) o "el objeto de pila" (es decir, esta instancia particular), una fracción de los alumnos pensarán que me refiero al objeto complementario, aunque no utilicé el compañero de palabra o singleton.

Y puedo ver perfectamente de dónde viene la confusión, porque la palabra "objeto" aparece en el texto del programa solo con el objeto complementario.


Creo que Stack singleton (si está solo) o Stack companion (si viene con una clase) es la mejor manera de nombrar object Stack . Scala Language Reference los llama módulos. Pero los módulos ya están demasiado asociados con las entidades en tiempo de ejecución (como en OSGI) para estar cómodos con eso.


Creo que tu solución suena bien. "El singleton Stack " denota muy claramente el hecho de que estás hablando de un objeto singleton en lugar de una clase completa de objetos. En cuanto a los nombres que trabajan en su contra, explique que el object declara un único objeto (singleton), mientras que class es una plantilla para toda una clase de objetos (instancias de clase).

Otra cosa de la que probablemente deberías asegurarte es que el object Stack no es una instancia de la class Stack . Si los estudiantes no entienden ese punto, probablemente tengan más dificultades para hacer la distinción entre la Stack única e instancias de class Stack de class Stack .

En este caso, podría cambiar el nombre del objeto singleton StackFactory en lugar de Stack, pero eso es solo una opción para mis propias clases, no para los mil y un objetos complementarios ya integrados en Scala.

Tenga en cuenta que si cambia el nombre del objeto, ya no es un objeto complementario. Las clases y sus objetos complementarios tienen permisos especiales otorgados por el compilador de Scala para acceder a los miembros privados de los demás. Si cambia el nombre del singleton para que no coincida con la clase, ya no hay ningún indicador para el compilador de que sea un objeto complementario y pierda los privilegios complementarios.


Creo que usar la frase "objeto acompañante" debería ser lo suficientemente claro.


Este problema en Scala ciertamente no deja de ser irónico, pero incluso en el espacio de Java puede haber problemas de nombres relacionados con java.lang.Object , sus instancias, su clase y las instancias de su clase.

Para Scala propongo la siguiente terminología:

  • Llamar a "instancias" de objetos instanciados
  • Llamar object del object "objetos"

Al final, diría que la idea de OO incluye objetos (en el sentido de módulos y composición) tanto como objetos (en el sentido de instancias).

Independientemente de cómo decida, la coherencia es la clave, especialmente para la enseñanza.


Si desea que un objeto singleton sea un acompañante de una clase o rasgo, debe tener el mismo nombre (y paquete y archivo fuente).

Los compañeros pueden acceder a los miembros privados de los demás, por ejemplo, una fábrica en el objeto complementario puede crear instancias de una clase (acompañante) con un constructor privado.


Si eres bueno acerca de ser consistente, también puedes referirte a las instancias de la class Stack como "instancias de pila", pero eso podría requerir un poco de retorcimiento de hábito. Aparte de eso, "el objeto compañero de pila" o "pila de objetos", nunca "el objeto de pila".


Tal vez mi propuesta es un poco ingenua, pero solo llamaría

  • clase de pila: a la clase de pila en sí (te dije que era ingenuo)

  • una pila / una instancia de pila / un objeto de pila: una instancia de la clase de pila

  • compañero de pila / apilador de pila objeto / stack singleton / stack factory (en caso de que lo utilice para ese fin): el objeto complementario de la clase de pila.

(De hecho, en la "scala de programación" de Odersky, el término más utilizado es "objeto acompañante", que creo que es bastante claro ...)

También destacaría la diferencia entre una instancia de pila y el compañero de pila, es una fuente común de confusión.

y con respecto a la confusión de sus estudiantes, entendería cuán importante es para un estudiante universitario ser cuidadoso y consistente con el uso de la terminología, también podría proporcionar algunos cuestionarios o ejercicios para diferenciar entre cada uno de estos conceptos.

A veces la terminología se aprende mejor al usarla.


Yo iría por

  • "Stack" == la clase Stack
  • "Compañero de la pila" == objeto compañero de la clase Stack
  • "A Stack" == una instancia de la clase Stack