2011-02-10 3 views
4

Я создаю класс принтера, который должен будет печатать как строки HTML, так и HTML-документы. Так что в принципе он может получить:Отправка HTML-аргументов и аргументов пути файла?

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

И

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

Таким образом, в разработке моего класса определения метода печати я решаю между следующим:

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} 
} 

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

+1

Фасады зданий для пользователя могут выглядеть умными, однако это может стать очень запутанным, чтобы построить методы, которые делают несколько различных вещей, в то время как их название не скажет ничего о том, что они делают точно. В этом случае существует огромная разница (и влияние) при печати простой строки и открытии и закрытии файла. Для начала, как насчет HTML, который содержит только обычный текст имени файла? В вашем примере я не могу напечатать простую filePath как строку. –

+0

Хорошо, я не думал об этом с этой точки зрения. – sooprise

+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 
} 
+0

Я ищу ответ «Лучшая практика». Это правильный ответ в смысле «лучшей практики»? – sooprise

+0

Я должен был сказать «да», хотя я не слышал таких, как Евангелие, давайте посмотрим, что думают другие. Таким образом, нет if if или but или что-то в-betwixt, код явно. Даже если оба просто назовут внутренний вспомогательный метод, который делает мясо работы, но скрыт от пользователей, избавьте их от путаницы (или в самом разгаре _having_, чтобы прочитать документацию для метода, который мог бы говорить сам за себя). –

+0

Это имеет смысл, спасибо :) – sooprise

1

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

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

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

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

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