Lo que el documento esconde
¡Bonito título! ¿Verdad? Y lo mismo sirve para un artículo sobre los METADATOS que para un post sobre Ruby.
Hasta aquí hemos visto los métodos
que nuestra clase HTMLDoc expone cara al exterior. Digamos que “lo
que ve la suegra”. Pero, como vimos en el proyecto anterior
(http://elrubymola.blogspot.com.es/2013/02/compare-compare-2-de-2.html)
las clases pueden tener también métodos privados, que sólo el
propio objeto puede invocar.
Pero eso no termina de resolver
nuestros problemas de hoy.
Os cuento: A lo largo de los anteriores
epígrafes he ido dejando no sé ya cuántos métodos “para más
adelante”. Y aún no los hemos desarrollado. Ya habrá quien diga
“este tío es un mal pagador” o “no es de fiar” o “mucho
prometer, pero...”.
Como no quiero quedar mal, y como no es
algo que cueste dinero, voy a ponerme con ello. Interesante, eso de
estudiar las “estrategias para parecer un tipo honesto”.
Vayamos al tajo y pensemos en el método
“getElement”, uno de los que tenemos que escribir aún. Recibe un
parámetro numérico y genera un objeto de tipo HTMLDoc que
representa el elemento del documento que comienza en la posición
indicada por dicho número.
Pensemos, que es gratis: El método no
debe ser público porque no aporta nada a la funcionalidad de la
clase y trata con temas de cómo representamos a nivel interno los
datos. Pero tampoco puede ser privado, porque los métodos privados
sólo pueden ser invocados por el propio objeto.
Y se trata de que un objeto HTMLDoc
pueda crear otro y modificar su contenido interno.
Ruby tiene una solución: los métodos
protegidos. Si un objeto tiene un método protegido, éste puede ser
invocado por todos los objetos de su misma clase. ¡Justo lo que
necesitábamos! Y para empezar a definir métodos protegidos basta
con poner la palabra “protected”. Todo lo que pongamos a
continuación estará “protegido”, mientras no cambiemos de modo
utilizando “public” o “private”.
Vamos a hacer dos cosas:
- Definir unos accesores a los atributos del objeto. De ese modo, cuando un objeto genere otro con “getElement”, podrá asinarle el contenido que sea pertinente.
- Definir un nuevo método que vacía el contenido de un objeto y lo marca como eliminado. Aún no nos ha hecho falta, pero ya lo utilizaremos más adelante, cuando quitemos contenido del documento.
Ahí van ambas cosas de un tirón:
protected # Parent Document/Tag may use these to create objects representing its descendants attr_accessor :type, :nodes, :starts_at, :ends_at, :document, :nodes_created # Clears data from a deleted object def clear @type = :deleted @nodes = nil @starts_at = -1 @ends_at = -2 @document.nodes_created.delete_if{|x| x.equal?(self)} @document = nil end |
Observad como el método clear elimina
el objeto de la lista de nodos creados a partir del documento
original haciendo uso de “delete_if”.
No hay comentarios:
Publicar un comentario