Ho letto alcune delle domande correlate su come possiamo rifattorizzare un codice in base alle dichiarazioni if/else if
per seguire da vicino i principi OOP
, ma ho difficoltà ad applicarlo a un caso d'uso concreto.
Ho la seguente classe base:
public class Human
{
public bool IsMother { get; set; }
public bool IsFather { get; set; }
public bool Isdaughter { get; set; }
public bool IsSon { get; set; }
public string WhatAmI { get; set; }
}
e diverse classi derivate:
public class Parent : Human
{
public Parent()
{
WhatAmI = "Parent";
}
}
public class Daughter : Human
{
public Daughter()
{
WhatAmI = "Daughter";
}
}
public class Son : Human
{
public Son()
{
WhatAmI = "Son";
}
}
Quindi, in base a diverse condizioni, dovrei restituire un tipo specifico di Human.
per esempio se ho questo:
var human = new Human();
human.IsFather = false;
human.IsMother = false;
human.IsSon = true;
human.Isdaughter = false;
var newHuman = HumanHelper.GetHuman(human);
Console.WriteLine(newHuman.WhatAmI);
l'output della console è "Son" che è corretto ma l'implementazione del metodo GetHuman(Human human)
mi dà fastidio a causa dell'abuso di dichiarazioni if-else
. E l'implementazione concreta è questa:
public static class HumanHelper
{
private static string kindOfHuman = ConfigurationManager.AppSettings["kindOfHuman"];
public static Human GetGuman(Human human)
{
if (kindOfHuman == "parent")
{
if (human.IsMother || human.IsFather)
{
return new Parent();
}
}
else if (kindOfHuman == "child")
{
if (!human.IsMother && !human.IsFather)
{
if (human.Isdaughter)
{
return new Daughter();
}
else if (human.IsSon)
{
return new Son();
}
}
}
throw new ArgumentException("Should not get here");
}
}
È difficile da leggere e penso che sto facendo qualcosa di semplice e relativamente standard in un modo non semplice e non standard. Quindi potresti aiutarmi a migliorare questo codice?