homeSoftwaredesign Softwaredesign: Datenmodell Prof. Dr. Uwe Schmidt FH Wedel

Datenmodell


weiter

Das Datenmodell als Abstrakte Syntax in Haskell Notation

   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-- ----------------------------------------
weiter

weiter

ghc -e af1 ProjektTagebuch
weiter

weiter

ghc -e af2 ProjektTagebuch
weiter

Letzte Änderung: 11.07.2012
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel