Softwaredesign: Datenmodell |
1module ProjektTagebuch
2where
3
4import Prelude hiding (lookup, map)
5import qualified Prelude as P
6
7import Data.Map
8
9type ProjektTagebuch = ( ProjektBeschr, ArbeitsGebiete )
10
11data ProjektBeschr = Pb { pTitel :: Text
12 , pStart :: Datum
13 , pEnde :: Datum
14 , pTeiln :: Personen
15 , pAufwand :: Stunden
16 }
17 deriving (Show, Eq)
18
19type ArbeitsGebiete = Map Name ArbeitsGebiet
20
21type ArbeitsGebiet = ( ArbeitsBeschr, ArbeitsPakete )
22
23data ArbeitsBeschr = Ab { aBeschr :: Text
24 , aDauer :: Stunden
25 }
26 deriving (Show, Eq)
27
28type ArbeitsPakete = Map Name ArbeitsPaket
29
30type ArbeitsPaket = ( ArbeitsBeschr, ArbeitsSchritte )
31
32type ArbeitsSchritte = [ ArbeitsSchritt ]
33
34data ArbeitsSchritt = As { wann :: Datum
35 , wer :: Person
36 , dauer :: Stunden
37 , beschr :: Text
38 , fertig :: Prozent
39 }
40 deriving (Show, Eq)
41
42type Personen = Map Person Name
43
44
45-- Aliasnamen
46
47type Person = String
48type Name = String
49type Text = String
50type Datum = String
51type Stunden = Float
52type Prozent = Int
53
54
55-- ----------------------------------------
56--
57-- einige typische Funktionen
58
59alleArbeitsGebiete :: ProjektTagebuch -> [Name]
60alleArbeitsGebiete (b, gebiete)
61 = keys gebiete
62
63alleArbeitsPakete :: ProjektTagebuch -> [Name]
64alleArbeitsPakete (n, gebiete)
65 = foldWithKey names [] gebiete
66 where
67 names :: Name -> ArbeitsGebiet -> [Name] -> [Name]
68 names n (_, pakete) acc
69 = P.map ((n ++ ".")++) (keys pakete) ++ acc
70
71gesamtAufwand :: ProjektTagebuch -> Stunden
72gesamtAufwand (b, gebiete)
73 = fold add 0 gebiete
74 where
75 add gebiet acc = aufwandGebiet gebiet + acc
76
77aufwandGebiet :: ArbeitsGebiet -> Stunden
78aufwandGebiet (_, pakete)
79 = fold add 0 pakete
80 where
81 add paket acc = aufwandPaket paket + acc
82
83aufwandPaket :: ArbeitsPaket -> Stunden
84aufwandPaket (_, schritte)
85 = ( sum . P.map dauer ) schritte
86
87-- ----------------------------------------
88
89geschGesamtAufwand :: ProjektTagebuch -> Stunden
90geschGesamtAufwand (b, gebiete)
91 = fold add 0 gebiete
92 where
93 add gebiet acc = geschAufwandGebiet gebiet + acc
94
95geschAufwandGebiet :: ArbeitsGebiet -> Stunden
96geschAufwandGebiet (_, pakete)
97 = fold add 0 pakete
98 where
99 add paket acc = geschAufwandPaket paket + acc
100
101geschAufwandPaket :: ArbeitsPaket -> Stunden
102geschAufwandPaket (beschr, _)
103 = aDauer beschr
104
105-- ----------------------------------------
106--
107-- ein Beispiel-Projekt-Tagebuch
108
109pt1 :: ProjektTagebuch
110pt1 =
111 ( Pb { pTitel = "Software-Praktikum"
112 , pStart = "2004-04-05"
113 , pEnde = "2004-07-10"
114 , pTeiln = fromList [ ("si", "Uwe Schmidt")
115 , ("bek", "Daniel Bekowies")
116 ]
117 , pAufwand = 24.0 * 1.25
118 }
119 , fromList [("g1", ag1), ("g2", ag2), ("g3", ag3)]
120 )
121
122ag1, ag2, ag3 :: ArbeitsGebiet
123
124ag1 = ( Ab "Organisation am Anfang des Semesters" 8.0
125 , fromList [ ("p1", ap1), ("p2", ap2)]
126 )
127ag2 = ( Ab "Web-Fotoalbum" 3.0, fromList [("p3", ap3)] )
128ag3 = ( Ab "Funktionale Bilder" 2.0, empty )
129
130
131ap1, ap2, ap3 :: ArbeitsPaket
132
133ap1 = ( Ab "Themenvergabe" 2.5, [as11, as12] )
134ap2 = ( Ab "Gruppeneinteilung" 3.5, [as21, as22] )
135ap3 = ( Ab "Aufgabenbeschreibung" 2.0, [] )
136
137
138as11, as12, as21, as22 :: ArbeitsSchritt
139
140as11 = As "2004-04-07" "si" 1.25 "Themenvergabe" 20
141as12 = As "2004-04-07" "bek" 1.25 "Themenvergabe" 40
142as21 = As "2004-04-11" "si" 2.00 "Gruppeneinteilung" 60
143as22 = As "2004-04-12" "bek" 1.00 "CVS" 80
144
145-- ----------------------------------------
146--
147-- einige Anfragen
148
149af1, af2 :: Stunden
150
151af1 = gesamtAufwand pt1
152af2 = geschGesamtAufwand pt1
153af3 = alleArbeitsGebiete pt1
154af4 = alleArbeitsPakete pt1
155
156-- ----------------------------------------
|
Letzte Änderung: 11.07.2012 | © Prof. Dr. Uwe Schmidt |