Software-Ontwikkeling I Academiejaar 2006 - 2007
Project: Bibliotheekbeheer
SoftwareOntwikkeling I: Projectopgave 1
1. Digitale bibliotheek a. Inleiding Bibliotheken houden onder meer hun collecties van uitleenbare artikels bij in digitaal formaat. Dit om het uitlenen en beheren van deze artikels zo makkelijk en overzichtelijk mogelijk te maken. Door middel van een beheerprogramma wordt door de werknemers van de bibliotheek met het systeem geïnterageerd voor het uitlenen van artikels, het invoeren van nieuwe artikels in het systeem, het bepalen van boetes, … Het doel van het project is een command line/console applicatie te maken voor het beheer van een bibliotheek. Dit uiteraard in C++, enkel gebruikmakend van de ANSI C++ standaard.
b. Opgave De bibliotheek leent 4 verschillende soorten artikels of items uit: boeken, magazines, cd’s en dvd’s. Bij elk item hoort informatie zoals titel, auteur, en de boete die een uitlener moet betalen indien hij/zij het item te laat terugbrengt. De boete voor cd’s en dvd’s bedraagt 1,5 euro per dag, terwijl die voor boeken en magazines respectievelijk 0,5 en 0,25 euro per week bedraagt. Een week wordt geteld in dagen dat de bibliotheek toegankelijk is, dit is 6 dagen per week (weekdagen + zaterdag). Indien een boete per week wordt bepaald, dan wordt het aantal dagen afgerond naar boven indien geen veelvoud van een week. Er kan ook per item expliciet een aangepaste boetewaarde gedefinieerd worden (bijvoorbeeld bij veelgevraagde of nieuwe items). Verder hebben cd’s en dvd’s een veld dat de speelduur ervan aangeeft en een veld dat het aantal effectieve discs bijhoudt, terwijl boeken en magazines een veld met het aantal pagina’s bevatten, evenals een veld dat de uitgever bijhoudt. Informatie specifiek voor een bepaald soort item: • Cd: een lijst van de tracks • Dvd: een string die het type data erop aangeeft (vb. video/mpeg2) • Magazine: o De jaargang o Het volgnummer (per jaar) o Het hoofdonderwerp • Boek: een lijst van de hoofdstukken
SoftwareOntwikkeling I: Projectopgave 2
Tevens heeft ook elk item een functie om de boete vanaf een bepaald moment te berekenen (ten opzichte van de huidige datum), en een functie om een tekstuele representatie van het item te verkrijgen. Ter ondersteuning van de beheersapplicatie zal ook een (overladen) == operator nodig zijn om items met elkaar te vergelijken. Een overzicht van de klassenstructuur die bekomen wordt uit deze probleemstelling zie je hieronder (in UML-notatie).
Bij het berekenen van de boete voor een bepaald item zijn 2 datums vereist. Deze datums worden gemodelleerd door de klasse Date die de volgende operaties moet aanbieden: • Constructoren: o default o copy o opgegeven dag, maand, jaar, weekdag o opgegeven string die een datum bevat (vb. donderdag 23/11/2006) • Getters voor de attributen dag, maand, jaar en weekdag • Operatoren (voeg const toe waar nodig): o Date operator+(short): telt een opgegeven aantal dagen op bij deze datum SoftwareOntwikkeling I: Projectopgave 3
•
o short operator-(Date&): bepaalt het verschil in dagen tussen deze datum en een opgegeven datum Een toString methode die deze datum naar een string converteert
De constructoren van de Date klasse krijgt ook een dagaanduiding mee om te kunnen bepalen of een per dag betaalde boete over een periode van meer dan 1 week loopt (zondagen tellen immers niet mee). Je kan dit op verschillende manieren implementeren, bijvoorbeeld met een enum die de dagen van de week modelleert. Van elk artikel kunnen meerdere exemplaren beschikbaar zijn. Uiteraard worden enkel exemplaren uitgeleend, artikels zelf bestaan op zich niet fysiek. Bij elke uitlening wordt de datum van uitlening opgeslagen evenals de datum waarop het exemplaar teruggebracht moet worden. Ook het uitgeleende exemplaar moet bijgehouden worden. De normale uitleentermijn bedraagt 3 weken. Verder wordt een lijst van klanten bijgehouden. Van elke klant moeten de naam, voornaam en adres opgeslagen worden. Ook moet er een mogelijkheid voorzien zijn om de totale boete te bepalen. Je applicatie moet in staat zijn om (vanuit een tekst/menugebaseerde console-applicatie, dus geen Java-stijl GUI): • Een exemplaar aan een klant uit te lenen • Na te gaan per klant welke exemplaren die heeft uitgeleend • Items van de 4 soorten toe te voegen aan de verzameling • Items aan te passen (vb. de boetewaarde) • Exemplaren toe te voegen en te verwijderen • Uitgeleende exemplaren terug te brengen • Items te verwijderen (hierbij worden automatisch alle exemplaren van dat item verwijderd) • Een klant toe te voegen en te verwijderen, of zijn gegevens te wijzigen • Een momentopname van de in de applicatie opgeslagen data weg te schrijven naar een logbestand • De datum aan te passen voor testdoeleinden Enkele hints/aandachtspunten: • Een overzicht van de STL kan je vinden op http://www.cppreference.com/cppstl.html Hierbij vind je ook codevoorbeelden voor elke template. • Maak van de klassen Item, Multimedia_Item en Textual_Item abstracte klassen, maw. het mag niet mogelijk zijn direct een object van 1 van deze klassen aan te maken. Enkel de SoftwareOntwikkeling I: Projectopgave 4
•
• • • • • •
• • •
•
subklassen Book, Magazine, CD en DVD mogen direct instantieerbaar zijn. Let er steeds op gemeenschappelijke kenmerken van items steeds zo hoog mogelijk in de klassenhiërarchie geïmplementeerd worden, het is slechte stijl om code te dupliceren. Gebruik waar nodig het const keyword om te vermijden dat bepaalde data gewijzigd wordt (vb. bij getters) Vanzelfsprekend is het ook hier heel belangrijk je interfaces en implementaties te scheiden. Gebruik dus header files waar het nodig/nuttig is! Bij de Date klasse hoef je geen rekening te houden met schrikkeljaren. Gebruik C++ excepties waar nuttig (vb. proberen uitlenen van een item waarvan geen exemplaren meer beschikbaar zijn, verkeerd datum formaat,…) Alle opmerkingen over de practica gelden ook hier: wees zuinig met geheugen, let op voor dangling pointers, ongecontroleerde type casts, …. Begin niet onmiddellijk te programmeren. Lees aandachtig de opgave en denk na hoe je de verschillende problemen zou oplossen (vb. welke klassen ga je gebruiken, wat houden ze bij,…). Zo zijn er bijvoorbeeld verschillende manieren om klanten met uitleningen te koppelen. Welke je gebruikt kies je zelf. Teken indien dat helpt een blauwdruk van je klassenschema uit, en begin pas te programmeren nadat je een goed overzicht hebt! Als referentiecompiler wordt Microsoft Visual C++ Express Edition gebruikt, je installeert deze IDE best lokaal om stabiliteitsredenen. Probeer zoveel mogelijk compiler warnings te vermijden; deze duiden meestal op fouten die Visual Studio C++ EE voor jou zal oplossen, maar die je evengoed kan vermijden door je code aan te passen. Vanzelfsprekend zijn er zaken waar deze opgave je vrij in laat; deze mag je zelf kiezen naar eigen inzicht. Verduidelijk in alle geval je broncode met commentaar waar dat nuttig is!
c. Indienen • •
Het project wordt gemaakt in groepen van 2 studenten. Het mag eventueel ook alleen gemaakt worden. Schrijf een kort verslag (max. 2 bladzijden) met daarin: De naam, voornaam en richting van de groepsleden + groepsnummer van minerva
SoftwareOntwikkeling I: Projectopgave 5
Een (informele) figuur waarin je de samenwerking van je klassen toont (hoeft geen UML te zijn, zolang het maar duidelijk is) Een extra woordje uitleg bij je ontwerpsbeslissingen (max. ½ bladzijde) De taakverdeling: wie heeft wat gedaan? • Zip je (compileerbare!) broncode (enkel .h en .cpp bestanden) samen met je verslag in een bestand naam_vnaam_project_nr.zip,vb. iterbeke_frederic_project_1.zip. De naam en voornaam zijn die van degene die het project indient. Het nummer is je groepsnummer vanop minerva. • Stuur je oplossing door middel van de dropbox op minerva door naar Frederic Iterbeke, ten laatste op 18 december 2006, 12u ‘s middags Veel succes!
SoftwareOntwikkeling I: Projectopgave 6