uqbar-project/wollok-language
View on GitHubtoString vs kindName vs printString vs className vs shortDescription
Open
#140 opened on Jun 29, 2022
help wanted
Repository metrics
- Stars
- (8 stars)
- PR merge metrics
- (PR metrics pending)
Description
Viene de acá.
Todos estos métodos están dando vuelta de alguna forma ú otra en Wollok, y todos toman un objeto y devuelven un string con alguna representación del objeto receptor
toString()
wollok-language
// class Object
/**
* String representation of Wollok object
*/
method toString() = self.kindName()
- Tiene algunas redefiniciones nativas (number, string, etc.) y otras no (collection, date).
- Se usa en lugares varios, como para calcular la cantidad de dígitos de un número o elegir qué mostrar en un doesNotUnderstand o imprimir un stack trace. También es el método por defecto para imprimir en consola

wollok-xtext y wollok-ts-cli

printString()
wollok-language
// class Object
/**
* Provides a visual representation of Wollok Object
* By default, same as toString but can be overridden
* like in String
*/
method printString() = self.toString()
- en lugares como
Stringredefine agregando dobles comillas (para que en la consola un String se vea con dobles comillas). ¡pero este mensaje no es usado por el CLI! (ver abajo problemas). - Uso: Al definir los mensajes de los asserts, y para el toString de las colecciones (WTF)
wollok-xtext

wollok-ts-cli

shortDescription()
wollok-language
// class Object
/**
* Shows a short, internal representation
*/
method shortDescription() = self.toString()
Pero en Date es nativo:
// class Date
/** String representation of a date */
override method toString() = self.shortDescription()
/**
* Shows a short, internal representation of a date
* (the result varies depending on user's locale)
*
* Example:
* new Date(day = 2, month = 4, year = 2018).shortDescription()
* ==> Answers 2/4/2018
*/
override method shortDescription() native
- Parece que se usa para mostrar el diagrama de objetos en Wollok XText (si no entendí mal)
wollok-xtext y wollok-ts
Para todos los objetos es igual que el toString, acá vemos la diferencia de implementación de natives.
kindName()
wollok-language
// class Object
/** Object description in english/spanish/... (depending on i18n configuration)
*
* Examples:
* "2".kindName() => Answers "a String"
* 2.kindName() => Answers "a Integer"
*
* @private
*/
method kindName() native
- En wollok-language está implementado como un native, y se usa para "zafar" al imprimir un does not undersand si JUSTO lo que no anda es el
toString.
wollok-xtext y wollok-ts

- En WollokTS es el fully qualified name, es diferente a Wollok XText. NicoS opina que es más claro que sea el fqn.
className()
wollok-language
- Sólo se usa para las excepciones dentro de wollok-language (para compararlas e imprimir el stack trace)
wollok-xtext y wollok-ts-cli
classNamees de hecho el único método de todos estos que es igual en ambos lenguajes host
Problemas:
- El principal problema por el que estamos haciendo esto es que al escribir
pepitaescupesrc.arch1.pepitay al escribirnew Golondrina()nos devuelvesrc.arch1.Golondrina. Nos gustaría llegar a que escupapepitatambién, yun/a Golondrina. - No se entiende la diferencia entre printString y toString, teniendo en cuenta que ningún CLI, ni el de Eclipse ni el de TS, lo usan para mostrar objetos en consola.
printStringse usa en lugares medio "pobres". - En Wollok-TS la definición nativa de
String>>toStringdifiere de WollokXText. Entonces, lo que se muestra en la pantalla al apretar "enter" si puse un string, no tiene comillas:

- Es molesto que existan métodos en el lenguaje como
kindNameoclassNameque abren la puerta a preguntar por la clase en lugar de usar polimorfismo. PERO alguno de los dos es necesario, especialmente para poder escribir en un lugar genérico cómo se imprime un stacktrace (para lo cual necesito el nombre de la clase ú objeto) o para comparar excepciones en los tests. - Hasta que no me metí en WollokXText no entendí para qué se usaba
shortDescriptiono cuál era la diferencia con los otros. - Las dos implementaciones nativas de
shortDescription(y por lo tanto detoString) hacen cosas distintas para Date, y a fin de cuentas no hay una verdadera diferencia entreshortDescriptionytoString.
Posible solución
Propongo cambiar el lenguaje (wollok-language) de la siguiente forma:
- En ese último sentido, podríamos dejar el
method toString() = self.kindName()pero podemos hacer unmethod printString() nativeque se encargue de hacer que para un WKO diga su nombre, para un objeto no nombrado diga "un Objeto", y para el resto diga "un/a NombreDeClase". - Que
printStringsea lo que se espera en consola para imprimir objetos retornados, que es el redefinible. No sé en qué lugares ameritaría además reemplazartoStringporprintString. Tunearía las documentaciones de ambos métodos para saber cuál usar y cuál redefinir en cada caso. En particular, me gusta la idea de que "toString" tenga la semántica "convertir a string" y que "printString" tenga la semántica "mostrale a une humane este objeto". - Borrar toda referencia a
className. Que en todos los lugares donde se useclassNamese reemplace porkindName. (me gusta más "kindName" para el nombre de un método que me dice tu identificador estático, porque podés no tener una clase, como en el caso de un WKO o un objeto no nombrado). - ¿Agregar quizás una validación con warning de no usar kindName? Que diga lo mismo que la de igualar por objeto: "quizás querés usar polimorfismo".
- Borrar toda referencia a
shortDescription(prefiero) o bien que la documentación deshortDescriptionagregue algo como "e.g. for small places like object diagrams" (Y que el worksheet de wollok-run-client envíe ese mensaje para mostrar su diagrama). - De hecho la implementación actual de printString de collection parece ser más adecuada para una
shortDescription, y de hecho usakindName, ojo si decidimos volarlo en lugar de className. - La forma de imprimir un Date podría usar formato ISO (YYYY-MM-DD) (cambiar el contrato de su toString) para no tener quilombos de locale.