En una clase del lenguaje de programación Ruby, se emplea un montón de vocabulario que, si no estás habituada a él, puede perderte completamente.
– Pásale un argumento.
– Llama a la función.
¿Qué significa si alguien te aconseja algo así?
Primero, os pongo un ejemplo de código.
class Post def initialize(title, extract) @title = title @extract = extract end def print_title line = "-----" puts @title, line end def validate_extract_size(limit) if @extract.size > limit puts "Extract is too long" end end end post1 = Post.new("New things I've learned", "Basic glossary") post2 = Post.new("Branches in Git", "Branches are one of the Git features") post1.print_title post2.print_title post2.validate_extract_size(15)
Si lo ejecuto en una consula, el resultado es el siguiente:
New things I’ve learned
====
Branches in Git
====
Extract is too long
Con este código, lo que estoy haciendo es:
Dentro de lo que veis en “class Post”…
- Crear la estructura de un artículo (de un blog, por ejemplo)
- Cada artículo tendrá un título y un resumen
- Tendré la posibilidad de publicar el título de cada artículo con una línea sobre el título (que funciona como separador)
- Y tendré la posibilidad de comprobar si el resumen es demasiado largo. Puedo elegir cuál es el número de caracteres que puede tener
Fuera de la clase…
- Creo un primer artículo con un título y resumen
- Creo otro de igual manera
- Imprimo los títulos de ambos
- Compruebo si el resumen del segundo ocupa más de 15 caracteres
En este programa sencillo he intentado incluir varios elementos que sirven como ejemplo de los conceptos que os decía:
Clase. Es un plano o una estructura. De cada clase, puedo crear uno o más productos. Por ejemplo, de esta clase post he creado dos posts. Ambos comparten la estructura: tendrán título y un resumen. En ellos, podemos imprimir título y comprobar el tamaño del resumen. En este ejemplo sólo hay una clase, por simplificar. En un blog, imagina, podría haber clases para los comentarios, categorías, tags, usuaria, etc.
Variable. Es un espacio donde guardas información. Por ejemplo, estoy guardando en la variable @title los títulos, en @extract los resúmenes y en line estoy guardando unos guiones. Para crearlas y guardar información pones el nombre, un signo igual y a continuación lo que quieres guardar. Puedes guardar muy variadas cosas en las variables: números, listas de cosas, una palabra, mucho texto… El caso es que siempre las guardas con un nombre. Si Ruby es un lenguaje, las variables son como los sustantivos.
Ejemplo:
line = "-----"
Instancia de clase. Son todos los productos u objetos que produces con una clase. Por ejemplo, post1 y post2 son las dos instancias de la clase “Post” que he creado. Mi blog actualmente tiene miles de instancias de la clase post 😉
Método o función. Es un bloque de código que identificarás porque siempre empieza con “def” y se cierra con “end”. Tras “def” viene el nombre del método. Si Ruby es un lenguaje, los métodos son como los verbos.
Ejemplo de función:
def print_title
line = "-----"
puts @title, line
end
Constructor. Es un método inicial, que se llama “initialize”, en el que especificas algunas variables que todas las instancia de clase de una clase van a tener. Dicho de una manera más sencilla: en este ejemplo, en el constructor, he indicado que todos los artículos que se produzcan con esta clase tendrán título y resumen.
Ejemplo:
def initialize(title, extract)
@title = title
@extract = extract
end
Ámbito. Se le suele llamar por su nombre en inglés: “scope”. Es la zona donde funcionan las cosas que has creado. Con las dos definiciones siguientes se entenderá mejor…
Variable local. Son un tipo de variables con un ámbito reducido. En este ejemplo, la variable local es “line”. Sólo va a funcionar dentro del ámbito del método print_title. No funcionaría si la intento usar en otro método de esta clase. Es como si no existiera. Reducir el ámbito de una variable sirve para reducir los conflictos. Quizá aquí en este método la línea tiene cinco guiones, pero en otro método quiero que la línea sea más larga o corta y que en lugar de guiones tenga guiones bajos.
Ejemplo:
line = "-----"
Variable de clase. Son un tipo de variables con un ámbito más amplio. En este ejemplo, las variables de clase son @title y @extract. Funcionan en toda la clase. Se crean igual que el resto de variables, pero tienes que usar una arroba en el nombre para indicar que son de clase. Como veis, las estoy usando en todos los métodos de la clase Post.
@title = title
Argumento. O parámetros. Son como los adverbios o complementos directos en el lenguaje. Aquí un argumento es limit y he escogido como límite 15. Identificarás los argumentos porque, a menudo, están entre paréntesis. Aunque no tienen por qué. También title y extract son argumentos.
Expresiones
“Crear un objeto”. Es algo que sueles olvidar al principio: que programes la clase Post no quiere decir que existan artículos en el blog. Con Post.new creo un objeto de la clase post. Tiene dos parámetros: el título (“New things I’ve learned”) y el resumen ( “Basic glossary”). Y estoy guardando este objeto en la variable post1.
Ejemplo de creación de un objeto o, mejor dicho, una instancia de clase:
post1 = Post.new("New things I've learned", "Basic glossary")
“Llamar a la función”. Cuando creas el objeto, de repente, es posible que te sorprenda que no está imprimiendo el título o comprobando el tamaño de los extractos. Esto se debe a que también debes ejecutar los métodos. Es como si tuvieras un programa en tu ordenador e hicieras clic en él. Lo estás ejecutando. Por ejemplo, sólo he llamado a la función para comprobar el tamaño del resumen del post2.
Ejemplo de llamada a función. En este caso, se lo aplicamos a una instancia de clase creada:
post1.print_title
“Pasar un argumento”. A menudo, al ejecutar o llamar a una función, se te olvida indicar el argumento. Imagina que estoy ejecutando la funcón de comprobar el tamaño del resumen del post, pero olvido indicarle el número límite de tamaño… ¡no funcionaría! Entonces, tu profe o tu compi te dirán: “¡pásale el argumento!”. Por cierto, los argumentos tienen dos partes: una manda y otra recibe. La llamada a la función está mandando 15.. Y la función validate_extract_size, entre paréntesis, lo recibe. Generalmente, si se te olvida alguna de las dos partes, el programa no funciona.
Ejemplo de función recibiendo un argumento:
def validate_extract_size(limit)
Ejemplo de una llamada a función en la que enviamos un argumento:
post2.validate_extract_size(15)
Por si os pica la curiosidad, explico casi línea a línea el código anterior:
- class Post. Crea la clase post
- def initialize(title, extract). Crea el constructor con dos parámetros: title y extract
- def print_title. Crea la función para imprimir título
- line = “—–“. Crea una variable llamada “line” y en ella guardo una línea de cinco guiones
- puts @title, line. Imprime en la consola la variable de clase “title” y la línea
- def validate_extract_size(limit). Crea una función para comprobar el tamaño del resumen. Va a recibir un argumento “limit”
- if @extract.size > limit. Si el tamaño del resumen es mayor que límite…
- puts “Extract is too long”… imprime la frase “El resumen es demasiado largo”
- post1 = Post.new(“New things I’ve learned”, “Basic glossary”). Crea la variable post 1. Creo un nuevo artículo con título y resumen y lo guardo en la variable post1
- post1.print_title. Ejecuta la función print_title del primer artículo
- post2.validate_extract_size(15). Ejecuta la función para comprobar el tamaño del resumen. Le envío como parámetro el número 15. (Recuerda que lo recibe “limit”. ¿Por qué no ponemos 15 directamente en lugar de limit? Porque así puedes reaprovechar este código y comprobar el tamaño del resumen con diferentes números en el mismo programa sin tener que variar la función, sólo repitiendo la llamada a la función con diferentes números como parámetros
Importante.- Estas son las notas de una persona aprendiendo, no enseñando. Es decir, si vienes aquí en busca de sabiduría, ten en cuenta que llevo poco programando y puedo tener errores.
Sergio Arbeo
Una pequeña corrección: lo que llamas variables de clase son variables de instancia, ya que existe por cada instancia de la clase. Las variables de clase existe una por clase, empiezan por @@ y se suele preferir otros métodos un poquillo más avanzados en vez de usarlas.
Enhorabuena. Sigue aprendiendo poco a poco, que hay mucha información que asimilar.