Я пытаюсь придумать наиболее чистый способ реализации пары методов, открывающих файл.
Рассмотрим следующие сигнатуры методов:
public static DomainObject Load(Uri urlToFile)
{
/* downloads file and calls Load(savedToFilename) */
}
public static DomainObject Load(string filename)
{
/* creates filestream and calls Load(stream) */
}
public static DomainObject Load(Stream stream)
{
/* does actual loading */
}
Я пытаюсь реализовать некоторые концепции из Clean Code, а именно:
Когда конструкторы перегружены, используйте статические фабричные методы с именами, которые описывают аргументы. Например,
Complex fulcrumPoint = Complex.FromRealNumber(23.0);
обычно лучше, чем
Complex fulcrumPoint = new Complex(23.0);
Теперь, я знаю, что у меня нет перегруженных конструкторов, как таковых (я рефакторил от этого), но я думаю, что принцип тот же. Таким образом, это означает, что мои методы Load должны быть рефакторингованы до чего-то вроде:
public static DomainObject FromURI(Uri urlToFile);
public static DomainObject FromFile(string filename);
public static DomainObject FromStream(Stream stream);
Но, честно говоря, мне кажется более интуитивным использовать то, что у меня уже есть. С точки зрения потребителя кажется, что Open возьмет любой источник, который у меня есть, в то время как другой метод требует, чтобы я сначала подумал о том, какой у меня источник, а затем задался вопросом, существует ли для этого конкретный метод.
Поэтому я спрашиваю, с вашей более опытной точки зрения, что лучше и почему?