POO Introducció

De Cacauet Wiki
Salta a la navegació Salta a la cerca

Pots introduïr-te al tema amb la següent presentació:


Introducció

La Programació Orientada a Objectes (a partir d'ara POO) és un paradigma de programació que utilitza objectes. Els objectes són estructures de dades que disposen de atributs (variables internes) i mètodes (funcions internes). Restula útil per modelar el món real, però no sempre té perquè tenir una correspondència.

Algunes definicions importants:

  • Classe: definició de les propietats (atributs i mètodes) d'un tipus d'objecte. Definint una classe definim un tipus, no un objecte real.
  • Objecte/Instància: objecte real creat en temps d'execució i que ocupa un espai en memòria.

Els objectes, doncs, tenen aquestes propietats:

  • Estat: el valor dels atributs.
  • Comportament: definit pels mètodes.
  • Identitat: distingeix un objecte real dels altres objectes (instàncies). Podria ser un identificador intern però també l'adreça de memòria on està ubicat.


Un primer exemple: objectes del joc del mur

Tots conexiem el joc del mur, popularment conegut com a "Arkanoid" per una màquina recreativa arcade:

Joc mur.png

En aquest cas podriem dir que tenim, al menys, els següents objectes amb les pertinents propietats. Més endavant ja veurem com s'implementen:

  • Pilota (1 sola instància)
    • Posició
    • Velocitat
    • Tamany
  • Barca (1 sola instància, en principi ;)
    • Posició
    • Amplada i alçada
  • Totxo (moltes instàncies = mur)
    • Posició
    • Amplada i alçada
    • Color


Característiques de la POO

Llegiu aquí: http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos#Caracter.C3.ADsticas_de_la_POO

  • Abstracció: correspondència entre les propietats (atributs i mètodes) amb el objectes reals.
  • Encapsulament: agrupament de les propietats (atributs i mètodes) en un mateix nivell d'abstracció (classe).
  • Modularitat: capacitat de treballar amb subunitats funcionals independents (classes).
  • Principi d'ocultació: implementació oculta al qui utilitza l'objecte.
  • Herència: poden definir-se subclasses que hereden les propietats del pare, afegeixen de noves i poden reescriure les heredades.
  • Polimorfisme: les crides a objectes amb el mateix ancestre (pare) poden ser uniformes (mateix nom de mètode) però amb comportament diferent si els 2 objectes són de diferents subtipus (mètode sobreescrit).
  • Sobrecàrrega: podem utilitzar el mateix nom de mètode amb paràmetres diferents que resultaran en comportaments diferents. Python no ho té per la seves variables dinàmiques.
  • Agregació: objectes dins d'objectes (atributs). No confondre amb l'herència.
  • Recol·lecció de basura: destrucció automàtica d'objectes quan cap altre li fa referència. Solen implementar-ho els llenguatges de més alt nivell (Java, Python, etc.) però no els de més baix nivell (C++) ja que impacta sobre la eficiència.


Tornant a l'exemple del joc del mur

Anem a veure un exemple dels objectes fonamentals que poden aparèixer en el programa. Els podem veure en el següent diagrama UML:

Joc mur uml.png

Els objectes "pare" son els QPoint (punt) i QRect (rectangle) i pertanyen a la llibreria Qt. Ja entrarem en detalls sobre això més endavant al curs, simplement és interessant fixar-nos en què:

  • Tenen una relació amb objectes reals o conceptuals (punt, rectangle): abstracció.
  • No coneixem les seves variables internes (son privades): principi d'ocultació.
  • Podem modificar el seu estat intern mitjançant les funcions "set" (setX, setY, setWidth i setHeight).
  • Podem conèinxer l'estat intern amb les funcions x(), y(), width() i height()

Els objectes que hem implementat pel nostre cas concret (Pilota, Barca i Totxo) tenen algunes característiques addicionals:

  • Pilota és un punt (hereda de QPoint) però necessita afegir la velocitat ja que es mou. També té un tamany (el punt no tenia).
  • Totxo és un rectangle (hereda de QRect) però afegim el color amb el què serà pintat a la pantalla.



Visibilitat

Sí en Java i C++. Per atributs, mètodes i classes heredades.

No s'utilitza en Python. Es pot utilitzar el name mangling per simular-ho amb els "__" i super().


Disseny bottom-up vs top-down

Al treballar amb objectes sol ser més fàcil la modelització de processos, i facilita l'aproximació bottom-up, és a dir, el disposar d'un codi reutilitzable basat en una llibreria d'objectes estàndard que el programador pot fer servir pel seu cas concret.

La programació estructurada procedimental, en canvi, fa més ús del disseny top-down, és a dir, estableix els requeriments finals de l'aplicació i arma tota una sèrie de funcions que resolen el problema de forma eficient. En aquesta aproximació, la reutilització de codi és menys efectiva.