题
像大多数软件一样,用户可以指定他们希望如何处理某些事情。就我而言,用户可以指定他们喜欢哪种格式。有3个选项,不形式,骆驼盒或适当的案例。我目前的工作正常,但感觉非常笨拙和重复。这是班级的JIST。
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;
}
}
该方法本身并没有真正笨拙。这就是被称为的方式。每次我想获得格式化文本时,总是必须通过用户偏好似乎是最好的选择。我会更好地完成定期课程并通过构造函数传递应用程序首选项对象吗?
谢谢你。
解决方案
一种选择是创建某种工厂类,然后可以使用包含首选项的类或从类的实例实例化工厂类。
使用工厂类,您可以获得一个文本形式,返回的格式化器的实例将取决于首选项。
这是一个非常简单的示例,只是用一些代码来澄清我的答案。这不是超级花哨的,并且可以使用更多的sofativation模式,但希望这是正确的起点。
定义接口和一些格式
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");
不隶属于 StackOverflow