3

我有两种类似的方法来解析行。第一种方法

 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

我认为,您可以为此 Line Classes 创建通用合同(接口),并使用例如通用方法。

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);
   ...
}

最后一个示例更类似于策略模式。

于 2012-05-04T13:25:48.527 回答