确保可维护性和文件处理应用程序中的可测试性

时间:2015-12-13 16:24:06

标签: vb.net

问题

我想重构一个随着时间的推移而变得越来越难以维护/测试的旧应用程序。基本上,应用程序需要读取文件并将其排成一行。

可以将要读取的文件与CSV文件进行比较,其中第一个字段确定行的类型,如下所示:

1,abcd,... 
1,3423,... 
2,"abc",... 
5,test,...

目前应用程序的工作原理如下(伪代码):

For Each line in file.getLines()
  if (line.StartsWith("1,") then
    ' Process line of type 1
  elseif (line.StartsWith("2,") then
    ' Process line of type 2
  ...
  End If
Next

这显然是维持和测试的噩梦。因此,我想重构整个事情并想到这样做:

  • 为每个行类型
  • 创建一个解析器
  • 让每个解析器将自己注册到一个处理程序,它将为每一行引发一个事件

代码构思

处理程序:

Public Class ParserHandler

  Public Event Parse(RepLine As ReportLine)
  Public Event FileFinished()

  Public Sub RaiseParse(RepLine As ReportLine)
      RaiseEvent Parse(RepLine)
  End Sub

  Public Sub RaiseFileFinished()
      RaiseEvent FileFinished()
  End Sub

End Class

分析器:

Public Class FirstParser

  Public Sub New(Handler As ParserHandler)
      AddHandler Handler.Parse, AddressOf Parse
      AddHandler Handler.FileFinished, AddressOf FileFinished
  End Sub

  Public Sub Parse(RepLine As ReportLine)
      If Not RepLine.Type = 1 Then
          Return
      End If

      ' Process
    End Sub

  Private Sub FileFinished()
    ' Final stuff, eg. insert into DB
  End Sub

End Class

主:

Dim ParserHandler As New ParserHandler()
Dim FirstParser As New FirstParser(ParserHandler)
Dim SecondParser As New SecondParser(ParserHandler)
...

For Each line in file.getLines()
  ' Extract Id and construct ReportLine-object here
  ParserHandler.RaiseParse(ReportLine)
Next

我认为这看起来比原版更好,但我仍然不相信这是真正的方法。在使用单元测试测试解析器的情况下,我仍然必须首先创建一个处理程序。这可能没问题,但感觉错误,因为解析器应该单独测试(这是错误的吗?)。

我喜欢在这种情况下使用事件,因为并非每个解析器都需要实现处理程序的每个可能事件,这使我无法使用IParser接口。

你怎么看待这种方法,去哪儿好?是否有任何最佳实践/设计模式我应该考虑解决这个问题?

0 个答案:

没有答案