我正在编写一个从给定文件中解析文本的类。有几种不同的文本“类型”,每种的解析规则都不同。
例如,一种类型的文本,我们将称之为“纯文本”,是一个简单的字符串,解析器会为其去除额外的空格。因此,例如,如果我有 "The quick brown fox\r\njumped over the lazy brown dogs\r\n"
,解析器只会返回"The quick brown fox jumped over the lazy brown dogs"
(换行符转换为单个空格)。
其他文本代表具有给定分隔符的表,因此它可能看起来像"First Name,Last Name,DOB"
,并且解析器的工作是返回一个包含每个逗号分隔值的数组。
(实际实现比这更复杂,但这是一个很好的简化)。
最初我打算通过创建一个名为类似TextType
、 值PlainText
和的枚举来解决这个问题TableText
。然后我可以有一个看起来像的方法
public string ParseText(string textToParse, TextType textType)
我很快意识到这不起作用,因为当 textType 是 PlainText 时,返回值应该是 a string
,但是当 textType 是 TableText 时,返回值应该是 a string[]
。
一种选择是始终返回一个字符串 [] 并且将其作为一个给定的,即 PlainText 将始终返回一个大小为 1 的数组。不过我对此并不感到太兴奋,因为它在语义上似乎不正确并且可能是令人困惑。
另一种选择是为每个 TextType 编写一个方法,这样我就可以
public string ParsePlainText(string textToParse)
和
public string[] ParseTableText(string textToParse)
我不喜欢这种方法的原因是它消除了原始方法与枚举提供的一些灵活性。例如,预计我稍后会添加其他文本类型;将来我可能会有一种客户希望识别为 HeadingText 的文本类型,但会以与纯文本相同的方式进行解析。使用原始方法,包含解析方法的类的公共接口不必更改,因为我只需向TextType
枚举并修改 ParseText 方法的内部结构。此外,我认为当只有一个方法可以调用时,它只是一个更简洁的界面,客户端只需传递 TextType(他知道),其他一切都为他处理(而不是必须从类似命名的列表中选择)每次添加新文本类型时都会增长的方法)。
最后,我可以只返回一个既可以继承string
又可以string[]
继承的对象(因为这是 C#,我可以直接 return object
),并让客户端转换为适当的类型。我认为这是最糟糕的方法,因为它要求客户端知道应该“实际”返回什么,并且通过更改从 Parse 类返回的类型并且直到运行时才遇到结果错误,有很大的潜力让某人打破每个依赖项(因为基本上没有类型检查开始)。
对于这种情况,是否有“正确”或最佳的方法?