Sto costruendo un'app in C # che richiede un ID di lunghezza fissa, che è una rappresentazione in stringa di un numero esadecimale. Per esempio. "0fa5"
è un esempio di tale id di lunghezza 4. La lunghezza non dovrebbe essere modificata all'interno del programma in fase di esecuzione, ma potrebbe essere modificata in futuro o, ad esempio, nei test.
La mia domanda riguarda come affrontare la progettazione di una classe del genere. Finora sono arrivato con due metodi:
Il primo sarebbe creare una singola classe, IdType
che ha un metodo statico SetExpectedLength(int)
che dovrebbe essere chiamato una volta sola, altrimenti dà un'eccezione:
class IdType
{
public static int ExpectedLength {get; private set;} = 0;
public string Id {get; private set;} = "";
public IdType(string id)
{
if (IdType.ExpectedLength== 0)
throw new Exception("SetExpectedLength needs to be called first");
if (id.Length != IdType.ExpectedLength)
throw new Exception("Length constraints not satisfied!");
this.Id = id;
}
public static void SetExpectedLength(int length)
{
if (IdType.Length == 0)
IdType.ExpectedLength = length;
else throw new Exception("SetExpectedLength can only be called once");
}
// other operations here...
}
L'altro approccio sarebbe quello di creare una classe astratta di base e ricavare IdType
s di lunghezze diverse da essa:
abstract class IdType
{
public string Id {get; protected set;}
}
// IdType of length 4
class IdType4 : IdType
{
public readonly int Length = 4;
public IdType4(string id)
{
if (id.Length != this.Length)
throw new Exception("Length constraints not satisfied!");
this.Id = id;
}
}
Il secondo approccio sembra più pulito, tuttavia se avessi bisogno di una nuova lunghezza per gli id dovrei creare una nuova classe E sostituire l'istanza della vecchia classe ovunque sia usata.
Qual è la migliore pratica in questo caso? C'è un altro motivo di progettazione che posso usare?