Background for the header
To the home page of the University of Antwerp

 

 

LORE / Teaching / SReengMaster / Opdracht 2008

Terug naar SReengMaster.

Context | Opdracht | Resultaat

Context

Als software engineer zal je zelden of nooit een software systeem vanaf scratch schrijven. Dit project bereidt je daarop voor, door het uitbreiden van een bestaand software systeem.

Om software systemen te analyseren modelleert men deze typisch als een graaf. Zo´n graaf bestaat uit knopen en relaties tussen deze knopen, bv. klassen en de interacties tussen klassen. Een dergelijke modellering stelt software engineers in staat om vragen te stellen over de structuur van een software systeem. Zo kan je bv. opzoeken welke klassen de meeste interacties hebben met andere klassen.

Vermits een graaf-voorstelling van grote software systeem niet langer manueel verwerkt kan worden, maakt men gebruik van zogenaamde graaf query engines. Net zoals je met SQL vragen kan stellen in een database kan je met graaf queries vragen stellen over een graaf.

Een voorbeeld van een dergelijke graaf query engine is Crocopat. Crocopat is open source, erg krachtig (vergelijkbaar met Prolog), en heel erg efficient (sneller dan Prolog). In het bijzonder is Crocopat geschikt om vragen te stellen over grafen die software systemen voorstellen, omwille van:

  • efficientie: beter dan Prolog;
  • kracht: vergelijkbaar met Prolog;
  • gebruiksgemak: je kan erg complexe queries met erg weinig lijnen code schrijven

Alhoewel Crocopat erg efficient is, is er momenteel geen mogelijkheid om een graaf in het geheugen te houden. Dit betekent dat je ook voor opvolgende vragen telkens eerst moet wachten alvorens de graaf in het geheugen geladen is. Dit maakt Crocopat momenteel onbruikbaar voor professionele software engineers, vermits het laden van een realistische graaf te lang duurt. Indien de graaf slechts 1 keer geladen moet worden, en er nadien een reeks van vragen kan gesteld worden, zou Crocopat welk bruikbaar zijn op de werkvloer.

Opdracht

Als reengineering-team wordt jullie gevraagd om het ontwerp van Crocopat te herstructureren op zo een manier dat het implementeren van een "batch-mode" op de meest efficiënte wijze kan gebeuren. Merk op: het is niet de bedoeling dat jullie deze "batch-mode" ook werkelijk implementeren, jullie hoeven deze louter voor te bereiden.

Met "batch-mode" bedoelen we dat Crocopat in staat zou moeten zijn om een hele reeks gegeven RML programma´s uit te voeren op 1 RSF bestand dat in het geheugen blijft. Hierbij zou het RSF bestand dus niet telkens in het geheugen geladen moeten worden.

Concreet vragen we jullie om volgende activiteiten uit te voeren, en daarover te rapporteren in jullie projectverslag:


[Design recovery]

reverse engineering

  1. Breng het ontwerp van Crocopat in kaart, wat betreft:

    • het opladen van informatie uit het RSF en RML bestand;
    • het uitvoeren van het RML bestand;
    • het uit het geheugen halen van de informatie uit beide bestanden
    Geef hierbij duidelijk aan hoe dit ontwerp in de architectuur van Crocopat geplaatst is.


[Design]

design

  1. Stel een ontwerp voor dat bovenstaande ontwerp-elementen encapsuleert, en dat bovendien toelaat om de implementatie van een "batch-mode" met zo weinig mogelijk aanpassingen te implementeren.


[Management]

management

  1. Inschatting van de effort vereist voor (i) de refactoring benoodzaakt om het voorgestelde ontwerp in werking te stellen; en (ii) de benodigde aanpassingen en uitbreidingen van de testen.


[Refactoring]

refactoring

  1. Refactor de huidige implementatie van Crocopat naar het nieuwe ontwerp.

  2. Pas de testen aan teneinde een adequate coverage van de te veranderen delen te verzekeren voor, tijdens en na het refactoren.


Daarvoor zullen jullie een aantal technieken moeten toepassen die in de lessenreeks zijn aangeboden. Deze zijn:

  • Analyse:
    • Duplicated Code Analysis
    • Mining Software Repositories
    • Metrics and visualization
  • Herstructurering:
    • Testing
    • Refactoring

In dit project leggen we de nadruk op een weloverwogen, systematische analyse van het voorgelegde probleem, de oplossingsruimte en de oplossing die jullie kiezen. De software reengineering sessies zijn zo opgesteld dat ze jullie op een dergelijk project voorbereiden. We stimuleren jullie om de voor- en nadelen van de technieken uit de sessies af te meten op hun bruikbaarheid in deze opdracht, en weloverwogen gebruik van te maken van de geziene analyse-technieken. Uiteraard mag je ook andere analyse-technieken toepassen

Voor het refactoring-deel leggen we sterk de nadruk op testen. Onze minimumvereisten hierbij zijn devolgende:

  • Zoek uit in welke mate de huidige aanwezige testen je feedback zullen geven op je refactoring-stappen. Kwantificeer dit.
  • Beargumenteer waarom deze testen hiervoor (in)adequaat zijn, en pas indien nodig de testen zo aan dat ze wel adequaat zijn. Wees efficiënt bij tijdsinvesteringen in testen.

Resultaat

Om aan te tonen dat je in deze opdracht geslaagd bent, zal je volgende zaken moeten kunnen aantonen:

  • Je hebt een selectie gemaakt van drie analyse-technieken (bv. analyse van duplicate code, mining repositories, metrics of visualizatie zoals gezien in de lab sessies, maar andere technieken die niet gezien zijn, zoals dynamische analyse, mogen ook), en deze drie technieken op een weloverwogen, systematische wijze toegepast. Je hebt in je verslag duidelijk aangegeven (bv. via screenshots, resultaten van analyse van de output van technieken) hoe je de resultaten van de analyse-technieken gebruikt hebt.

  • Je hebt bovenstaande 5 activiteiten (onderverdeeld in (i) Design Recovery; (ii) Design; (iii) Management en (iv) Refactoring) uitgevoerd en besproken in je projectverslag.

  • De toegepaste herstructureringen zijn gedragsbehoudend.

    • Je kan de mapping aantonen tussen elk van de klassen uit de oorspronkelijke structuur en de nieuwe structuur.
    • Het compilatie-proces verloopt foutloos.
    • De testen draaien foutloos en bewijzen concreet dat Crocopat nog steeds correct werkt.

Nota: uiteraard is het ook dit jaar mogelijk om eigen project-voorstellen in te sturen. Deze voorstellen zullen door ons worden goedgekeurd indien ze een goede oefening vormen op de reengineering-technieken die we in de lessenreeks gezien hebben. Zo is het steeds mogelijk om bv. een software-systeem dat je voor je thesis, of voor een ander vak hebt geschreven of gebruikt, te reengineeren.

Crocopat compilatie-hulp voor Eclipse CDT

Om crocopat op het Windows platform gecompileerd te krijgen (procedure getest in de bibliotheek) moet je volgende items installeren.

  1. Download cygwin. Ensure to install
    1. bison (version 2.3)
    2. flex (version 2.5.4)
    3. g++ (version 3.4.4)
    4. make (version 3.81)
  2. Install the Eclipse IDE for C/C++ developers (or use an update site for Eclipse CDT)
  3. Download the crocopat 2.1.4 sources
  4. Create a new C++ Makefile project, with source directory $crocopat-2.1.3/src

    The build output should resemble:

    **** Build of configuration Default for project crocopat-2.1.4 ****
    
    make all
    g++   -O3      -I. -ansi  -c main.cpp
    g++   -O3      -I. -ansi  -c crocopat.cpp
    bison --defines --verbose -o relYacc.tab.cpp  relYacc.y
    # mv relYacc.tab.cpp.h relYacc.tab.hpp  
    # Rename bison's output file name if using an old bison version.
    g++   -O3      -I. -ansi  -c relYacc.tab.cpp
    flex -+    -orelLex.yy.cpp  relLex.l
    g++   -O3      -I. -ansi  -c relLex.yy.cpp
    g++   -O3      -I. -ansi  -c relNumExpr.cpp
    g++   -O3      -I. -ansi  -c relStrExpr.cpp
    g++   -O3      -I. -ansi  -c bddBdd.cpp
    g++   -O3      -I. -ansi  -c ctaObject.cpp
    ar -rs librelbdd.a crocopat.o relYacc.tab.o relLex.yy.o relNumExpr.o relStrExpr.o bddBdd.o ctaObject.o
    ar: creating librelbdd.a
    g++ -o crocopat main.o   -L. -lrelbdd -static
    # @sh config.sh > config.txt   # Keep track of the compiler versions.
    

    If you can't get the project to compile, you can try to reuse this C++ Makefile project for crocopat-2.1.4.

 

Valid HTML 4.01! Valid CSS!

 Lab On REengineering - Antwerpen, last modified 17:43:52 06 April 2009