There are several possible steps you can take to increase readability to your code, depending on how much control of the code you have and how much implementation details you which to hide.
Separate default values from database loading logic
By initializing setupConfiguration
with default values by named properties and moving the database loading logic into a LoadFromDatabase()
method you increase readability of the defaults:
var setupConfiguration = Configuracion.LoadFromDatabase(new NRG96.SetupConfiguration
{
PRIMARY_VOLTAGE = 1,
SECONDARY_VOLTAGE = 1,
PRIMARY_CURRENT = 1,
VOLTAGE_TYPES = "SIMPLES",
MAIN_DEFAULT_SCREEN = SetupConfiguration.MainDefaultScreens.One,
ENERGY_DEFAULT_SCREEN = SetupConfiguration.EnergyDefaultScreens.One,
HARMONIC_CALCULUS = "THD",
BACKLIGHT_SHUTDOWN_TIME = 1
});
I'm assuming SetupConfiguration
can be defined by something like:
public class SetupConfiguration
{
public int PRIMARY_VOLTAGE { get; set; }
public ushort SECONDARY_VOLTAGE { get; set; }
public ushort PRIMARY_CURRENT { get; set; }
public string VOLTAGE_TYPES { get; set; }
public MainDefaultScreens MAIN_DEFAULT_SCREEN { get; set; }
public EnergyDefaultScreens ENERGY_DEFAULT_SCREEN { get; set; }
public string HARMONIC_CALCULUS { get; set; }
public byte BACKLIGHT_SHUTDOWN_TIME { get; set; }
// Doesn't get saved to database because no public setter
public bool HARMONIC_CALCULUS_IS_THD { get { return (HARMONIC_CALCULUS ?? "").ToUpper() == "THD"; } }
public enum MainDefaultScreens
{
One = 1,
Two
}
public enum EnergyDefaultScreens
{
One = 1,
Second
}
}
LoadFromDatabase()
could then be implemented by:
public static SetupConfiguration LoadFromDatabase(SetupConfiguration defaultValues)
{
return new SetupConfiguration
{
PRIMARY_VOLTAGE = (int)GetDouble("PRIMARY_VOLTAGE", defaultValues.PRIMARY_VOLTAGE, ParamUnidad.SinUnidad),
SECONDARY_VOLTAGE = (ushort)GetDouble("SECONDARY_VOLTAGE", defaultValues.SECONDARY_VOLTAGE, ParamUnidad.SinUnidad),
PRIMARY_CURRENT = (ushort)GetDouble("PRIMARY_CURRENT", defaultValues.PRIMARY_CURRENT, ParamUnidad.SinUnidad),
VOLTAGE_TYPES = GetString("VOLTAGE_TYPES", defaultValues.VOLTAGE_TYPES, ParamUnidad.SinUnidad),
MAIN_DEFAULT_SCREEN = (SetupConfiguration.MainDefaultScreens)GetDouble("MAIN_DEFAULT_SCREEN", (int)defaultValues.MAIN_DEFAULT_SCREEN, ParamUnidad.SinUnidad),
ENERGY_DEFAULT_SCREEN = (SetupConfiguration.EnergyDefaultScreens)GetDouble("ENERGY_DEFAULT_SCREEN ", (int)defaultValues.ENERGY_DEFAULT_SCREEN, ParamUnidad.SinUnidad),
HARMONIC_CALCULUS = GetString("HARMONIC_CALCULUS", defaultValues.HARMONIC_CALCULUS, ParamUnidad.SinUnidad),
BACKLIGHT_SHUTDOWN_TIME = (byte)GetDouble("BACKLIGHT_SHUTDOWN_TIME", defaultValues.BACKLIGHT_SHUTDOWN_TIME, ParamUnidad.SinUnidad)
};
}
Cleaning up database loading logic with helper methods
LoadFromDatabase()
could be furter cleaned up by creating a couple of helper methods to do the actual loading from database:
static int Get(string name, int defaultValue) { return (int)GetDouble(name, defaultValue, ParamUnidad.SinUnidad); }
static byte Get(string name, byte defaultValue) { return (byte)GetDouble(name, defaultValue, ParamUnidad.SinUnidad); }
static ushort Get(string name, ushort defaultValue) { return (ushort)GetDouble(name, defaultValue, ParamUnidad.SinUnidad); }
static string Get(string name, string defaultValue) { return GetString(name, defaultValue, ParamUnidad.SinUnidad); }
public static SetupConfiguration LoadFromDatabase(SetupConfiguration defaultValues)
{
return new SetupConfiguration
{
PRIMARY_VOLTAGE = Get("PRIMARY_VOLTAGE", defaultValues.PRIMARY_VOLTAGE),
SECONDARY_VOLTAGE = Get("SECONDARY_VOLTAGE", defaultValues.SECONDARY_VOLTAGE),
PRIMARY_CURRENT = Get("PRIMARY_CURRENT", defaultValues.PRIMARY_CURRENT),
VOLTAGE_TYPES = Get("VOLTAGE_TYPES", defaultValues.VOLTAGE_TYPES),
MAIN_DEFAULT_SCREEN = (SetupConfiguration.MainDefaultScreens)Get("MAIN_DEFAULT_SCREEN", (int)defaultValues.MAIN_DEFAULT_SCREEN),
ENERGY_DEFAULT_SCREEN = (SetupConfiguration.EnergyDefaultScreens)Get("ENERGY_DEFAULT_SCREEN ", (int)defaultValues.ENERGY_DEFAULT_SCREEN),
HARMONIC_CALCULUS = Get("HARMONIC_CALCULUS", defaultValues.HARMONIC_CALCULUS),
BACKLIGHT_SHUTDOWN_TIME = Get("BACKLIGHT_SHUTDOWN_TIME", defaultValues.BACKLIGHT_SHUTDOWN_TIME)
};
}
Automating database loading logic by reflecting on the configuration objects
Finally, if you want true magic and can make sure the configuration classes properties are named as in the database, you can automate LoadFromDatabase()
with something like:
public static T LoadFromDatabase<T>(T defaultValues) where T : class, new()
{
var result = new T();
var getters = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
foreach (var property in getters)
{
if (property.GetMethod != null && property.GetMethod.IsPublic
&& property.SetMethod != null && property.SetMethod.IsPublic)
{
var defaultValue = property.GetValue(defaultValues);
if (property.PropertyType.Equals(typeof(int)))
{
var value = (int)GetDouble(property.Name, (int)defaultValue, ParamUnidad.SinUnidad);
property.SetValue(result, value);
}
else if (property.PropertyType.Equals(typeof(byte)))
{
var value = (byte)GetDouble(property.Name, (byte)defaultValue, ParamUnidad.SinUnidad);
property.SetValue(result, value);
}
else if (property.PropertyType.Equals(typeof(ushort)))
{
var value = (ushort)GetDouble(property.Name, (ushort)defaultValue, ParamUnidad.SinUnidad);
property.SetValue(result, value);
}
else if (property.PropertyType.Equals(typeof(string)))
{
var value = GetString(property.Name, (string)defaultValue, ParamUnidad.SinUnidad);
property.SetValue(result, value);
}
else if (property.PropertyType.BaseType.Name == "Enum")
{
var value = (int)GetDouble(property.Name, (int)defaultValue, ParamUnidad.SinUnidad);
property.SetValue(result, value);
}
}
}
return result;
}
... and call the method with:
var setupConfiguration = NRG96.Configuracion.LoadFromDatabase<NRG96.SetupConfiguration>(new NRG96.SetupConfiguration
{
PRIMARY_VOLTAGE = 1,
SECONDARY_VOLTAGE = 1,
PRIMARY_CURRENT = 1,
VOLTAGE_TYPES = "SIMPLES",
MAIN_DEFAULT_SCREEN = SetupConfiguration.MainDefaultScreens.One,
ENERGY_DEFAULT_SCREEN = SetupConfiguration.EnergyDefaultScreens.One,
HARMONIC_CALCULUS = "THD",
BACKLIGHT_SHUTDOWN_TIME = 1
});
Loading all different configuration objects from the database could then be achieved without changing LoadFromDatabase<>()
.
Configuracion.GetDouble()
et al do? Can it be simplified to make this code less verbose? \$\endgroup\$