Qual è un'alternativa alle bandiere bit a bit?

3

Stavo cercando di essere elegante ed elegante, e ho finito col spararmi ai piedi codificando la mia intera applicazione per usare i flag per memorizzare varie combinazioni di impostazioni.

Ora, ho raggiunto un punto in cui ho > 64 opzioni. Ho bisogno di allontanarmi dalle bandiere o sarò costretto a creare campi aggiuntivi, che renderanno la mia applicazione davvero disordinata dato il suo stato attuale.

Che cosa dovrei considerare un'alternativa all'utilizzo di flag diversi dalla creazione di una variabile booleana separata per ogni opzione?

Aggiorna

Per flag, intendo flag bit a bit, ad esempio:

[Flags]
public enum Time
{
    None = 0
    Flag1 = 1,
    Flag2 = 2,
    Flag3 = 4,
    // ...
    Flag63 = ...
}
    
posta arao6 28.10.2014 - 04:12
fonte

2 risposte

0

È possibile utilizzare un oggetto BitArray in combinazione con campi statici per fornire etichette per i bit:

static class Flags
{
  public static int WorkProperly = 0;
  public static int CompileFaster = 1;
  public static int AutoImproveCodeQuality = 2;
}

class FlagTest
{
  static void Main(string[] args)
  {
    BitArray bits = new BitArray(100); // > 64
    bits[Flags.AutoImproveCodeQuality] = true;
  }
}

Oppure, con un enum, ma dovresti trasmettere il valore ogni volta:

enum Flags
{
  Never = 0,
  MostOfTheTime,
  Sometimes,
  OddThursdays,
  WhenPigsFly
}

...

BitArray bits = new BitArray(1000); // lots of bits
bits[(int)Flags.Sometimes] = true;
    
risposta data 28.10.2014 - 04:39
fonte
5

Se disponi di molte opzioni, scopri se puoi:

  • riduci il numero. Che ne dici di fare un'ipotesi invece di fare qualcosa di configurabile?
  • raggruppa le opzioni insieme. Vedi questa risposta a Un singolo oggetto di configurazione è una cattiva idea? :

    If you need to change the config class you may have to visit every instance in which it is used and check that you haven't broken anything.

    One way to deal with this is to create multiple interfaces that expose parts of the config object that are needed by different parts of the app. Rather than allowing other classes to access the config object, you pass instances of an interface to the classes that need it. That way, the parts of the app that use config depend on the smaller collection of fields in the interface rather than the whole config class.

risposta data 28.10.2014 - 06:58
fonte

Leggi altre domande sui tag