Buenos días a todos. En esta secuencia, nos pararemos
un poco sobre los métodos de clase.
Hemos visto que los métodos de clase son
métodos normales, como los demas.
En general, sirven a crear nuevas instancias
pero también pueden servir para otras cosas.
Veremos 2 ejemplos sobre para que pueden servir los métodos de clase.
Imaginemos que deseamos escribir un programa que toma
este texto como parámetro y que crea
una estructura. La idea es que si una linea empieza con
un punto de exclamación, la consideramos un titulo.
Si una linea comienza con un guion, consideramos que
es el elemento de una lista.
Si empieza por un guion o mas de un guion,
consideramos que es un subelemento de una lista.
En cualquier otro caso consideramos que se trata de un párrafo.
Deseamos escribir un programa que toma esto como entrada y
instancia las clases que veis aquí,
las subclases de document y item.
también deseamos, en esta concepción, que cada
subclase document y item sean responsables de
parsear las lineas y de decidir si ellas pueden parsear
o no una linea determinada. Si miro el método
canParse aquí, le entregamos una linea de texto.
Si esta linea empieza con un punto de exclamación, el
método canParse debe devolver verdadero porque nos
encontramos en la clase SectionTitle.
En la clase listeItem, el método can parse debe
devolver verdadero si la linea empieza con un guion, si la
linea entregada como parámetro empieza con un guion.
Y el método canParse, que se encuentra aquí, nos devolverá sistemáticamente verdadero
La idea es de escribir un algoritmo que analizara las
clases una por una, y cuando encuentre una que devuelva
canParse, utilizaremos
esta clase para construir una nueva instancia en relación a esta linea.
Este es el objetivo del método canParse y el objetivo
del método newFromLine, toma también una linea como
parámetro, una linea de texto como parámetro a menos que
devuelva una instancia de la clase en la que
acaba de ser implementada.
Si envío el mensaje newFromLine a la clase
SectionTitle con una cadena de caracteres que empieza
con un punto de exclamación, el método newFromLine
devolverá una instancia de la clase SectionTitle.
¿Entonces, como funciona?
es la clase Parse que sera responsable de realizar
este trabajo y de buscar entre las subclases de
documentItem cual sera la responsable de una
linea en particular.
La clase Parser posee un método document classes
con la misión de devolver la
lista de subclase de documentItem.
Devolverá una colección que contiene
esta clase, esta clase y esta clase.
Para poder hacer, enviamos el mensaje "allSupclasses" a "DocumentItem".
"allSup classes", es un método que existe en
el sistema Pharo, que devuelve una list de las subclases
de una clase determinada.
aquí, realizando esto, obtengo, directamente una colección
que contiene SectionTitle, listItem y Text.
Esta colección, la quiero ordenar
por prioridad. La idea es que una clase Text debe
llegar al fin porque su método canParse devuelve siempre verdadero.
La clase Text puede parsear cualquier linea.
Lo probaremos después de comprobar los otros.
Tenemos esta noción de prioridad, aquí.
Vemos que muchos métodos esta subrayados.
Si subrayo estos métodos, indica que son
métodos de clase.
Para ejecutar esto métodos, es necesario enviar mensajes a las clases.
Necesito enviar el mensaje "CanParse" a la clase
section title para saber si la clase SectionTitle puede
parsear una linea determinada.
El método parse de la clase Parser toma una linea como parámetro.
Miraremos al conjunto de subclases de
documentItem para encontrar una clase capaz de
parsear esta linea, y si es el caso, crearemos
una instancia de esta clase. El mensaje encontrado facilitara una
colección que encuentra
un elemento entre N según un predicado.
Ahora nos interesaremos a otro ejemplo de utilización
de métodos de clase.
Nos interesaremos a la lectura de parámetros de la linea de comando.
aquí la idea es de realizar un programa que en caso
de recibir unos parámetros, mirara cuales son
estos parámetros y realizara alguna cosa diferente en función de los parámetros.
El primer parámetro indica la acción a ejecutar.
Lo que haremos en la concepción e este
programa, tendremos una clase para cada tipo de acción.
La acción eval representara una clase, eval CommandLineHandler.
¿Cual es la acción realizada cuando
se presente el parámetro eval?
Lo que haremos es ejecutar este código, aquí,
interpretaremos esta cadena de caracteres como
código Pharo y devuelva el resultado de estas expresiones.
El numero que se encuentra aquí es el resultado de la expresión 10 factorial.
¿Como lo hacemos para implementar eso?
Tenemos una clase CommandLineHandler, una clase
EvaluateCommandHandler que es una subclase que tiene
como objetivo de tratar al parámetro eval.
Si el parámetro eval se envía primer
parámetro en la linea de comandos, entonces es esta clase que tiene que trabajar.
El método isResponsibleFor debe devolver verdadero en caso de
que una subclase sea capaz de interpretar la linea
de comando. Vemos, aquí abajo, exactamente el mismo
mecanismo que hemos visto en el ejemplo anterior.
Otra vez, volvemos a utilizar métodos de clase y enviamos
mensajes a clases para hacer otra cosa a crear instancias.
Hemos vistos dos posibles utilidades de los métodos de clase.
La mayor parte del tiempo los métodos de clase se utilizan
para crear nuevas instancias, pero
también se pueden utilizar en otros casos.