我把它放在一起解析一个字符串然后在SQL存储过程中返回3个值(我有另一个C#方法根据你选择的输出格式格式化3个值,但是这个代码没有问题所以我没有发布它)。当我的老板看到我的代码时,他说:
“你如何拥有非静态类工厂方法?你需要创建 一个解析字符串以创建要使用的对象的对象?
为什么要将解析移到课堂中而不是将其留在原来的位置 并只是传回新类来保存数据?“
我做了一个新课程,但我可以轻松地将其移到另一个课程中。问题是我不知道他的非静态工厂方法是什么意思,而且我不知道如何分配Value,Fraction和Direction而不像我那样创建一个新的TwpRng实例 :TwpRng result = new TwpRng();
这是我在c#BTW的第一次破解。
public class TwpRng
{
public string Value;
public string Fraction;
public string Direction;
public TwpRng GetValues(string input)
{
TwpRng result = new TwpRng();
result.Value = "";
result.Fraction = "";
result.Direction = "";
Regex pattern_1 = new Regex(@"(?i)^\s*(?<val>\d{1,3})(?<frac>[01235AU])(?<dir>[NEWS])\s*$"); // Example: 0255N
Match match_1 = pattern_1.Match(input);
Regex pattern_2 = new Regex(@"(?i)^\s*(?<val>\d{1,3})(?<dir>[NEWS])\s*$"); // Example: 25N
Match match_2 = pattern_1.Match(input);
Regex pattern_3 = new Regex(@"(?i)^\s*(?<val>\d{1,3})(?<frac>[01235AU])\s*$"); // Example: 25A
Match match_3 = pattern_1.Match(input);
if (match_1.Success)
{
result.Value = match_1.Groups["val"].Value;
result.Fraction = match_1.Groups["frac"].Value;
result.Direction = match_1.Groups["dir"].Value.ToUpper();
}
else if (match_2.Success)
{
result.Value = match_2.Groups["val"].Value;
result.Direction = match_2.Groups["dir"].Value.ToUpper();
}
else if (match_3.Success)
{
result.Value = match_3.Groups["val"].Value;
result.Fraction = match_1.Groups["frac"].Value;
}
else
{
result = null;
}
return result;
}
}
答案 0 :(得分:1)
您如何拥有非静态类工厂方法?您需要创建一个对象来解析字符串以创建要使用的对象吗?
他的意思是,目前为了解析输入,您需要这样做:
var twpRng = new TwpRng(); // Doesn't really make sense to instantiate an empty object
twpRng = twpRng.GetValues(input); // just to create another one.
如果您使用工厂方法GetValues
static:
public static TwpRng GetValues(string input)
您可以更轻松地解析:
var twpRng = TwpRng.GetValues(input);
答案 1 :(得分:0)
如果你改变:
public TwpRng GetValues(string input)
为:
public static TwpRng GetValues(string input)
您已从非静态工厂模式更改为静态工厂模式。两者的调用顺序如下:
TwpRng myRng = new TwpRng();
TwpRng createdRng = myRng.GetValues(input);
而不是:
TwpRng createdRng = TwpRng.GetValues(input);
其余代码可以是相同的。
扩展说明
老板问的是使用静态修饰符。静态方法可以在不首先实例化(创建实例)类的情况下调用,并且通常用于解析数据并返回类的完全水合的实例。静态方法也可以用于实用程序类和方法(实例化对象可能过度杀伤),并且您只想对一组功能进行分组。