Hi, ich stand schon öfters vor folgendem Problem:
public class Data{
public double Latitude{get;set;}
public double Longitude{get;set;}
public string Text{get;set;}
}
pubilc class BusinessLogic{
public IEnumerable<Data> GetDataFromDAL(int id){
IEnumerable<Data> data = dal.GetData(id);
ModifiyData(data);
}
public void ModifyData(IEnumerable<Data> data){
//zb.
foreach(var currData in data){
currData.Longitude += 0.001;
}
}
}
So wie ich es im obigen Code dargestellt habe sollte es ja nicht sein, richtig??
Eingangsparameter sollten soweit ich weiß nicht verändert werden, wie wäre die richtige Herangehensweise für so etwas?
Folgende Idee:
Die Mehtode ModifyData gibt ebenfalls IEnumerable<Data> zurück, erzeugt also innerhalb der Methode eine neue List, die Frage die sich mir nun stellt: ich müsste eigentlich auch neue Data Objekte erstellen(Stichwort IClonable), die Werte von currData übernehmen u. zb. 0.0001 dazu addieren. (neue Objekte deshalb erstellen, denn es handelt sich ja um Instanzen innerhalb der Liste, daher würde es meiner Meinung nach nicht ausreichen eine neue Liste zu erstellen u. die modifizierten Daten-Objekte zu adden.
Wie seht ihr das, gibt es eine Pattern das dieses Problem löst??
Danke & Lg
rizi
Hallo rizi,
also ich sehe kein generelles Verbot für der Modifikation von Eingangsparametern. Die Array.Sort-Methode sortiert ja auch das übergebene Array. Wichtig ist, dass das möglichst schon aus dem Namen der Methode und spätestens aus ihrer Dokumentation klar hervorgeht.
herbivore
@herbie
Danke für die schnelle Antwort, wie würde man es machen, wenn die Eingangsparameter nicht modifiziert werden dürften??
danke
rizi
Hallo rizi,
ich stehe dem Klonen von Objekten sehr skeptisch gegenüber (siehe Kopie ohne ICloneable und Kopie ohne ICloneable). Klar kann man eine Liste kopieren, kein Problem, aber beim Kopieren der Elemente der Liste wäre ich - wenn es keine Werttypen sind - sehr zurückhaltend. In deinem Beispiel würde ich den Eingabeparameter direkt modifizieren. Schon die Verwendung von += deutet darauf hin, dass es sich hier auch konzeptionell um eine Modifikation handelt. Dann solltest du auch tatsächlich besser modifizieren statt kopieren.
herbivore
DANKE SCHÖN!!!
Lg
rizi