Lösningsförslag till tentamen i EDAF25 Objektorienterad

1(7)
Institutionen för datavetenskap
LUNDS TEKNISKA HÖGSKOLA
Lösningsförslag till tentamen i EDAF25
Objektorienterad modellering och design – Helsingborg
2015–06–04
1.
a) Figure 1
GraphicalApp
GeometryApp
GeometricSquare
+area(): double
GraphicSquare
+draw()
GUI
Figur 1: Klasser med separata ansvar
b) Ja, en klass som utifrån användarens perspektiv har flera olika ansvarsområden leder till
en bräcklig design. Antag att GeometryApp aldrig behöver metoder för att representera en
kvadrat grafiskt men att GraphicalApp har behov av dylika metoder. Om dessa behov vid
något tillfälle förändras så att vi vill ändra implementationen i Square men inte tänker på
kopplingen till GeometryApp kan det leda till oväntade beteenden i den senare.
2.
a) Man skulle kunna argumentera för att vi bryter mot OCP eftersom det inte går att lägga till
ytterligare fordon utan att förändra i klassen VehicleTest. Man kan också ana ett brott mot
DIP eftersom de beroenden som finns går mot konkreta klasser snarare än mot abstraktioner.
Dock är det svårt att utifrån kontexten i detta lilla exempel avgöra om dessa är högnivå eller
lågnivå-klasser. Koden innehåller en del duplicerad kod vilket i sin tur innebär brott mot en
princip som vi inte gått igenom i kursen nämligen DRY-principen.
2(7)
b) Template method pattern
public abstract class Vehicle {
private boolean status = false;
private void start(){
this.status = true;
}
protected abstract void drive();
protected abstract void stop();
public final void testVehicle(){
start();
if(this.status){
drive();
stop();
}
}
}
public class Car extends Vehicle {
protected void drive() {
System.out.println("I’m driving a car!");
}
protected void stop() {
System.out.println("Car stopped!");
}
}
public class Truck extends Vehicle {
protected void drive() {
System.out.println("I’m driving a truck!");
}
protected void stop() {
System.out.println("Truck stopped!");
}
}
public class VehicleTest {
public static void main(String args[]){
Vehicle car = new Car();
testVehicle(car);
Vehicle truck = new Truck();
testVehicle(truck);
}
public static void testVehicle(Vehicle v){
v.testVehicle();
}
}
3(7)
c) Strategy pattern
public interface DrivingStrategy {
public void drive();
}
public class CarDrivingStrategy implements DrivingStrategy {
public void drive() {
System.out.println("I’m driving a car!");
}
}
public class TruckDrivingStrategy implements DrivingStrategy {
public void drive() {
System.out.println("I’m driving a truck!");
}
}
public interface StoppingStrategy {
public void stop();
}
public class TruckStoppingStrategy implements StoppingStrategy {
public void stop() {
System.out.println("Truck stopped!");
}
}
public class CarStoppingStrategy implements StoppingStrategy {
@Override
public void stop() {
System.out.println("Car stopped!");
}
}
public class Vehicle{
private boolean status = false;
private DrivingStrategy drivingstrategy;
private StoppingStrategy stoppingstrategy;
public Vehicle(DrivingStrategy ds, StoppingStrategy ss){
drivingstrategy = ds;
stoppingstrategy = ss;
}
public void setDrivingStrategy(DrivingStrategy ds){
this.drivingstrategy = ds;
}
public void setStoppingStrategy(StoppingStrategy ss){
this.stoppingstrategy = ss;
}
public void start(){
this.status = true;
}
4(7)
public void drive(){
drivingstrategy.drive();
}
public void stop(){
stoppingstrategy.stop();
}
public void testVehicle(){
start();
if(this.status){
drive();
stop();
}
}
}
public class VehicleTest {
public static void main(String args[]){
Vehicle car = new Vehicle(new CarDrivingStrategy(), new CarStoppingStrategy());
testVehicle(car);
Vehicle truck = new Vehicle(new TruckDrivingStrategy(), new TruckStoppingStrategy());
testVehicle(truck);
}
public static void testVehicle(Vehicle v){
v.testVehicle();
}
}
5(7)
d) Factory
VehicleTest
Vehicle
«interface»
VehicleFactory
+test()
fact
o
ConcreteVehicleFactory
ry m
etho
d pa
ttern
+makeCar(): Vehicle
+makeTruck(): Vehicle
Car
Truck
«creates»
Figur 2: Factory-mönstret
public class VehicleTest {
VehicleFactory factory = new ConcreteVehicleFactory();
Vehicle car = factory.makeCar();
testVehicle(car);
Vehicle truck = factory.makeTruck();
testVehicle(truck);
}
public static void testVehicle(Vehicle v){
v.test();
}
}
6(7)
3.
a) Figure 3
insertCoin(x)/amount=x
Idle
Give Change
entry/ release amount
abort
insertCoin(x)/amount=x+amount
Dispense
entry/ dispense beverage
select(beverage)[isPayed]
/amount=amount-cost
Paying
do/ display amount
Figur 3: Tillståndsdiagram kaffeautomat
b) Figure 4
control
VendingMachine
- order: BeverageBuy
- display: Display
- distributor: Beveragedistributor
- moneyHandler: MoneyHandler
+select(Beverage)
+insert(double)
+abort()
BeverageBuy
-amount: double
+BeverageBuy(double)
+increase(double): double
+buy(Beverage):double
+isPayed(Beverage):boolean
hardware
«enumeration»
Display
+display(double)
BeverageDistributor
+dispense(Beverage)
Beverage
Coffe
Tea
Chocolate
MoneyHandler
+release(double)
Figur 4: klassdiagram kaffeautomat
c) Figure 5
7(7)
Figur 5: tillståndsdiagram kaffeautomat
4. Figure 6
a) DF: A, B, E, D, C
2
A
B
5
3
5
C
D
1
1
2
E
Figur 6: Graf
b) Efter 5 iterationer är alla 5 noderna markerade som besökta. Den kortaste vägen som identifieras är A,D,C,E och har längden 5.