Parameter-Objekte verändern oder nicht?

luma2

Mitglied
Was ist schöner:

Java:
public void myMethod(int n, int k) {
  ArrayList<Neighbor> allNeighbors = new ArrayList<Neighbor>();
  for (int i = 0; i < n; i++) {
    allNeighbors.addAll(localNeighbors(i, k));
  }
  ...
}

private ArrayList<Neighbor> localNeighbors(int i, int k) {
  ArrayList<Neighbor> neighbors = new ArrayList<Neighbor>();
  for (int j = 0; j < k; j++) {
    neighbors.add(new Neighbor(i, j));
  }
  return neighbors;
}


oder


Java:
public void myMethod(int n, int k) {
  ArrayList<Neighbor> allNeighbors = new ArrayList<Neighbor>();
  for (int i = 0; i < n; i++) {
    addNeighbors(allNeighbors, i, k);
  }
  ...
}

private void addNeighbors(ArrayList<Neighbor> allNeighbors, int i, int k) {
  for (int j = 0; j < k; j++) {
    allNeighbors.add(new Neighbor(i, j));
  }
}


Die zweite Möglichkeit ist effizienter, weil nicht so viele ArrayLists angelegt werden (wieviel macht so was eigentlich aus?) und weil "ArrayList#addAll(...)" nicht aufgerufen werden muss. Aber die Hilfsmethode hat einen Parameter mehr, den sie noch dazu verändert.

Was entspricht also den Programmier-Richtlinien?

danke,
Luma
 
Zuletzt bearbeitet:
Ich kenne zwar die Umstände nicht und was das ganze bezwecken soll, aber eigentlich machen beide Fragmente ja nichts anderes als:
Java:
public void myMethod(int n, int k) {
    ArrayList<Neighbor> allNeighbors = new ArrayList<Neighbor>();
    for (int i = 0; i < n; i++)
        for (int j = 0; j < k; j++)
            allNeighbors.add(new Neighbor(i, j));
}
nur werden beim ersten Listen erzeugt, die dann sowieso nicht mehr verwendet werden.
 
Neighbor ist irgendeine Klasse, deren Name hier egal ist.

myMethod soll die Hilfsfunktion aufrufen, um mehrere Elemente gleichzeitig zur ArrayList allNeighbors hinzuzufügen.

Bei der ersten Möglichkeit gibt die Hilfsfunktion die neuen Elemente zurück, die dann mit allNeighbors.addAll() zu allNeighbors hinzugefügt werden.
Bei der zweiten Möglichkeit wird allNeighbors als Parameter an die Hilfsfunktion übergeben, die die neuen Elemente per Seiteneffekt direkt reinschreibt.

Jetzt klarer?
 
ja ihm gehts ja nicht darum was die methoden machen, sondern wie sies machen 😉

ich würde in dem Fall eventuell auch die 2. Variante bevorzugen, da es lesbarer und ressourcenschonender ist, aber sonst betrachte ich Parameter als Eingaben für die Methode, welche in Abhängigkeit der Parameter ein anderes Verhalten zeigen würde, was im 2. Fall nicht wirklich gegeben ist.

Eigentlich könnte man ja alle Rückgabewerte knicken und alles als Parameter verpacken (mit Wrapperklassen wie Boolean, Integer etc.) ... aber das macht man ja nich 🙂
 
Dass man das in einer Methode machen kann, ist klar. Ich habe meinen Code für die Darstellung des Problems aber auf das Wesentliche reduziert und brauche in Wirklichkeit die Hilfsfunktion. (Die Klasse, in der myMethod steht, hat mehrere Unterklassen, für die myMethod aufgerufen wird. Die Hilfsmethode ist in der Oberklasse abstrakt und wird in den Unterklassen jeweils verschieden implementiert.)
 
Private Methoden dürfen imho schon nach Variante 2 funktionieren, wenn die Methode allerdings zu einem anderen Objekt/Klasse gehört wäre Variante 1 sauberer.

Ansosnten vielleciht noch bessere Bezeichner als i, n, k... sind ja schliesslich auhc Methodenparameter.

Man sollte sich mehr gedanken um das Design als die Performance machen, letztere ist nur wichtig wenn sie nicht stimmt, sonst ist sie egal 😉
 

Neue Themen


Zurück
Oben