簡體   English   中英

返回布爾值和字符串值的最佳做法是什么

[英]Whats the best practice for returning a Boolean and string value

我創建了一個方法,該方法針對 XML 層次結構執行一些驗證,該 XML 層次結構在運行時由 Javascript 文本中的另一個類動態生成。

我的方法當前返回 True 或 False,這對使用我的 Class 的任何人都有幫助,但我還想返回更多信息信息,因為可能有多種原因會引發 False 消息。

起初我想將返回類型從 bool 更改為具有 String 鍵和 Boolean 值的一些 Generic Collection 類型,我不知道這是否是最好的方法。

在這種情況下,最佳實踐是什么?

制作一個像

public class ValidationResponse
{
    public bool Successful { get; set; }
    public string Information { get; set; }
}

並返回 ValidationResponse 的對象

在.NET 數據類型的TryParse方法中使用的一種模式(例如Int32.TryParse )在 C 世界中非常常見,它返回一個布爾值來表示成功或失敗。 用戶還必須通過引用該方法傳入一個值以接收返回的解析值。

對於您的情況,您的方法簽名可能如下所示:

bool DoSomething (out string anInformativeMessage)

但是,我個人認為最好的方法是返回 Dhinesh 在他的回答中描述的Result類,因為它更靈活,並且本質上是 OO。 為了完整性,我添加了這種方法;)

  1. 創建您自己的結果類,您的方法將返回該結果類並包含您需要的所有信息。 有了這個,您將來可以更輕松地擴展它(如 dhinesh 的回答。)

  2. 另一種選擇是使用Tuple對象來存儲stringboolTuple<string, bool>將是您的返回類型。 (僅在 .NET 4.0 及更高版本中可用)

Rust std::result類型對於 C# 也應該類似地工作:

enum Result<T, E> {
   Ok(T),
   Err(E),
}

你要么:

  1. 返回帶有值的Ok類型
  2. 或帶有錯誤消息的Err類型

老答案:

我不知道最佳實踐,但如果您只有以下兩種情況:

  1. 返回真,沒有額外的信息
  2. 返回 false,帶有額外信息

然后您可以將其簡化為僅返回一個字符串。 如果沒有錯誤,則返回一個空字符串,相當於錯誤代碼為零。

string errorMsg = myObject.MyMethod();
if (errorMsg != String.Empty) {
    Console.Error.WriteLine(errorMsg);
}

如其他答案中所建議的那樣,將 Result 類創建為新的返回類型存在破壞現有代碼的問題。

如果您想/需要避免這種情況,您可以引入一個新的string LastError屬性,其中包含上次調用您的方法的錯誤消息,並保持方法簽名完整。 你會像這樣使用它

bool success = myObject.MyMethod();
if(!success)
    Console.Error.WriteLine(myObject.LastError);

這種方法不太適合多線程環境。

如果預計XML 層次結構將驗證 - 那么我會說這是您應該使用異常的典型示例。 然后該方法只返回 void 並拋出失敗,如下所示:

void validateXMLHierarchy();

並使用

try
{
  validateXMLHierarchy();
}
catch (XmlValidationException ex)
{
  Console.Error.WriteLine(ex.Message);
}

暫無
暫無

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

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