UML and Classen example

I’m translating this:

UML

Antes de ponernos con el ejemplo voy a explicar muy rápido lo que es UML. Es cómo se diseñan los programas e indica que clases hay, como son, y como se relacionan las clases entre sí, indicando si una clase es abstracta, que clases son las hijas, si una función necesita crear un objeto de otra clase, o si en vez de una variable en una clase tenemos un objeto de otra clase … (recuerda que el objetivo de una clase es encapsular información. Si quisieramos hacer una clase DNI, esa clase tendría un objeto de la clase Persona que encapsula los datos de esa persona, luego la clase DNI incluirá la fecha de expedición y mas cosas propias del DNI, pero no de la persona porque se eso de encarga la otra clase).

Aquí puedes ver todos los ejemplos que hemos hecho hasta ahora.

A la izquierda tienes la definición normal de una clase con ejemplos de cómo poner las variables y las funciones. Solo veo aclarar que aquí el tipo de la función o de la clase se pone al final mientras que en el código va antes.

Luego en vehículo tenemos el ejemplo de polimorfismo que hemos puesto. Fijate que las funciones abstractas se escriben inclinadas. Que una clase hereda de otra se especifica con esa flecha.

Finalmente a la derecha esta el ejemplo de la persona con el DNI. Como el DNI contiene una Persona, se llama composición y se especifica con el simbolo de la linea con el rombo negro.

Para empezar esta bien con esto. Hay más cosas que saber (como cuando una clase solo necesita a otra para una sola función y no esta compuesta por ella [es igual que la composición, pero el rombo esta en blanco]).

Lo que falta lo veremos más adelante en el ejemplo.

Ejemplo:

Vamos a realizar el siguiente programita:

En este programa nos basamos en el ejemplo anterior de los vehículos. Creamos una clase principal (llamada aplicación), que tendrá objetos de la clase Persona (Los numeros sobre la linea significan que cada objeto de la clase persona pertenecen solo a 1 aplicación, y que una aplicación puede tener de 0 a muchas personas)

La clase Persona es abstracta, y las clases cartero y panadero heredan de ella (son una especialización de Persona). Las funciones que se llaman igual que la clase se llaman constructores y se usan para dar los valores iniciales a la clase.

Vamos a añadir una función mostrarDatos() que devuelve los valores de la persona como un texto (lo que hicimos en el capitulo anterior en la función main() ). Y esta vez vamos a hacer algo un poco distinto: Al calcular la edad vamos a coger la fecha actual en el ordenador. Para ello, usaremos una función que incorpora Java que nos permite recibir la fecha, y esa fecha convertirla en un numero.

Vamos a ello. Para empezar, mostramos la clase Persona:

//Mostrar clase Persona acabada

De este código solo hay dos cosas que quizás no entiendas:

1_ Las funciones abstractas tienen que llevar el texto abstract al inicio. Y al haber una función abstracta la clase es abstracta: No se pueden crear objetos de esta clase directamente, si no objetos hijos.

2_ Al coger el año del orenador usamos la clase „Calendar“ de Java. Para ello se pone en la parte de arriba del todo „import Java.util.Calendar“. Luego se usa de la forma que se muestra: Se coge una instancia de la clase (Eso es porque es un Singelton. No te preocupes, es un patrón de diseño que veremos en el siguiente capítulo). Cuando tenemos la instancia, llamamos a la función get, que nos devolverá un valor. Le decimos que el valor que queremos es el año.

El código del calendario se puede mostrar así para hacerlo más fácil de leer:

Calendar cal = Calendar.getInstance();

int anyo = cal.get(Calendar.YEAR);

Ahora veamos las clases hijas:

// Codigo clase Panadero

//Codigo clase Cartero

Como estas clases heredan de Persona, se pone al principio que „extienden“ esta clase. Para específicar la función trabajar hay que poner antes el „@Override“ para indicar al programa que es la misma función que hay en Persona, pero que la estas modificando. Esto se hace también si quieres modificar en la clase actual alguna función de la clase padre.

Cuando en estas clases se usa „super“ se llama a la clase padre. En este caso se usa en los constructores para pasarle los datos iniciales, y para llamar a la función coger datos. Una persona te da los datos, que luego los usa el carpintero o el panadero para decirte su profesión.

