How to implement a strategy template?

I have two similar methods for parsing strings. first method

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

And second

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

Is it possible to implement this template?

+3
source share
1 answer

As I think, you can create a common contract (interface) for these linear classes and use, for example, a common method.

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

Or you can create an IParser and enter it in a method

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

The last example is more like a strategy template.

0
source

All Articles