FromXYZ против перегруженного метода

FromXYZ против перегруженного метода
FromXYZ против перегруженного метода - marg55 @ Unsplash

Я пытаюсь придумать наиболее чистый способ реализации пары методов, открывающих файл.

Рассмотрим следующие сигнатуры методов:

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 возьмет любой источник, который у меня есть, в то время как другой метод требует, чтобы я сначала подумал о том, какой у меня источник, а затем задался вопросом, существует ли для этого конкретный метод.

Поэтому я спрашиваю, с вашей более опытной точки зрения, что лучше и почему?

Я думаю, что "Load" - это то, что нужно, по нескольким причинам:

  • Тип параметра уже есть в списке параметров - зачем указывать его снова в имени метода?
  • Если в классе есть несколько методов, которые выдают что-то в поток, то "FromStream" становится проблемой.
  • В эпоху intellisense гораздо логичнее набрать "Load" и получить список возможных вариантов параметров, чем просматривать три разных метода (особенно если на "From" начинаются не только методы из этого набора).
  • Еще одно достойное правило - "называйте методы глаголами, когда можете", что говорит в пользу чего-то сродни "Load" или хотя бы "LoadFrom...".

LetsCodeIt, 22 мая 2023 г., 09:24