Finalmente vamos a escribir la clase principal. Creamos una función que le dice a la persona que trabaje (para que nos diga que oficio tiene y sus datos), y luego en la función main creamos un panadero y un cartero. Como queremos cambiar de uno a otro sin problemas para usar los beneficios del polimorfismo, usamos la clase Persona para crearlos.

En total, tiene que quedar así:

En println estamos usando un texto raro. El „\n“… ¿Que significa? Que añadimos manualmente un salto de linea mas. Con esto hacemos el resultado más fácil de leer. Así. El texto del final con este ejemplo debe ser:
run:

Creamos la primera persona y la mostramos

Nombre: Pepe. Telefono: 1. Año de nacimiento: 1986. Edad: 29

Soy carpintero y corto madera

Creamos la segunda persona

Nombre: Jorge. Telefono: 2. Año de nacimiento: 1991. Edad: 24

Soy panadero y hago pan

BUILD SUCCESSFUL (total time: 0 seconds)

Classes, Inheritance and polymorphism

I’m translating this:

Clases, herencia y polimorfismo

Ahora que ya sabes las bases de programación, vamos a ver un paso más avanzado. Primero vamos a aclarar los conceptos de clase, herencia y polimorfismo. Luego, veremos UML para explicar el ejemplo que vamos a hacer (UML es una forma de representar mediante gráficos un conjunto de clases y su relacción entre ellas), y finalmente haremos el ejemplo.

Clases:

Como dijimos en el capitulo anterior, una clase es una colección de variables y funciones que indica como serán los objetos que se hagan de ella. Sería un molde de repostería del que sacamos los distintos objetos-pasteles. El ejemplo sería que tenemos la clase persona, que se compone de las variables fecha de nacimiento, telefono y nombre, y la función de calcular la edad. Y de esa clase podremos hacer varios objetos. Por ejemplo:

  1. Nombre= PericoFecha nacimiento = 1991

    Telefono = 11111111

  2. Nombre= FulanoFecha nacimiento = 1977

    Telefono = 2222222

  3. Nombre= FulanoFecha nacimiento = 1977

    Telefono = 2222222

¿Los dos objetos del final son iguales? No, tienen el mismo valor, pero están alojados en distintos puntos de la memoria y se tratan como dos objetos diferentes. Es como si tienes una variable numerica llamada X con el valor 5 y otra variable numérica llamada Y con el valor 5. No son la misma variable, pero tienen el mismo valor.

El objetivo de las clases es agrupar variables y funciones en grupos lógicos (como la citada persona) pero también encapsular esa información. Por ejemplo, imagina que tenemos otra clase llamada DNI. Esa clase puede tener las mismas variables y funciones que una persona. Entonces… ¿Para que hacer la clase persona? Pues porque así en vez de tener en la clase DNI las variables de la persona y las variables del dni (como material de fabricación, fecha de expedición, tamaño…), puede tener un objeto de la clase persona y luego el resto de variables propias del DNI, y si la clase persona tiene datos que son privados, la clase DNI no podrá acceder a ellos. Los datos de la persona estan encapsulados en su clase. Y el código final es más fácil de leer al reducir la función de calcular la edad, nombre, telefono y fecha de nacimiento a solo crear un objeto y llamar a las partes necesarias. Esto último lo verás en el ejemplo al final.

Herencia:

Una vez que tienes una clase lista y terminada, y tienes que crear una nueva clase que comparte muchas cosas en común, es posible crear una clase con las cosas que tienen ambas clases en común y hacer que estas dos clases hereden de la clase „padre“ (la que tiene las cosas en común) y en las clases „hijas“ se pondrán las cosas específicas de cada una.

Un ejemplo típico es decir que tenemos la clase “Coche“, con su depósito, puertas, tamaño, etc… ¿Que pasa si queremos hacer la clase „Motocicleta“? Para empezar no tiene puertas…

La solución es crear una clase padre que podríamos llamar „vehiculo“, que tiene las variables comunes como el depósito, el tamaño, etc. De esa clase heredarán las clases „Coche“ (que añade la variable numero de puertas y maletero) y la clase „Motocicleta“ que añade cilindrada y tipo de carnet.

Polimorfismo:

El polimorfismo es un paso más allá de la herencia. Quiere decir que si creamos un objeto del tipo vehiculo, podemos asignarle un coche o una moto. Por desgracia, el ejemplo pasado no nos sirve sin mas, hace falta hacer un par de cambios:

  • La clase padre tiene que ser abstracta. Esto quiere decir que por lo menos una función no tiene nada de código dentro. Luego lo vemos en el ejemplo.
  • Las clases hijas son las que se encargarán de darle el código.

Para que pueda funcionar, vamos a añadir una función a la clase vehiculo llamada „avanzar“. Esta función será abstracta. No tiene código dentro y se declararía asi:

public abstract void avanzar();

Recuerda del capítulo anterior: Esta función sería publica, se puede llamar. No es estática como la del capítulo anterior, por lo que hace falta crear un objeto de una clase hija (las clases abstractas no pueden tener objetos) para acceder a la función. Indicamos que es abstracta con „abstract“, la función se llama „avanzar“, y como no tenemos código ponemos el punto y coma al final.

Luego las clases hijas tendrían por ejemplo en la moto:

@override

public void avanzar(){

System.out.println(„giro el puño de aceleración“);

}

Mientas en el coche tendría:

@override

public void avanzar(){

System.out.println(„piso el pedal de aceleración“);

}

El @override indica al programa que estas reescribiendo una función de la clase padre. Esto se puede hacer también en herencia.

Finalmente, cuando vaya a usar uno u otro, pondré en la función main algo como:

vehiculo veh = new moto();

veh.avanzar();

veh = new coche();

veh.avanzar();

Vaya, aquí es la primera vez que hemos creado un objeto y no te he hablado todavía de los constructores de objeto. Eso lo explico en el ejemplo más adelante. Con esto te digo que el resultado es:

giro el puño de aceleración

piso el pedal de aceleración

Has creado un solo objeto, que has hecho que sea una moto, y luego un coche, y usando la misma función tiene resultados distintos. Esto es bueno para mantener el código, dar una jerarquía mejor, y dar un patrón de comportamiento a las clases hijas (porque si solo hubiera herencia, al ser funciones que hacen distintas cosas no las veríamos como algo común para la clase padre, y podrían llamarse de forma distinta y no se podría automatizar el avanzar independientemente de si es un coche o una moto)

Your first program

Today we are going to see the most complex and biggest post in all the course (I hope, because I need a lot of time to writhe these) because I introdouce a lot of new concepts in one big pill. These concepts will follow us along all the course, so if there is something that you don’t understand, maybe in the next post all will be clear (or you can comment). And at the same time, if you dont understand the base of something in other post, come back here.

First steps:

Before coding, we will create the project. To do that open your editor of choice (I like Netbeans, but you can use the one fits you better) and click the button to create a new project. This will automatically create and manage the folders and files for your program.

In Netbeans you’ll have to choose a category. Choose „Java“→ „Java Application“. Press „next“ and give a name to the project (like „Proba“, „Test“, „ProgrammingCourse01“…).

You are ready to go.

Usually you will see a main class template. I will explain the basics here:

  • Java is an Object Oriented Language. What you write are „classes“ which contains variables and functions. Later, we will create objects from these classes. For example: We can have a class called “Person” with the variables “Name”, “Birth year” and “Telephone” and a function to calculate the age (we will see this later in an example). Then you create two objects of the class Person. One object has in the variable “Name” the value “John Doe”, the other one has in the same variable the value “Janina Dina”. A class is the mould, and the objects are the cakes that you do there.

  • Inside your program there is a special function: The main function. When a program starts, it begins here. When the main function ends, the program ends.

This can seem a little confusing right now, so before we start, I will explain some concepts that appeared there:

  • Variable: Its an information unit. The program takes a little memory space to storage a number, a text, etc. For the Person class from the previous example, “Birth date” and “Telephone” would be numbers and “Name” would be text.

  • Sentence: A single command (well, not really, it can have several of them, but to simplify it’s ok). This command can be some lines of text long, but it always ends in “;”. Creating a variable is a sentence. Giving to that variable a value is another sentence. Checking a variable and doing something about that is another sentence… We will cover all this in other posts.

  • Functions: When a program is long enough, you will see that some sentences are repeated a lot of times with just a few differences between repetition. To simplify the code, make it easier to read and easier to manage we create functions as a group of sentences with a specific purpose. We can see it as a machine where you introduce a pair of values and the machine generates an output, some result . For example, in the previous class Person there was a function to calculate the current age of the person. We give the function the birth year of the person, the current year and it will give us how many years old is that person. We can create some variables inside the function that will be used only there, and not outside.

We write code

With all that said, we start with the program. Write (WRITE, don’t copy-paste it or it will be harder to learn) this inside the Main function.

The main function should look like this:

Now, if you press the button that looks like a “play”, it will execute your programm and you will see:

Name: John Doe. Birth year: 86. Telephone: 666666666
BUILD SUCCESSFUL (total time: 0 seconds)

Lets analyze what have we done

As we said, the program starts at the main function. And there with the first sentence:


Sentence 1

String name = "John Doe";

Here we create a text variable (The “String” before the name), called “name”, and we give it the value “John Doe” (all the text values are between “”) Check this patron: [Data type] [Variable name] = [initial value]. It’s used in all the variables.

Try to change the value. Instead of “John Doe” write “Pepe”. If you forget the “” the program wont start. If done correctly you will see this text:

Name: Pepe. Birth year: 86. Telephone: 666666666


Sentence 2

int birthYear = 86;

This creates a number variable [int → Integer]. If you want to use a decimal number you must use other data type, like “float” (not a lot of decimals but enough to almost everything) or “double” (double precision float, for scientific purposes). Check that the name hasn’t any space. Thats because the variable names are converted by the program to computer language and if the name has two or more words with space, it will recognize only the first. The second will give an error. Therefore we write a very large word, and to make it easier to read we write the first letter from every word as a capital letter.

Try to write “1976” instead of 86.


Sentence 3

int telephone = 666666666;

The same as the previous one.


Sentence 4

This sentence is special: It is 2 lines long (and could have more) but it has only one “;”, therefore it is only one sentence.

Here we call a special class from Java (System.out) which helps us to write text output. It has a lot of functions to do that, like “print” or “println”. The difference is that the text that it writes with println is in another line, but with print we have to manage the lines manually.

Inside this “()” is the value that we give to the function. This function, this machine, needs only one value of the text type to work. All the text is inside the quotation marks. With the “+” we “paste” one text after another, and with the variable name we read the value stored in the variable. Therefore we send only a big text, made from little text followed with the text stored in the variables.

Try to change something.

We upgrade the program and add a function

We will create the function that we said in the first examples to calculate the age of the person.

Remember: A function is a machine where we introduce some values and we receive another value (or not and the function is only to pack some sentences to make the code easier to read)

So we write this:

Lets see the first line:

  • The first word is to say if the function is public or private. If it’s public, when we create an object we can call this function like we did to “println()”. If it’s private, we wont be able to see it outside this class and it will be used to hide complexity for the outside, so there will be harder to make a mistake.

  • The second word, Static, is used here because we are in the same class as main() and the function will be used inside of main. If that is not the case we dont need to use it. Something static means that you don’t need to create an object to use the function, like (again) “println()”: We didn’t created an out object, we just called the class and his function.

  • “int” tells us that the function will give an Integer. If we want to receive a text, it will be “String”. If it don’t return anything, we use “void”.

  • GetAge is the function’s name. When I want to call this function, I will write this name.

  • (int birth, int currentYear) :Thats the values that we give to the function.

Then comes the function’s content:

  • We create an int variable, called Age, and we give it an initial value of 0.

  • We give to Age the value of substract to currentYear the value of birth. This won’t modify the value of currentYear or the value of birth, it will only read the data, calculate the answer and give the new value to Age, that it’s the only one to be modified. Try to add a “*2” at the end to multiply by 2… Which value? (Answer: Only the one near the “*”. This takes mathematics rules. If you want to multiply the answer you have to substract first and then multiply, and you can do that making the substraction inside the brackets “()”).

  • With return we say to the function what value give as result. In this case we will return Age.

