39 votes

Enum avec des méthodes de fonctionnalité (Combine Class / Enum)

J'ai peut manquer une sorte de point d'ici, si c'est le cas, veuillez inclure cette discussion comme une partie de ma question :).

C'est un raccourci vers le bas et de la renommée de l'échantillon d'un code de travail. Le GetTicks(..) est un échantillon unique, qui pourrait être n'importe quelle sorte de fonctionnalité (valeur de > 0 < 9 doit retourner un spécifique Enum un.donc).

public static class Something
{
    public enum TypeOf : short
    {
        Minute = 2, Hour = 3, Day = 4, ........
    }

    public static long GetTicks(Something.TypeOf someEnum)
    {
        long ticks = 0;
        switch (someEnum)
        {
            case Something.TypeOf.Minute:
                ticks = TimeSpan.TicksPerMinute;
                break;
            case Something.TypeOf.Hour:
                ticks = TimeSpan.TicksPerHour;
                break;
         ....
        }
        return ticks;
    }
}


// This class is called from anywhere in the system.
public static void SomeMethod(string dodo, object o, Something.TypeOf period)
{
    // With the design above
    long ticks = Something.GetTicks(period);

    // Traditional, if there was a simple enum
    if (period == Something.Day)
        ticks = TimeSpan.FromDays(1).Ticks;
    else if (period == Something.Hour)
        ticks = TimeSpan.FromHours(1).Ticks;
}

L'idée est de collecter des fonctionnalités qui concerne un enum, près possible de la enum lui-même. L'enum est la raison de la fonction. Aussi je trouve qu'il est facile et naturel de chercher une telle fonctionnalité près de l'enum. Aussi, il est facile de les modifier ou de les étendre.

L'inconvénient que j'ai, c'est que j'ai de l'état de l'enum plus explicite Something.TypeOf. La conception peut paraître non-standard? et s'appliquerait si l'enum est pour un usage interne dans la classe.

Comment aimeriez-vous faire plus joli? J'ai essayé de résumé, de la base de l'héritage, partielle. Aucun d'entre eux semblent s'appliquer.

73voto

Michael B Points 3222

Si cela ne vous dérange pas d'écrire un peu plus, vous pouvez créer une méthode d'extension pour étendre l'interface de l'énumération.

par exemple

 public enum TimeUnit
{
   Second,
   Minute,
   Hour,
   Day,
   Year,
   /* etc */
}
public static class TimeUnitExtensions
{
    public static long InTicks(this TimeUnit myUnit)
    {
         switch(myUnit)
         {
           case TimeUnit.Second:
               return TimeSpan.TicksPerSecond;
           case TimeUnit.Minute:
               return TimeSpan.TicksPerMinute;
            /* etc */
         }
    }
}
 

Cela peut ajouter des méthodes "instance" à vos énumérations. C'est un peu plus verbeux que la plupart du temps.

N'oubliez pas qu'une énumération doit être traitée principalement comme une valeur nommée.

32voto

Jon Skeet Points 692016

C# énumérations ne marche pas comme ça. Cependant, vous pouvez mettre en place votre propre "ensemble défini de valeurs" assez facilement:

public sealed class Foo
{
    public static readonly Foo FirstValue = new Foo(...);
    public static readonly Foo SecondValue = new Foo(...);

    private Foo(...)
    {
    }

    // Add methods here
}

Il se trouve qu'un exemple, j'ai ceci est remarquablement similaire à la vôtre - DateTimeFieldType dans Noda Temps. Parfois, vous pourriez même faire la classe descellés, mais garder le constructeur privé - qui vous permet de créer des sous-classes seulement que les classes imbriquées. Très pratique pour la restriction de l'héritage.

L'inconvénient est que vous ne pouvez pas utiliser l'interrupteur :(

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X