# Modulschnittstelle definieren



## Saheeda (21. Mrz 2015)

Hallo,

wir sollen in der Berufsschule einen modular erweiterbaren Taschenrechner programmieren.
Innerhalb der Module benötigte Interfaces / Klassenhierarchien zu definieren ist relativ simpel. Mein Problem ist eine gemeinsame Schnittstelle aller Module.

Da jede Modulfunktion eine andere Anzahl von Parametern benötigt, habe ich mir überlegt, die benötigten Werte über Konstruktoren zu setzen und von außen immer nur eine "Calculate()" - Methode aufzurufen.

Das funktioniert aber z.B. schon bei den geometrischen Operationen nicht mehr. Die Calculate-Methode an sich wäre hier ziemlich sinnlos, da ich ja hier Fallunterscheidungen treffen muss: Welcher Körper/Form + welche Funktion.

Also ging meine Idee in diese Richtung:


```
public interface Shape{

       public double getArea();
       public double getRange();
}

public class Circle extends Shape{

	public Circle(double radius){ ... }
	
	//Oberflächeninhalt
	public double getArea(){ ... }
	
	//Umfang
	public double getRange(){ ... }
}

public class AreaCalculator extends IModule{

	public AreaCalculator(Shape shape){ ... }

	double calculate(){ 
		return this.shape.getArea();
	}
}
```

Aber das kommt mir nicht sehr sauber vor. :-/ 
Zumal ich auf die Art ganz viele Mini-Klassen zusammenkriege, die alle nur aus 1-2 Methoden bestehen.

Jemand ne Idee?


EDIT: Das Klassendiagramm ist nur ein vereinfachter Auszug. Eigentlich habe ich pro Modul mehrere Funktionen, die erfüllt werden müssen.


----------



## Gucky (1. Apr 2015)

Du könntest es so machen, dass die Module bestimmte Bedingungen an die Eingabe stellen (z. B. "CalFlaechKr" + Zahl) und dann einfach die Eingabe als String erhalten.
So, wie du dir das vorstellst, müsstest du für jedes Modul wieder den Quellcode ändern.


----------



## Saheeda (1. Apr 2015)

@Gucky

Tut mir leid, ich kann dir grad nicht so ganz folgen. Hättest du vielleicht ein Beispiel?

Es soll als GUI-Anwendung entwickelt werden.


----------



## Gucky (1. Apr 2015)

Ich bin davon ausgegangen, dass du eine Eingabe und eine Ausgabe nach Art einer Konsole hast. In etwa so wie der Home Bildschirm vom TI 89 Titanium.

Du hast es so beschrieben, dass du für jedes Modul den Quelltext ändern musst, da jedes unterschiedliche Parameter braucht und du diese Parameter im Konstruktor übergeben willst.
Deshalb war meine Idee, dass du den Modulen einfach die Eingabe übergibst und den Modulen überlässt, was sie damit tun wollen. Alle Sonderbefehle, wie die Berechnung der Fläche eines Kreises beginnen mit einem befehlspezifischen Präfix. Zum Beispiel die Berechnung eines Kreises mit CalcAreaCirc(. Danach komme die ganzen Parameter, die du benötigst, in diesem Beispiel nur einer durch Kommata getrennt und danach kommt eine schließende Klammer, die den Befehl abschließt.
Das Hauptprogramm kümmert sich dann nur noch darum die einzelnen Befehle richtig zuzuordnen und die Ergebnisse weiterzuverwenden.


Alles andere wäre für mich kein Taschenrechner mehr, sondern ein Rechenprogramm, wie MatLab oder Maple.


----------

