3

行を解析するための2つの同様の方法があります。最初の方法

 public IList<LasLine> GetLasLines(string section)
        {
            var lasLines = new List<LasLine>();
            bool startParse = false; // Секція знайдена і почати парсити її
            foreach(var line in _lines)
            {
                if(GetSectionName(line).Equals(section) && !startParse)
                {
                    startParse = true;
                }
                else
                {
                    if(IsCommentLine(line)) continue; 
                    if(IsBeginSection(line)) break; 
                    LasLine lasLine;
                    if(!TryParseLasLine(line, out lasLine)) continue; 
                    lasLines.Add(lasLine); 
                }
            }
            return lasLines;
        }

そして第二に

public IList<AsciiLogDataLine> GetAsciiLogData()
{
var asciiLogData = new List<AsciiLogDataLine>();
bool startParse = false; 
foreach(var line in _lines)
{
if(GetSectionName(line).Equals(LasSectionName.ASCIISection) && !startParse)
{
startParse = true;
}
else
{
    if(IsCommentLine(line)) continue; 
    AsciiLogDataLine asciiLogDataLine;
    if(!TryParseAsciiLogDataLine(line, out asciiLogDataLine)) continue;                         asciiLogData.Add(asciiLogDataLine);          
              }
    }
    return asciiLogData;
    }

このパターンを実装することは可能ですか?

4

1 に答える 1

0

私が思うに、この回線クラスに共通のコントラクト (インターフェイス) を作成し、たとえばジェネリック メソッドを使用できます。

IEnumerable<IDataLine> GetLines<T>(Func<object> parseFunction)
{
   ...
   var dataLine = parseFunction(line);
   if (dataLine == null)
   {
       continue;
   }
   ...
}

または、IParser を作成してメソッドに挿入することもできます

IEnumerable<IDataLine> GetLines<T>(IParser parser)
{
   ...
   if (!parser.CanParse(line))
   {
        continue;
   }
   var dataLine = parser.Parse(line);
   ...
}

Strategy パターンにより近い最後のサンプル。

于 2012-05-04T13:25:48.527 に答える