H9: Klasse Ontwerp. Richtlijnen Specificaties Multiple inheritence

Vergelijkbare documenten
Abstraheren van modellen

3.1 Opsomming data type

Hoofdstuk 9: Object Constraint language (OCL) Prof. Dr. Olga De Troyer. Constraints

Overerving & Polymorfisme

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

Abstracte klassen & Interfaces

IMP Uitwerking week 13

Voorbeeld. public class BankRekening {

Kleine cursus PHP5. Auteur: Raymond Moesker

Objectgericht programmeren 1.

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Ontwerp van Informatiesystemen

Stacks and queues. Hoofdstuk 6

Noties Informatica. In java fungeren objecten als een model voor de elementen waarin een probleem kan worden opgesplitst

case: ocl-expressies

Kwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();

BRP-BZM Use Case Realisations Guidelines

Deel II: Modelleren en software ontwikkeling. Hoofdstuk 7 Software ontwikkeling - Overzicht. Naïeve benadering

Informatica. Objectgeörienteerd leren programmeren. Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele

Naam:... INFO / WIS-INF / ASIB / IAJ. Theorie

Lessen Java: Reeks pag. 1

Modelleren en Programmeren

case: toestandsdiagrammen

Programmeren in Java les 3

Implementatie #-operator

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

Inleiding C++ Coding Conventions

Design principes.

Design principes.

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Modeleren. Modelleren. Together UML. Waarvan maken we een model? overzicht les 14 t/m 18. ControlCenter 6.2

Tentamen in2705 Software Engineering

Knowledgeable Referenceable Personable Accountable Scalable

OBJECT SPAGHETTI : PATTERNS BIEDEN UITKOMST? Wat is het probleem nou eigenlijk? public class CoffeeDrinker { private CoffeeProducer mycoffeeproducer;

Software-Ontwikkeling I Academiejaar

Informatica. Deel II: les 2. Leibniz - erven - digitaal. Jan Lemeire Informatica deel II februari mei Parallel Systems: Introduction

Automatische Testen van Java Klassen

VI. Klassen en objecten

H10: Persistentie MSO, 2 e deel: Ontwikkeling. Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz)

Vakgroep CW KAHO Sint-Lieven

Datastructuren Werkcollege Intro

Probleem met dobbelspel. 2IP05: Programmeren Blok A. 5 spelers,2 dobbelstenen. wstomv/edu/2ip05/ Per ronde werpt elke speler 1

Opmerkingen en vragen aan Ultieme vraag: Hoe beïnvloedt dit de winstkansen?

Verder zijn er de nodige websites waarbij voorbeelden van objectgeoriënteerd PHP (of Objec Oriented PHP, OO PHP) te vinden zijn.

Die inputs worden op een gecontroleerde manier aangeboden door (test) stubs. De test driver zorgt voor de uiteindelijke uitvoering ervan.

Hoofdstuk 1: Inleiding. Hoofdstuk 2: Klassen en objecten Datahiding: afschermen van implementatiedetails. Naar de buitenwereld toe enkel interfaces.

Zelftest Programmeren in Java

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

INFITT01 - Internettechnologie WEEK 8

Tentamen Formele Methoden voor Software Engineering (213520)

Testen van Java code met JML

Unified Modeling Language

Hoofdstuk 9. Hashing

Programmeren in Java 3

Tentamen Inleiding Programmeren (IN1608WI), duur van de toets 2 uur Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Tentamen Imperatief Programmeren

NAAM: Programmeren 1 Examen 29/08/2012

Enterprise Connectivity. Marnix van Bo. TU Delft Elek Software Architect 20 jaar ervarin ontwikkeling

T3 in het wild While Juni Tom de Valk Tom Evers Sjors Meekels

NHibernate als ORM oplossing

Deel I Hoofdstuk 2: Het klassenmodel

ARE methodiek Het ontwikkelen van Informatie Elementen

UML is een visuele taal om processen, software en systemen te kunnen modeleren.

Open SQL Server Management Studio en log in als Administator. Je ziet dan wat je in figuur 2.1 ziet.

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden.

Donderdag 9 juni, 2011, 8u30. a. Leg uit wat de Coupling Dependency Metric betekent, en waarom deze metriek belangrijk is.

Oplossingen voor het testen van objectgeoriënteerde software

TENTAMEN Programmeren 1 VOORBEELDUITWERKING

Programmeren in C# Interfaces. Hoofdstuk 23

Pagina 1/6. Joris Van Geet! :59 Comment: 1pt voor iteratief 1pt voor incrementeel niets voor een voorbeeldje

Programmeren 1 20 januari 2012 Prof. T. Schrijvers

Logica voor Informatica

Ingebouwde klassen & methodes

Design patterns Startbijeenkomst

Refactoring. Introductie Verschillende refactoringstappen

Software Test Documentation

voorbeeldexamen Object Oriëntatie Foundation (OOF.NL) editie juli 2010 inhoud inleiding 3 voorbeeldexamen 4 antwoordindicatie 11 evaluatie 22

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

De Vergeten Abstracties

Software Processen. Ian Sommerville 2004 Software Engineering, 7th edition. Chapter 4 Slide 1. Het software proces

Elementary Data Structures 3

Modulewijzer Tirdat01

MINICURSUS PHP. Op dit lesmateriaal is een Creative Commons licentie van toepassing Sebastiaan Franken en Rosalie de Klerk Bambara

Datastructuren en algoritmen

Opgaven Registers Concurrency, 29 nov 2018, Werkgroep.

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

Programmeren. Cursus Python

Programmeren in C# Overerving

Thesissen bij FOTS. Uitbreiding, Integratie en Gebruik van open source Modelleringstools. Pieter Van Gorp. Universiteit Antwerpen.

Modelleren en Programmeren

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

TENTAMEN Programmeren 1

Programmeren. a. 0, 0, 0 b. 0, 0, 27 c. 15, 12, 0 d. 15, 12, 27

1 Ontwerppatronen. 1.1 Het Command patroon

Scala. Korte introductie. Sylvia Stuurman

Transcriptie:

H9: Klasse Ontwerp Richtlijnen Specificaties Multiple inheritence

SchetsPlus... doe ik het goed? 2

Hoe maak ik goede klassen? We gaan kijken naar: algemene ontwerp-richtlijnen software metric Complement: style-gidsen, tips, best practices, kookboeken, enz. Sun s Java Coding Style Guide Ambler, the Elements of Java Style 3

Richtlijnen Structuur is belangrijk, wat je niet wil: complex fouten, onderhoudkost star Optimaliseer : encapsulatie inheritence cohesie koppeling 4

Cohesie Een module is cohesief als het een set van sterk aan elkaar gerelateerd functionaliteiten aanbiedt. Persoon getgewicht() getlengte() Persoon getgewicht() getlengte() getvrienden() Persoon getgewicht() getlengte() addinadresboek(aboek) 5

Koppeling Er is een koppeling tussen modules A en B als een van de andere afhankelijk is. Voorbeelden: datakoppeling f() {... u.g(x)... } globale-var koppeling m 1,m 2 via een static attribuut 6 C 1, C 2 via een package-private attribuut

Koppeling Pathologisch Drank - suiker : int - water : int + zoet() : int + roer() Mixer if (drank.zoet() > 10) { drank.water++ ; drank.roer() ; } in C++ heb je ook friends. 7

Koppeling In OO ook door: Associatie / navigatie Verse objecten in methode Via inheritence Vaak spanningveld tussen koppeling en de andere aspecten: maak A subklasse van B koppeling verhoogt cohesie met delegatie koppeling 8

Inheritence koppeling Persoon getkinderen() Drank mixmetmelk() // concreet abstract mix() Klant Thee Koffie 9

Demeter Principe Ian Holland, 1987 Zorg dat objecten alleen met vrienden praten. Vliegtuig bagagegewicht() : int vervoert * Persoon naam heeft * Tas gewicht Delegeer: Vliegtuig bagagegewicht() : int vervoert * Persoon naam tassengewicht() heeft * Tas gewicht ten koste van de cohesie van Persoon. 10

Connascance Page-Jones, 1992. Letterlijk: tegelijkertijd geboren. Page-Jones: Klassen C en D zijn connascent als het mogelijk is om C aan te passen die een aanpassing van D dwingt. koppeling! 11

Uit project management perspectief Software metriek complexiteit indicatoren Om strategisch te beslissen dat bepaalde delen van de software een risico factor zijn, en dat reorganisatie nodig is. Voor programmeurs ook nuttig als richtlijnen. 12

Voorbeeld Metriek : + Uit te rekenen (en goedkoop) tools! - abstract Zoals, #regels Nog meer? Traditionele metrieken Halstead McCabe Oviedo OO metriek de metriek bestaat niet ze zijn allemaal indicatoren. 13

Halstead Complexiteit: moeite om code te lezen E = D * V x = x + x ; x++ x = x + y ; z++ (alleen ter info) 14

McCabe Het aantal lineair onafhankelijke paden in je programma. int P() { if (...) return 100 else return 0 } 1 0 2 Control Flow Graph (CFG) 15

McCabe 0 1 3 4 2 5 16

Oviedo Splits programma in sequentiële blokken interacties tussen elementen in een blok voegen niets aan complexiteit. afhankelijkheden tussen blokken wel. Voorbeeld: P(int x, int y) { if (y>0) x = 0 ; else x = 1 ; (y>0) ; x = 0 (~y>0) ; x = 1 DF = 2 DF = 2 17 } return x DF(P) = 6 return x DF = 2

OO metriek Voor OO willen we ook indicatie hebben over structurele complexiteit van je klassen. Chen & Lu, 1993: Encapsulatie Koppeling Inheritence Cohesie 18

Encapsulatie (P) Idee: Methode met minder argumenten is abstracter Simpel vs complex parameters, bijvoorbeeld: Type Complexiteit waarde boolean, int 0 double 2 object 6-9 P = som van de complexiteit van de argumenten (van pub. methodes) in C. 19

Koppeling (Cp) Idee C gebruikt D 1x koppeling C wordt door D gebruikt 1x koppeling wederzijde koppeling lastig telt als extra Cp = som van boven. 20

Cohesie Co Hoe weten we welke methode bij elkaar horen?? Idee: methodes met dezelfde type signatuur horen vaak bij elkaar. Chen en Lu ook sub signatuur. m1(int,vervoer) ~ m2(vervoer,int,persoon) Vervoer + versnel(real) + addpassagier(persoon) + swappassagiers(persoon, Persoon) + addpassagiers (Collection<Persoon>) Co = G / N = 0.75 21

Inheritence H Inheritence is goed (code hergebruik), maar je code wordt ook minder expliciet in zekere zin ook fout gevoelig. H is een meting van inheritence complexiteit. Som van: # methodes inheritence afstand # direct superklassen. # subklassen 22

23 JHawk

Klasse specificatie Videotheek Minderjarig bonus Klant Naam Leeftijd leent * DVD titel leeftijdgrens < is verantwoordelijk voor Meer kun je niet met klasse diagram uitdrukken... Een klant is een mj als zijn/haar leeftijd 18 24 De klant die voor een mj verantwoordelijk is, is zelf geen mj..

Klasse invariant Een klasse invariant van C is een constraint op de attributen van de objecten van C. Anders zit een object in een verkeerde/onveilig toestand. Minderjarig Bob 10 Minderjarig Octo 30 De leeftijd van een mj is 18. 25 Het gaat over de stabiele toestand van een object (dus niet als een operatie nog bezig is met het object).

Klasse invariant Maar indirect gaat het eigenlijk ook over associaties... DVD Sneeuwwit 0+ Minderjarig Bob 10 DVD Star Trek 10+ DVD Kill Bill 12+ 26 Hoe belangrijk? erg belangrijk.

Hoe druk je dat uit? Met predicaten zoals in Logica : (forall x : Minderjarig x.leeftijd 18) Object Constraint Language (OCL) onderdeel van UML. context x : Minderjarig inv: x.leeftijd 18 27

Navigatie in OCL Klant Naam Leeftijd lener leent > dvds * DVD titel leeftijdgrens context dvd : DVD inv: dvd.lener.leeftijd dvd.leeftijdgrens context x : Klant inv: x.leeftijd x.dvds.leeftijdgrens levert een verzameling terug! 28

Collecties in OCL Zoals Set en Sequence Operatoren zoals: size(), sum(), isempty() includes(x) forall(...), exists(...), select( ) Eigenaardig syntax: u isempty() u includes(x) 29

Voorbeeld Klant Naam Leeftijd lener leent dvds * DVD titel leeftijdgrens context x : Klant inv: x.leeftijd x.dvds.leeftijdgrens inv: x.dvds forall (dvd x.leeftijd dvd.leeftijdgrens) 30

Filter select operatie Klant Naam Leeftijd lener leent dvds * DVD titel premium : boolean Je mag slechts één permium DVD lenen. context x : Klant inv: x.dvds select (dvd dvd.premium = true) size() 1 31

Methode specificeren Klant inschrijf() leen(d) getleenlimiet() declaratief! Pre/Post spec, pseudo code, geen OCL. Inschrijf() dient de collectie van gelende dvds op leeg te zetten forall x : Klant { true } x.inschrijf() { x.dvds = } context x : Klant:: inschrijf() pre: true post: x.dvds isempty() 32

Mix in specificatie met query Klant inschrijf() leen(d) getleenlimiet() Je mag niet meer dan je limiet lenen. markeer als isquery, maar alleen als side-effect vrij! context x : Klant:: leen(d) pre: post: x.dvds size() + 1 x.getleenlimiet() x.dvds = x.dvds@pre insert(d) 33

Multiple inheritence Product ID Naam Prijs GroteBestelling koopgroot(n) ImportGoed invoerbelasting() Koffie Krachtig! Je kunt makkelijk verschillende features erven. 34 Talen met MI C++. Eiffel, Python Om uit te kijken diamantprobleem Als je toch in Java wil implementeren

Feature clash Werknemer werk() Artiest werk() Welke werk() wordt bedoelt in Muzikant? (soms de ene soms de andere) Muzikant Geen echte issue. Eiffel renaming 35 class Muzikant inherit Werknemer rename werk as werk1 Artiest rename werk as werk2 feature end

Diamantprobleem Persoon Naam Leeftijd Werknemer Artiest Muzikant Een muzikant kan in principe 2x namen en leeftijden erven. leefdtijd onzinnig merge tot 1x naam misschien wil je een echte naam en een artiestnaam. Ambigu compiler kan deze niet zelf beslissen 36

Inheritence vs associatie W Artiest Naam Werk() Artiest Naam Werk() Muzikant Muzikant MI Delegatie Feature erven Ja Ja Is M ook een A? Ja Nee 37

Simuleren met assoc + interface W Muzikant Artiest Naam Werk() Gedoe.. Als MI essentieel in je ontwerp is, implementeer ook in een MI taal. Anders haal MI uit je ontwerp. W Artiest (Interface) Werk() Andere overweging: persistence. Muzikant Artiest Naam Werk() 38