我想重构一个随着时间的推移而变得越来越难以维护/测试的旧应用程序。基本上,应用程序需要读取文件并将其排成一行。
可以将要读取的文件与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接口。
你怎么看待这种方法,去哪儿好?是否有任何最佳实践/设计模式我应该考虑解决这个问题?