Come progettare una classe per un ID di lunghezza fissa?

1

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?

    
posta Nini Michaels 08.08.2015 - 12:32
fonte

3 risposte

1

The second approach seems more clean, however if I need a new length for the ids I would have to make a new class AND replace the instance of the old class everywhere it is used

Hai già dato i due argomenti chiari per cui questo è esattamente l'opposto di essere pulito. Quindi dovresti evitare derivazioni specifiche per lunghezze specifiche. Tuttavia, hai scritto

length would not need to change within the program at runtime

quindi perché non basta impostare la lunghezza corrente come costante e impostarla su 4 in un'unica posizione nel codice? Quando in seguito avrai bisogno di lunghezze diverse, quello sarà l'unico posto che dovrai modificare e la necessità di un metodo come SetExpectedLength verrà rimossa. Se è necessario modificare la lunghezza prevista una volta all'avvio del programma, allora la soluzione 1 va bene.

La domanda a cui devi rispondere è se ti aspetti uno scenario futuro in cui devi sostituire 4, ad esempio 5, per tutti gli ID nel tuo programma o uno scenario in cui hai entrambi i tipi di ID da trattare con simultaneamente. Se quest'ultimo è il caso, dovresti fare affidamento sul fatto che la stringa passata sia della lunghezza 4 o 5 corretta

    
risposta data 09.08.2015 - 10:22
fonte
1

Il tuo codice è troppo complicato per un requisito così semplice. Questo perché ti stai concentrando sulla rappresentazione (quattro caratteri esadecimali) quando dovresti concentrarti sulla cosa rappresentata, che è semplicemente un intero di due byte. Un c # ushort è precisamente quel tipo.

Per praticità, puoi creare una struct (non una classe) che contiene un breve e metodi per convertire in / da una stringa esadecimale a quattro byte.

Se hai bisogno di precisione arbitraria, usa invece System.Numerics.BigInteger. BigInteger ha già metodi per convertire da e verso le stringhe.

    
risposta data 09.08.2015 - 23:18
fonte
-3

I'm building an app in C# that needs a fixed-length id, which is a string representation of a hex number.

Quindi usa una stringa. Qualsiasi altra cosa è una perdita di tempo.

Il giorno in cui trovi che in qualche modo hai passato una stringa di codice ID di lunghezza errata, aggiungi un metodo di estensione per controllare la lunghezza della stringa.

    
risposta data 10.08.2015 - 03:21
fonte

Leggi altre domande sui tag