Ok. Its ready to work… almost. It’s not optimizied. This is important. When we optimize the program it will run faster. In this little program it’s not the case, but we will optimize it at the end to learn something about it.

Now we add the function to the main function. Write this in main:

Now we are calling to the function getAge() inside the function println() inside of the function main(). That’s abstraction. What we are doing is adding to the text the value returned by the function. It’s an int, like the telephone, so it works the same as using a variable directly. We can give the values to the function using a variable, like birthYear, or a direct value like “2015”. Remember that this won’t modify the value inside birthYear, it will only read it.

Try to execute again the program. This time you will see at the end the age. Other way to make this is to create a new variable, give to this variable the value returned by the function, and then call the variable in println like the other ones. For example:

int Age = getAge(birthYear, 2020);

Optimizing the Function

At the first line we give to the variable a value, and in the second like we give to the same variable a new value. We can give the second value directly:

int Age = currentYear - birth;

Ath the last line we return the value of Age and in the previows one we give a value to Age. What if we return directly the value and we dont store it in Age?

With all this we have only one line, the program has less operations and will run faster. Like we said, this is a very little example and we wont see it, but if we make a program that checks thousands/ millions persons, and with the previous function we needed 10 minutes, maybe with this optimization we would only need 7 (its an exaggeration, but you see the point).

Conclusion:

Now you know some common datatypes (int, string, float and double. There are more like boolean, byte, and a pair more. We will cover them later ), how a program works, functions, etc.

Really you know almost everything to make little programs or simple scripts. You should try to make new functions here and see the results. For example, try to make a function to see the age in some years (tip: the first line of the function can be something like “public static int futureAge(int currentAge, int years)” ).

In our next post I will cover the classes, inheritance, polymorphism, etc.

Introduction to programming

Previous words:

In this course you will learn the basics of programming. The objective is that you can make your own programs and understand the foundations. It will be focused on Java. Why java? Because:

  • C/C++ require external libraries for almost everything that isn’t covered in the basic libraries (Maths und IO) and also you need to take care of the memory.

  • C# works only in Windows. Forget Mac or Linux (What I mean with this is: If you use a .NET library you can only compile and debug on windows, and if you aren’t using it c# is almost the same as Java. Therefore, I find better teaching Java, and when you want to use c# you will see that there are only a pair of changes and that you will use .Net and not the Java classes).

  • Visual Basic has the same .Net problem as C#.

  • Xcode/Objective C: Only for Mac and iOS.

  • Python, Ruby, Lua, Ada, Perl, PHP, Javascript… These languages are specific for a problem and no so generic as Java. I mean: Some are for scripting, other are for web solutions, other are for real-time solutions… Maybe Python is more generic, but it’s not an industry standard like Java.

  • Java: Here your software will run the same in Windows, Mac or Linux. Its generic enough to make client applications, web applications, the Android Apps are developed in Java with a few differences, and when you need an specific class, its almost always included in the SDK (except some special classes like Java3D)

Inside Java you can use the IDE you prefer (notebloc, Eclipse or whatever). But I like Netbeans because it’s the “official” and I find it more stable as Eclipse (the other great Java IDE). But my tip is: You should try both and learn how to make at least the basics in everyone because you don’t know which one will you use in a specific project, and after that you will usually use the one you find better.

You can download Java and Netbeans here:
http://www.oracle.com/technetwork/es/java/javase/downloads/index.html

If you want another, Google it.

Giving orders to machines

There are a lot of formal definitions for programming, but the simple one that I will give you is:

-The objective is to give orders to a machine/computer to make it do something

That’s everything. If you read some source code you’ll find that everything is an order after another order:

  • Do this

  • Check that

This is the simplest explanation. The computer will try to do those orders as fast as possible. And that’s what makes programs work.

Let me give you another example: In a videogame you think that you are looking some character doing something, but in reality the machine is checking what keys are you pressing, then places the character in the environment, updates that environment and the other characters based on the previous state, and then it makes a camera render everything. And it does it usually between 30-60 times pro-second.

And with this we are finished with the introduction. In the next post we will see how to make your first program, the functions, variables and other foundations.

Until then.