我正在创建一个需要打印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}
}
总的来说,哪种做法更好?第一个选项需要另一个不太好的参数,但是如果我们使用第二个选项,如果我们打算实际打印文件但使用不正确的文件名,它将打印错误的东西。
答案 0 :(得分:5)
很多时候,偶然事件的空间太大,特别是在这种情况下你必须根据输入确定如何行动,然后进一步做验证处理(即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
}
答案 1 :(得分:1)
我建议您选择Disappointment先生建议的设计。
然而,如果出于某种原因你想保留原来的想法,我会稍作修改。而不是将模式作为字符串传递而不是将其作为枚举传递。事实上,你可以将Disappointment先生的建议连接到这个问题上。例如
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
检查可能会爆炸。
答案 2 :(得分:0)
我同意使用两种方法是最好的方法。但是,.Net约定将具有以下方法名称:
public static void Print(string path) { ... }
public static void PrintHtml(string html) { ... }