Un compañero desarrollador sugirió que almacenamos una selección de los días de la semana como cadena de 7 caracteres de 1 y 0, es decir, “1000100” para el lunes y el viernes. Preferí (y sugerí fuertemente) una solución con Flags enum y operaciones bit a bit, creo que es una forma más limpia de hacerlo, y debería ser más fácil de entender para otros desarrolladores.Banderas enumeración y operaciones bit a bit frente a “cadena de bits”
[Flags()]
public enum Weekdays : int
{
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday = 64
}
Sin embargo, cuando empecé a implementar una solución de la muestra, me di cuenta de que tal vez el enfoque de cadena sencilla era más fácil después de todo: Ciertamente, la cadena de bits es más evidente que “17” si usted está mirando los datos. Y me encuentro con las operaciones de C# bit a bit contrario a la intuición y extremadamente detallado:
Weekdays workDays = Weekdays.Monday | Weekdays.Tuesday;
if ((workDays & Weekdays.Monday) == Weekdays.Monday)
{...}
Por supuesto, esto podría ser envuelto muy bien en los métodos de extensión, pero luego de repente nos terminan con al menos el mismo número de líneas de código al igual que con la solución de cadena, y no puedo argumentar que el código bit a bit es más fácil de leer.
Dicho esto, todavía me gustaría ir con una enumeración banderas y operaciones bit a bit. Los principales beneficios que se me ocurren son
- Mejor rendimiento
- Menos espacio necesario para el almacenamiento
Entonces, ¿cómo puedo vender la solución bit a bit a mis colegas? ¿Debería? ¿Cuáles son los otros beneficios de usar este método sobre cadenas? Después de completar el proyecto de muestra, descubrí que el equipo aún optó por la solución basada en cadenas. Necesito algunos argumentos mejores/más fuertes. ¿Por qué debería usar enunciados de banderas en lugar de simples cadenas de bits?
no se ocupa de su pregunta, pero ¿por qué crear su propia enumeración de esto cuando ya hay 'System.DayOfWeek'? –
Los valores enumeraciones System.DayOfWeek son de 0 a 6, no múltiplos de 2 (1, 2, 4, 8, 16, 32 y 64) que necesito para hacer las operaciones bit a bit (AFAIK). Además, LUNES es el primer día de la semana. :) –
Para reducir detallado, se puede escribir: 'if ((días de trabajo y Weekdays.Monday) = 0)' –