Отправлять аргументы HTML и аргументы пути к файлу? - PullRequest
4 голосов
/ 10 февраля 2011

Я создаю класс принтера, который должен будет печатать как строки 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}
}

В общем, какая практика лучше? Первый вариант требует другого аргумента, который не является хорошим, но тогда, если мы используем второй вариант, если мы намереваемся фактически напечатать файл, но использовать неправильное имя файла, он напечатает неправильную вещь.

Ответы [ 3 ]

5 голосов
/ 10 февраля 2011

Часто бывает слишком много места для непредвиденных обстоятельств, особенно в этом случае, когда вы должны определить , как действовать на основе входных данных, а затем выполнить проверку (например, 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 голос
/ 10 февраля 2011

Я бы посоветовал вам использовать дизайн, предложенный мистером Разочарование.

Однако, если по какой-либо причине вы хотите сохранить первоначальную идею, я бы внес небольшое изменение. Вместо того, чтобы передавать режим в виде строки, передайте его как перечисление. На самом деле, вы можете связать предложение мистера Разочарование с этим. Например

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, вероятно, взорвется.

0 голосов
/ 10 февраля 2011

Я согласен, что использование двух методов - лучший подход.Однако соглашения .Net будут иметь следующие имена методов:

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