# Klasse austauschen mit geringem Aufwand



## julia1997 (16. Jun 2016)

Ich habe ein Projekt mit 3 Klassen Program.java, OldLibrary.java und NewLibrary.java. 

Ich möchte statt Oldlibrary eine neue BibliothekNewLibrary verwenden.

Ich soll zumindest zwei verschiedene Lösungen finden um die Bibliothek mit möglichst geringem Aufwand zu tauschen. Wie bewerkstelligen Ich den den Austausch?


----------



## Flown (16. Jun 2016)

Erst mal den ganzen Übungszettel + Klassen hier posten. Desweiteren sprechende Titel wählen und auch noch im richtigen Unterforum posten. 
Alle Punkte erledigt? Dann wird dir schneller geholfen, sonst ist das nur Raterei.


----------



## julia1997 (16. Jun 2016)

Hauptprogramm:

```
public class Program {

    public static void main(String[] args) {
        Library instance = new OldLibrary();
        for (Integer i : instance.generateRandomNumbers(200)) {
            System.out.println(i);
        }
    }  
}
```

Alte Library:

```
import java.util.LinkedList;
import java.util.List;

public class OldLibrary implements Library {

  
    /**
     * Generates n random numbers in the range [0, 100]
    */
    @Override
    public List<Integer> generateRandomNumbers(int n) {
        List<Integer> randomNumbers = new LinkedList<Integer>();
        for (int i = 0; i < n; i++) {
            randomNumbers.add(Math.round((float) Math.random() * 100));
        }
        return randomNumbers;
    }
}
```

Neue Library:

```
public class NewLibrary {
    private int min;

    private int max;

    public NewLibrary(int min, int max) {
        if (min < 0 || max < 0 || max < min) {
            thrownew IllegalArgumentException("min and max must be positive, where min <= max.");
        }
        this.min = min;
        this.max = max;
    }

    public int getRandomNumber() {
        int difference = max - min;
        return min + Math.round((float) Math.random() * difference);
    }
}
```


----------



## julia1997 (16. Jun 2016)

Im Archiv der Aufgabe finden Sie die 3 Klassen Program.java, OldLibrary.java und NewLibrary.java. Nehmen Sie an, Sie haben sich vor einiger Zeit entschieden in ihrem Programm Progam eine Bibliothek OldLibrary zu verwenden. Leider ist diese fehlerhaft
und veraltet, und muss nun ausgetauscht werden. Sie finden eine ̈ahnliche Bibliothek NewLibrary, die Sie nun gerne verwenden wu ̈rden.


a)  Finden Sie zumindest zwei verschiedene L ̈osungen um die Bibliothek mit m ̈oglichst geringem Aufwand zu tauschen und vergleichen Sie diese. Wie bewerkstelligen Sie den Austausch? Wo liegen die Vor- und Nachteile? Achtung: Das Programm in dieser Aufgabe ist sehr kurz, aber ihre L ̈osung sollte auch fu ̈r lange, komplexe Programme umsetzbar sein!


b)  Lesen Sie sich in das ,,Adapter”-Pattern1 ein und u ̈berlegen Sie sich, wie dieses zu L ̈osung beitragen k ̈onnte.

c)ImplementierenSieeineL ̈osunganhanddes,,Adapter”-Pattern. DieKlassen OldLibrary und NewLibrary sind als Libraries außerhalb ihrer Kontrolle und du ̈rfen daher nicht angepasst werden. Versuchen Sie Program m ̈oglichst wenig zu ver ̈andern!


----------



## Meniskusschaden (16. Jun 2016)

Das Hauptprogramm nutzt das Interface Library das von OldLibrary implementiert wird. Also ist es sinnvoll, eine Adapterklasse zu erstellen, die ebenfalls Library implementiert und ein NewLibrary-Objekt nutzt, an das es die Aufrufe von generateRandomNumbers() weiterleitet und das Ergebnis zurück reicht. Dann muss im Hauptprogramm fast nichts geändert werden.


----------



## julia1997 (17. Jun 2016)

Ja aber davor brauche ich noch 2 andere Alternativen :-/


----------



## Tobse (17. Jun 2016)

julia1997 hat gesagt.:


> Ja aber davor brauche ich noch 2 andere Alternativen :-/


Eine Reicht; du kannst ja bei Teilaufgabe a) schon auf den Adapter gekommen sein.

Mein Vorschlag für die fehlende Lösung für a): Die Klasse Programm anpassen

P.S.: Diese zwei möglichkeiten (1: bestehenden Code anpassen, 2: Adapter / Decorator verwenden) sind eigentlich die einzigen zwei Möglichkeiten, die in so einem Anwendungsfall mit echter Software zur Verfügung stehen. Hier muss man immer schauen, was weniger Aufwand ist. In diesem Fall wäre ganz klar die Anpassung von Programm.java einfacher. In einer Codebasis in welcher 10.000e Zeilen Code auf der auszutauschenden Klasse aufbauen, ist der Adapter/Wrapper die einzige realistische Lösung.


----------



## julia1997 (17. Jun 2016)

Wie könnte ich das Hauptprogramm am besten umschreiben?


----------



## mrBrown (17. Jun 2016)

Indem du alles was mit OldLibrary zu tun hat mit äquivalenten Ausdrücken die nur NewLibrary benutzen ersetzt.
In den Fall müsstest du selbst eine Liste erstellen, diese mit Zahlen, die du mit NewLibrary bekommst, füllen, anstatt die fertig zu bekommen.


----------



## Tobse (17. Jun 2016)

mrBrown hat gesagt.:


> [...] In den Fall müsstest du selbst eine Liste erstellen, diese mit Zahlen, die du mit NewLibrary bekommst, füllen, anstatt die fertig zu bekommen.



Das ist schon zu kompliziert. Das Hauptprogramm gibt 200 Zufallszahlen im Interval [0; 100] aus. Das selbe muss mit der neuen Library bewerkstelligt werden. Ich würde das so machen:


```
NewLibrary rng = new NewLibrary(0, 100);
for (int i = 0;i < 200;i++) {
    System.out.println(rng.getRandomNumber());
}
```


----------



## julia1997 (17. Jun 2016)

Wie implementiert man die Adapterklasse? Benutze ich Library als Adapterklasse?


----------



## Meniskusschaden (17. Jun 2016)

Du erstellst einfach eine Klasse, die die Schnittstelle Library implementiert:
	
	
	
	





```
public class NewLibraryAdapter implements Library { }
```
Die Schnittstelle Library gibt dann ja die Methode vor, die du implementieren musst.


----------

