In diesem zweiten Beitrag zum Thema “Do’s and Don’ts” möchte ich ein Szenario ansprechen, welches mich erst vor kurzem in meinem ArmyGen Projekt beschäftigt hat. Es geht um das “Klonen” von Objekten. Das .NET Framework bietet nur ein Interface, welches sich “IConeable” nennt, an um das Klonen von Objekten einzubinden. Unglücklicherweise besagt die einzige Methode in diesem Interface (“Clone()“) nicht um welche Art des Klonens es sich dabei handelt.
Man unterscheidet nämlich zwischen dem “DeepClone” und dem “ShallowClone”. Beim Deepclone soll eine Kopie des Objektes entstehen und hinzu sollen alle referenzierten Objekte in diesem Objekt ebenfalls rekursiv kopiert werden. Beim ShallowClone hingegen soll lediglich ein Teil des Objektes kopiert werden und der Rest sollen vorhandene Referenzen sein. Also :
DON’T !
public MyClass : ICloneable
{
public void Clone()
{
//logik
}
}
DO !
public MyClass : IDeepCloneable // oder : IShallowCloneable
{
public void DeepClone()
{
//logik
}
}
Hintergrund von dem ganzen ist einfach, dass später beim Implementieren von “ICloneable” niemand genau sagen könnte welche Art von Klon denn nun gemacht wird und das wiederrum würde natürlich zusätzlichen Aufwand und schlechte Lesbarkeit nach sich ziehen. Witzig auch : Im Buch “Framework Design Guidelines” steht extra drin, dass man das Interface “ICloneable” nicht implementieren soll.
Die beiden Interfaces “IDeepCloneable” und “IShallowCloneable” müssen natürlich selbst erstellt werden, da sich nicht Bestandteil des .NET Frameworks sind.
Deutsch
Englisch


Leave a Reply