lunes, 26 de agosto de 2013

Lo que el documento esconde

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:
  1. 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.
  2. 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