【问题标题】:Sending HTML Arguments And File Path Arguments?发送 HTML 参数和文件路径参数?
【发布时间】:2011-06-25 01:39:27
【问题描述】:

我正在创建一个需要打印 HTML 字符串和 HTML 文档的打印机类。所以基本上可以得到:

Printer.Print("<b>Hello world</b>");

Printer.Print(@"C:\hello.html");

因此,在设计我的课程时,我在以下之间做出了 Print 方法定义:

public static void Print(string inputString, string mode){
    if(mode=="htmlString"){//Print the string itself}
    else if(mode=="htmlFile"){//Print the document in the filepath}
}

或者

public static void Print(string inputString){
    if(file.Exists(inputString)){//Print the document in the filepath}
    else{//Print the string itself}
}

一般来说,哪种做法更好?第一个选项需要另一个不太好的参数,但是如果我们使用第二个选项,如果我们打算实际打印一个文件但使用了不正确的文件名,它将打印错误的东西。

【问题讨论】:

  • 为用户构建外观看起来很聪明,但是构建执行多种不同操作的方法可能会变得非常混乱,而它们的名称并不能告诉您它们究竟做了什么。在这种情况下,打印一个简单的字符串和打开和关闭一个文件有很大的不同(和影响)。首先,只包含文件名纯文本的 HTML 怎么样?在您的示例中,我无法将简单的 filePath 打印为字符串。
  • 好点,从这个角度我并没有想太多。
  • 我会推荐失望先生的回答,读起来很清楚,并且对于某些事情应该如何表现没有任何困惑。

标签: c# methods arguments class-design


【解决方案1】:

我同意使用两种方法是最好的方法。但是,.Net 约定将具有以下方法名称:

public static void Print(string path) { ... }
public static void PrintHtml(string html) { ... }

【讨论】:

    【解决方案2】:

    我建议你采用失望先生建议的设计。

    但是,如果出于某种原因您想保留最初的想法,我会稍作改动。与其将模式作为字符串传递,不如将其作为枚举传递。事实上,您也可以将失望先生的建议与此联系起来。例如

    public enum PrintMode
    {
      File,
      Raw
    }
    
    public static void Print(string printData, PrintMode mode)
    {
      if(mode == PrintMode.Raw)
      {
        //Print the string itself
      }
      else if (mode == PrintMode.File)
      {
        //Print the document in the filepath
      }
      else
      {
        throw new ArgumentException("Invalid print mode specified");
      }
    }
    
    public static void PrintString(string input)
    {
      Print(input, PrintMode.Raw);
    }
    
    public static void PrintFile(string input)
    {
      Print(input, PrintMode.File);
    }
    

    您的第二个想法是个坏主意,因为每当用户打印原始字符串时,您都会执行不必​​要的文件系统检查。更重要的是,它可能会抛出异常,因为在打印原始字符串时,这将不是有效的文件路径。所以Exists 检查可能会失败。

    【讨论】:

      【解决方案3】:

      很多时候,意外事件的空间太大,特别是在这种情况下,您必须根据输入确定如何采取行动,然后进一步进行验证处理(即 File.Exists ),它在为误报而哭泣。在我看来,改为这样做:

      public static void PrintString(string input)
      {
          //print the string, knowing precisely this is the intent,
          //and if not, it's what you're going to do anyway!
      }
      
      public static void PrintFile(string fileName)
      {
          //no qualms here, you're going to print a file
      }
      

      【讨论】:

      • 我正在寻找“最佳实践”的答案。这是“最佳实践”意义上的正确答案吗?
      • 我不得不说是的——虽然我没有听到这样的福音,但让我们看看其他人的想法。这样就没有 if's 或 but's 或任何中间的东西,代码是明确的。即使两者都只是简单地调用一个内部辅助方法来完成工作但对用户隐藏,也可以让他们免于混淆(或者在离开时不得不阅读可以说明的方法的文档本身)。
      猜你喜欢
      • 2016-07-07
      • 2015-07-23
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多