Hallo,
kann mir einer etwas über das "Programmieren gegen Interfaces" erzählen? Am besten mit einem Beispiel und Erklärung.
Ich habe leider keine Ahnung was man darunter versteht und hab auch bei google und Co nichts relevantes entdeckt.
Wo hast du diese Aussage her? Darunter könnte man sicher Unterschiedliches verstehen. Auf die Schnelle würde ich sagen, dass man z. B.
Code:
List<Foo> bar = new ArrayList<Foo>();
statt
Code:
ArrayList<Foo> baz = new ArrayList<Foo>();
verwenden sollte. Also Implementierungen eines Interfaces nur über das Interface ansprechen, sodass man die Implementierung problemlos durch eine andere austauschen kann, die das Interface ebenfalls implementiert (in diesem Falle z. B. LinkedList).
Aber das ist nur meine fixe Interpretation dieses Ausdrucks. Kann sein, dass ich damit auch total daneben liege.
Meine Vorstellung: ich kann gegen Interfaces (z.B einer API) entwickeln, ohne eine konkrete Implementierung vorliegen zu haben.
Es reichen die Interfaces und die Doku des erwarteten Verhaltens. Um meine eigene Funktionalität zu testen, muss ich natürlich eine Implementierung besitzen oder die Implementierung mocken.
Anwendungsbeispiel: Tests, bei denen ich absichtlich Teile mocken möchte, weil sie im Testfall zu aufwendig zu realisieren wären (ein Webservice, ...)
Danke schonmal für eure Antworten!
Also den Begriff habe ich aus ne Aufgabe im Studium (Software Engineering). Wobei dort ein Programm vollständig geplant und umgesetzt werden soll. Einiger Code ist schon vorgegeben und es wird gefragt
"Die Methode „Programmieren gegen Interfaces“ wird ebenfalls eingesetzt. Zeigen Sie in Ihrem Systemarchitekturdokument auf, wo dies geschieht und motivieren Sie den Einsatz dieser Vorgehensweise"
Wenn ich euer Beispiel mit dem Programm vergleiche denke ich das es Methode zum Austauschen der Implementierung ist Beispiel List<Foo> ...
beispiel...
ich hab zb irgendeinen controller und eine view, die view ruft nun methoden des controllers auf, dazu braucht sie eine referenz auf den controller. die beiden klassen sind sehr eng gekoppelt.. schlecht. gibt es nun ein interface, dass der controller implementiert und das enau die methoden bietet die das model braucht, kann das model dieses interface als parameter erwarten und muss die konkrete implementierung nicht genau kennen.
oder das typische observer patter. andere klassen wollen wissen wenn sich mein zustand ändert, jetzt müsste ich nun alle klassen kennen die sich bei mir anmelden... oder ich kenne nur die schnittstelle, ich programmiere meinen info dienst praktisch auf ein interface... lose koppelung...
so zb, das model muss nicht genau wissen, welche views es gibt, man kann die anwendung um mehr views erweiter ohne das model ändern zu müssen....
Code:
package observer;
public class Test {
public static void main(String[] args) {
Model m = new Model();
m.setValue("Bier");
m.addObserver(new ViewA());
m.setValue("Schnapps");
m.addObserver(new ViewB());
m.setValue("Wein");
m.setValue("aus");
}
}
package observer;
import java.util.ArrayList;
public class Model {
private String value;
private ArrayList<ModelObserver> observers;
public Model(){
observers = new ArrayList<ModelObserver>();
}
public void addObserver(ModelObserver o){
observers.add(o);
}
public void informObservers(){
for(ModelObserver o: observers)
o.valueChanged(getValue());
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
informObservers();
}
}
package observer;
public class ViewA implements ModelObserver{
@Override
public void valueChanged(String value) {
System.out.println("ich bin eine ViewA Model ist jetzt: "+value);
}
}
package observer;
public class ViewB implements ModelObserver {
@Override
public void valueChanged(String value) {
System.out.println("ich bin eine ViewB Model ist jetzt: "+value);
}
}