Как вы обрабатываете пользовательские настройки?
Как и большинство программного обеспечения, пользователи могут указать, как они хотели бы обрабатывать определенные вещи. В моем случае пользователи могут указать, какое форматирование они предпочитают. Есть 3 варианта, оставить неформатным, верблюжий случай или надлежащий случай. У меня в настоящее время это работает, но это чувствует себя очень неуклюжим и повторяющимся. Вот список класса.
public static class Extensions
{
public static string GetPreferenceFormattedText(this string text, ApplicationPreferences applicationPreferences, bool pluralize)
{
if (applicationPreferences.FieldNamingConvention.Equals(FieldNamingConvention.SameAsDatabase))
return text;
string formattedText = text.Replace('_', ' ');
formattedText = formattedText.MakeTitleCase();
formattedText = formattedText.Replace(" ", "");
if (applicationPreferences.FieldNamingConvention.Equals(FieldNamingConvention.Prefixed))
return applicationPreferences.Prefix + formattedText;
return applicationPreferences.FieldNamingConvention.Equals(FieldNamingConvention.CamelCase)
? formattedText.MakeFirstCharLowerCase()
: formattedText;
}
}
Сам метод на самом деле не кажется неуклюжим. Это то, как это называется. Постоянная необходимость передавать пользовательские настройки каждый раз, когда я хочу получить отформатированный текст, кажется не лучшим способом. Было бы лучше сделать обычный класс и передать объект предпочтений приложения через конструктор?
Спасибо.
1 ответ
Одним из вариантов может быть создание какого-то класса фабрики, затем вы можете создать экземпляр класса фабрики с помощью экземпляра класса, содержащего настройки, или из него.
Используя фабричный класс, вы можете получить TextFormatter, экземпляр возвращаемого форматера будет зависеть от предпочтений.
Вот очень простой пример, чтобы уточнить мой ответ с помощью некоторого кода. Это не супер фантазия и потенциально может использовать более изощренные шаблоны, но, надеюсь, это правильная отправная точка.
Определите интерфейс и некоторые форматеры
public interface IIdentifierFormatter
{
string FormatText(string text);
}
public class UnformattedIdenifierFormatter : IIdentifierFormatter
{
public string FormatText(string text)
{
return text;
}
}
public class CamelCaseIdenifierFormatter : IIdentifierFormatter
{
public string FormatText(string text)
{
// Camel case formatting here
return text;
}
}
public class ProperCaseIdenifierFormatter : IIdentifierFormatter
{
public string FormatText(string text)
{
// Proper case formatting here
return text;
}
}
Теперь образец класса настроек
enum NamingConvention
{
Unformatted,
CamelCase,
ProperCase
}
public class Preferences
{
public NamingConvention FieldNamingConvention { get; set; }
// .. Other settings
// Function to get the formatter depending on the FieldNamingConvention
public IIdentifierFormatter GetFieldNameFormatter()
{
switch (FieldNamingConvention)
{
case NamingConvention.Unformatted:
return new ProperCaseIdenifierFormatter();
case NamingConvention.CamelCase:
return new ProperCaseIdenifierFormatter();
case NamingConvention.ProperCase:
return new ProperCaseIdenifierFormatter();
default:
throw new Exception("Invalid or unsupported field naming convention.");
}
}
}
Используя код
// Preferences loaded from some source,
// for the example I just initialized it here.
Preferences pref = new Preferences();
pref.FieldNamingConvention = NamingConvention.CamelCase;
// Get the formatter
IIdentifierFormatter formatter = pref.GetFieldNameFormatter();
string formatted = formatter.FormatText("the_name_to_format");