Diese Strategie beinhaltet das Ersetzen von Folgendem:
public class Politician
{
public const int Infidelity = 0;
public const int Embezzlement = 1;
public const int FlipFlopping = 2;
public const int Murder = 3;
public const int BabyKissing = 4;
public int MostNotableGrievance { get; set; }
}
Mit:
public class Politician
{
public MostNotableGrievance MostNotableGrievance { get; set; }
}
public class MostNotableGrievance
{
public static readonly MostNotableGrievance Infidelity = new MostNotableGrievance(0);
public static readonly MostNotableGrievance Embezzlement = new MostNotableGrievance(1);
public static readonly MostNotableGrievance FlipFlopping = new MostNotableGrievance(2);
public static readonly MostNotableGrievance Murder = new MostNotableGrievance(3);
public static readonly MostNotableGrievance BabyKissing = new MostNotableGrievance(4);
public int Code { get; private set; }
private MostNotableGrievance(int code)
{
Code = code;
}
}
Warum genau ist dies der Aufzählung des Typs vorzuziehen?
public class Politician
{
public MostNotableGrievance MostNotableGrievance { get; set; }
}
public enum MostNotableGrievance
{
Infidelity = 0,
Embezzlement = 1,
FlipFlopping = 2,
Murder = 3,
BabyKissing = 4
}
Dem Typ ist kein Verhalten zugeordnet, und wenn dies der Fall wäre, würden Sie sowieso einen anderen Refactoring-Typ verwenden, z. B. "Typcode durch Unterklassen ersetzen" + "Bedingt durch Polymorphismus ersetzen".
Der Autor erklärt jedoch, warum er diese Methode missbilligt (in Java?):
Numerische Typcodes oder Aufzählungen sind ein häufiges Merkmal von C-basierten Sprachen. Mit symbolischen Namen können sie gut lesbar sein. Das Problem ist, dass der symbolische Name nur ein Alias ist. Der Compiler sieht immer noch die zugrunde liegende Nummer. Der Compilertyp prüft anhand der Nummer 177 und nicht anhand des symbolischen Namens. Jede Methode, die den Typcode als Argument verwendet, erwartet eine Zahl, und es gibt nichts, was die Verwendung eines symbolischen Namens erzwingen könnte. Dies kann die Lesbarkeit beeinträchtigen und zu Fehlern führen.
Wenn Sie jedoch versuchen, diese Anweisung auf C # anzuwenden, scheint diese Anweisung nicht wahr zu sein: Sie akzeptiert keine Zahl, da eine Aufzählung tatsächlich als Klasse betrachtet wird. Also der folgende Code:
public class Test
{
public void Do()
{
var temp = new Politician { MostNotableGrievance = 1 };
}
}
Wird nicht kompiliert. Kann dieses Refactoring in neueren Hochsprachen wie C # als unnötig angesehen werden, oder denke ich nicht über etwas nach?
var temp = new Politician { MostNotableGrievance = MostNotableGrievance.Embezzlement };