@ W92 が述べたように、ファクトリを使用して解析戦略を返すことは一般的なアプローチです。個別の戦略は、各タイプに必要な解析ロジックをカプセル化します。AC# の例...
var serialNumber = "20202|5666|00020|31";
var factory = new SerialParserFactory();
var parser = factory.GetParser(serialNumber);
IParsingResult result = parser.ParseSerial(serialNumber);
すべてのパーサーは、IParsingResult を返す ParseSerial という 1 つのメソッドを持つ共通のインターフェイスを実装しています。パーサーは、必要に応じて単純にすることも複雑にすることもできます。
public interface ISerialParser
{
IParsingResult ParseSerial(string serialNumber);
}
public class SerialParserType2: ISerialParser
{
public IParsingResult ParseSerial(string serialNumber)
{
string[] parts = serialNumber.Split("|".ToCharArray());
int[] fields = new int[parts.Length-2];
for (int partIndex = 0; partIndex < parts.Length-1; partIndex++)
{
int value = 0;
if (!int.TryParse(parts[partIndex], out value))
{
value = 0;
}
fields[partIndex] = value;
}
int checkSum = 0;
if (!int.TryParse(parts[parts.Length-1], out checkSum))
{
checkSum = 0;
}
return new Type2Result
{
Fields = fields,
CheckSum = checkSum
};
}
}
結果と同じ...
public class Type2Result: IParsingResult
{
public int[] Fields { get; set; }
public int CheckSum { get; set; }
}
この場合、工場は単純になる可能性があります...
public class SerialParserFactory
{
public ISerialParser GetParser(string serialNumber)
{
string typeChar = serialNumber.Substring(0, 1);
switch (typeChar)
{
case "2":
return new SerialParserType2();
}
return new NotFoundParser();
}
}