Classe Projecte

Disseny de la classe Projecte

Volem representar un projecte, compost de diferents tasques. A tal fi, al fitxer tasques.py disposeu de la implementació de la classe Tasca, que representa una feina a fer, especificada tot seguit:

class tasques.Tasca(descr, durada)

Construeix una tasca amb el nom i la durada donats.

Atributs públics

descr

Descripció de la la tasca (string)

durada

Durada de la tasca (instància de la classe datetime.timedelta)

A més a més, la classe Tasca disposa de l’operació str, que permet transformar-la en un string mostrant-ne la descripció i la durada.

Es demana que, al mòdul projectes (fitxer projectes.py), hi implementeu la classe Projecte, seguint la seva especificació:

class projectes.Projecte(nom)

Construeix un projecte amb el nom donat, inicialment sense cap tasca.

Atributs públics

nom

Nom del projecte (string)

Mètodes

afegir(t)

Afegeix una nova tasca t, que ha de ser una instància de la classe Tasca, com a darrera tasca a realitzar del projecte (la de menor prioritat).

duracio()

Retorna la duració del projecte, calculada a partir de les durades de totes les tasques implicades. El valor retornat ha de ser un objecte de la classe datetime.timedelta.

Operacions

Operació

Resultat

len(proj)

Retorna el nombre de tasques del projecte proj

proj[i]

Retorna la tasca (instància de la classe Tasca) i-èssima del projecte proj. El valor i ha de satisfer 0 <= i < len(proj)

Implementació

A més dels atributs públics, la classe Projecte ha de tenir un atribut privat on s’emmagatzemin les tasques. Com que les tasques s’afegeixen sempre al final, el més còmode és que aquest atribut sigui una llista d’instàncies de Tasca.

Exemple de funcionament de la classe:

>>> import datetime
>>> import tasques
>>> import projectes

>>> t1 = tasques.Tasca('Refer cablejat elèctric', datetime.timedelta(hours=6, minutes=15))
>>> t2 = tasques.Tasca('Pintar habitació', datetime.timedelta(hours=9))
>>> t3 = tasques.Tasca('Col·locar interruptors', datetime.timedelta(hours=1))
>>> p = projectes.Projecte('Reforma habitació')
>>> p.nom
'Reforma habitació'
>>> len(p)
0
>>> p.afegir(t1)
>>> p.afegir(t2)
>>> p.afegir(t3)
>>> len(p)
3
>>> print(p[0])
Refer cablejat elèctric - 6:15:00
>>> print(p[1])
Pintar habitació - 9:00:00
>>> print(p[2])
Col·locar interruptors - 1:00:00
>>> print(p.duracio())
16:15:00

Disposeu dels jocs de proves al fitxer test-projectes.txt.

La classe ProjecteFixat

Al mòdul projectesf (fitxer projectesf.py) implementeu-hi la classe ProjecteFixat, que es deriva per herència de la classe Projecte i representa un projecte fixat en una data concreta.

L’especificació de la classe ProjecteFixat és la següent:

class projectesf.ProjecteFixat(nom, data)

Construeix un projecte amb el nom i la data d’inici donats, inicialment sense cap tasca. La data ha de ser una instància de la classe datetime.date.

Atributs públics

Els que s’hereten més un d’addicional:

data_inici

Data d’inici del projecte (instància de la classe datetime.date).

Mètodes

Els que s’hereten més un d’addicional:

data_final()

Retorna la data de finalització del projecte, calculada a partir de la seva data d’inici i la duració del projecte. Cal tenir en compte que la jornada laboral és de 8 hores. Per simplificar, suposarem que tots els dies són feiners (es treballa de dilluns fins a diumenge).

Operacions

A part de les que s’hereten, cap d’addicional.

Exemple de funcionament de la classe:

>>> import datetime
>>> import tasques
>>> import projectesf

>>> t1 = tasques.Tasca('Refer cablejat elèctric', datetime.timedelta(hours=10, minutes=15))
>>> t2 = tasques.Tasca('Pintar habitació', datetime.timedelta(hours=9))
>>> t3 = tasques.Tasca('Col·locar interruptors', datetime.timedelta(minutes=45))
>>> d = datetime.date(2020, 7, 14)
>>> p = projectesf.ProjecteFixat('Reforma habitació', d)
>>> p.nom
'Reforma habitació'
>>> p.data_inici
datetime.date(2020, 7, 14)
>>> len(p)
0
>>> p.data_final() == p.data_inici
True
>>> p.afegir(t1)
>>> p.afegir(t2)
>>> p.afegir(t3)
>>> len(p)
3

>>> print(p[0])
Refer cablejat elèctric - 10:15:00
>>> print(p[1])
Pintar habitació - 9:00:00
>>> print(p[2])
Col·locar interruptors - 0:45:00
>>> print(p.duracio())
20:00:00
>>> p.data_final() # 20 hores de treball efectiu són dues jornades i mitja
datetime.date(2020, 7, 16)

Disposeu dels jocs de proves al fitxer test-projectesf.txt.

Nota

Disposeu d’una solució de l’exercici als fitxers projectes.py i projectesf.py.