--- title: 4. Curs SOC UF2. Model de programació web i base de dades tags: SOC, UF2 --- # 4. Curs SOC UF2. Model de programació web i base de dades ## La classe Tasca. Començarem creant una carpeta que contingi tot el projecte: ```bash= $ mkdir flask_todo_list $ cd flask_todo_list ``` Un cop tenim creada la carpeta, generarem dues carpetes més a dins per separar la part del projecte que forma la part que enviarem al client de la part que correrà al servidor. ```bash= flask_todo_list$ mkdir client flask_todo_list$ mkdir server ``` La estructura de carpetes, normalment ve prefixada per la forma de fer de cada empresa, però en el nostre cas, per a desar el módul de la nostra classe tasca.py ho farem a ./server/src/app_todo/tasca.py, utilitzant les següents comandes: ```bash= flask_todo_list$ mkdir -p ./server/src/app_todo flask_todo_list$ touch ./server/src/app_todo/tasca.py ``` El primer pas es crear una classe buida que anomenarem Tasca dins del mòdul (fitxer) tasca.py ```python= #!/usr/bin/python3 class Tasca(): pass ``` Implementarem a dins totes les propietats que ens indica el diagrama de classes amb la excepcio de la propietat persistència, ja que encara no hem programat la classe adient. ```python= #!/usr/bin/python3 class Tasca(): """ tasca.py conté la classe Tasca que és la classe principal de la nostra aplicació. """ @property def id(self): return self._id @id.setter def id(self, valor): self._id = valor # @property # def persistencia(self): # return self._persistencia @property def titol(self): return self._titol @titol.setter def titol(self, valor): self._titol = str(valor).strip() @property def done(self): return self._done @done.setter def done(self, valor): self._done = valor def __init__(self, persistencia, titol, done=False, id=None): # assert issubclass(type(persistencia), src.app_todo.persistencia_tasca.Persistencia_tasca) # self._persistencia = persistencia """ la funció strip() treu els espais sobrants del darrera i del començament d'una cadena de text. """ self._titol = str(titol).strip() self._done = done self._id = id ``` Ara ja tenim una classe Tasca força funcional, ens permet crear objectes del tipus Tasca i cada objecte tindrà una id, un títol i un estat done que ens indicarà si la tasca està feta o no. Per a comprovar que la nostra 'tasca' es pot utilitzar, anem a crear un programa escrit en python que faci ús de la nostra nova classe: * A la mateixa carpeta on tenim el mòdul tasca.py crearem un nou fitxer al que anomenarem prova_manual_tasca.py i escriurem a dins el següent codi: ```python= #!/usr/bin/python3 import tasca def main(): tasca_1 = tasca.Tasca(None, "Tasca nova 1") # On None és persistencia i "Tasca nova 1" el nou títol. tasca_2 = tasca.Tasca(None, "Tasca nova 2") tasca_3 = tasca.Tasca(None, "Tasca nova 3") print(tasca_1) print(tasca_2) print(tasca_3) if __name__ == "__main__": main() ``` * No oblideu crear un fitxer buit anomenat \_\_init\_\_.py, aquest fitxer indica a l'intèrpret de python que la carpeta conté mòduls de codi font susceptibles de ser importats. * La sortida d'aquest script, hauria de ser semblant a: ```bash= <tasca.Tasca object at 0x7f4232a18520> <tasca.Tasca object at 0x7f4232a18790> <tasca.Tasca object at 0x7f4232a1a1d0> ``` * Que com es pot apreciar no ens proporciona la informació més útil possible sobre les nostres tasques; sabem que la informació és allà però per recuperar-la necessitem demanar per ella, així que modificarem el codi per a que s'ens imprimeixi el titol de cada tasca i si està feta o no. ```python= #!/usr/bin/python3 import tasca def main(): tasca_1 = tasca.Tasca(None, "Tasca nova 1") # On None és persistencia i "Tasca nova 1" el nou títol. tasca_2 = tasca.Tasca(None, "Tasca nova 2") tasca_3 = tasca.Tasca(None, "Tasca nova 3") print(f"{tasca_1.titol}, {tasca_1.done}") print(f"{tasca_2.titol}, {tasca_2.done}") print(f"{tasca_3.titol}, {tasca_3.done}") if __name__ == "__main__": main() ``` * Tot i que aquesta d'aquí dalt és una bona solució, també podem sobrescriure la funció __str__ de la nostra classe Tasca, de manera que sempre que demanem un print de Tasca ens mostri un json amb tota la informació necessària. * La classe Tasca ara quedaria així: ```python= #!/usr/bin/python3 import json class Tasca(): """ tasca.py conté la classe Tasca que és la classe principal de la nostra aplicació. """ @property def id(self): return self._id @id.setter def id(self, valor): self._id = valor # @property # def persistencia(self): # return self._persistencia @property def titol(self): return self._titol @titol.setter def titol(self, valor): self._titol = str(valor).strip() @property def done(self): return self._done @done.setter def done(self, valor): self._done = valor def __init__(self, persistencia, titol, done=False, id=None): # assert issubclass(type(persistencia), src.app_todo.persistencia_tasca.Persistencia_tasca) # self._persistencia = persistencia """ la funció strip() treu els espais sobrants del darrera i del començament d'una cadena de text. """ self._titol = str(titol).strip() self._done = done self._id = id def __str__(self): resultat = {'id': self._id, 'titol': self._titol, 'done': self._done} return json.dumps(resultat) ``` En aquest moment tenim la nostra classe Tasca gairabé totalment funcional.