簡體   English   中英

設計具有類似功能但返回類型不同的方法

[英]Designing methods with similar functionality but different return types

我正在編寫一個解析給定文件中的文本的類。 文本有一些不同的“類型”,解析規則各有不同。

例如,一種類型的文本,我們將只調用“純文本”,是一個簡單的字符串,解析器會刪除額外的空格。 因此,例如,如果我有"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的枚舉來實現這個TextType ,其值為PlainTextTableText 然后我可以有一個看起來像的方法

public string ParseText(string textToParse, TextType textType)

我很快意識到這不起作用,因為當textType是PlainText時,返回值應該是一個string ,但是當textType是TableText時,返回值應該是一個string[]

一種選擇是始終返回一個字符串[],並將它作為一個給定,PlainText將始終返回一個大小為1的數組。雖然因為它似乎在語義上看起來不正確而且可能是混亂。

另一個選擇是為每個TextType編寫一個方法,所以我可以

public string ParsePlainText(string textToParse)

public string[] ParseTableText(string textToParse)

我不喜歡這種方法的原因是因為它消除了原始方法與枚舉提供的一些靈活性。 例如,我預計稍后會添加其他文本類型; 在將來,我可能會有一種客戶希望識別為HeadingText的文本,但將以與純文本相同的方式進行解析。 使用原始方法,包含解析方法的類的公共接口不必更改,因為我可以向TextType枚舉添加新值並修改ParseText方法的內部。 另外,我認為只有一種方法可以調用,它只是一個更清晰的界面,客戶端只需要傳遞TextType(他知道)並為他處理其他所有事情(而不是從類似命名的列表中選擇)每次添加新文本類型時增長的方法)。

最后我可以返回一個stringstring[]繼承的對象(因為這是C#,我只能返回object ),並讓客戶端轉換為適當的類型。 我認為這是所有方法中最糟糕的方法,因為它要求客戶端知道應該“實際”返回什么,並且通過更改從Parse類返回的類型並且直到運行時才遇到結果錯誤,有很大的可能性來破壞每個依賴項(因為基本上沒有類型檢查開始)。

對於這種情況,是否存在“正確”或最佳方法?

有幾種方法..但首先想到的是使用interfaces

interface ITextParser {
    string Parse(string text);
}

public class TableTextParser : ITextParser {
    public string Parse(string text) {
        // specific table parsing stuff here
    }
}

public class PlainTextParser : ITextParser {
    public string Parse(string text) {
        // specific plain text parsing stuff here
    }
}

您的主要功能可能會成為各種工廠,如下所示:

public ITextParser CreateParserFor(string textToParse) {
    // logic here to determine the sort of parser you require:
    if (typeOfTextIsTable)
        return new TableTextParser();

    if (typeOfTextIsPlain)
        return new PlainTextParser();
}

然后你可以像這樣稱呼它:

var parser = CreateParserFor(string_here);
var result = parser.Parse(string_here);

讓我們試着澄清一下這個問題。 您有兩種類型的文本(至少現在,可能會增長到更多類型),即:

  1. 具有相同的輸入類型,String。
  2. 有不同的輸出類型,String和Array。
  3. 有不同的實施。

未來添加的類型可能需要不同類型的輸出/返回。 現在的問題是,嘗試將這些功能組合到一個方法中是否合乎邏輯? 我看到你的目標是為客戶端提供統一/通用的接口,但是,如果返回類型不同,我不確定你是否可以提供這樣的接口。

我不認為在界面中有很多類似的方法是件壞事。 這種方式有許多着名的圖書館。

在我看來,你的第二種方法,有類似的東西

public string ParsePlainText(string textToParse)
public string[] ParseTableText(string textToParse)

盡管你懷疑,但是比其他建議的方式更清潔。 特別是,如果從客戶端視圖中查看它(與返回大小為1的數組或使用轉換等的情況相比)。

對於建議的任何方法,您可以從表示結果集合的Parse方法返回ParseResults對象。 然后,這可以暴露iterator以迭代ParseResults

這使您的簽名保持統一,IMO不會混淆。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM