Перегрузка лучших практик - PullRequest
1 голос
/ 10 июля 2010

Скажем, у меня есть метод, который возвращает бизнес-объект:

public static MyObject GetObject()
{
   return Blah.Blah();
}

Теперь мне нужен другой метод, который делает то же самое, но возвращает MyObject в формате XML:

public static string GetObject(bool returnXml)
{
  return Blah.Blah.Xml();
}

Я начал с этого подхода, но вскоре понял, что вызывающая сторона может указать false для returnXml.

Является ли мой единственный способ переименовать мой метод в что-то вроде GetObjectAsXml?


Обновление ... спасибо всем.

Мои оригинальные методы выглядят так.

public static MyObject GetObject()
{
   return ConvertToMyObject(GetResponseAsXML());
}

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

public static string GetObject()
{
   return GetResponseAsXML();
}

Из ответов кажется, что лучше всего иметь второй набор методов с именем GetObjectAsXML, верно? Я не хочу делать GetObject (). ToXml (), потому что я хочу вернуть исходный ответ обратно.

Ответы [ 5 ]

8 голосов
/ 10 июля 2010

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

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

Что более интересно, что вы делаете с этими объектами и сериализацией XML;потребитель, вероятно, захочет 2 перегрузки, которые принимают любой тип в качестве параметра, но это будет зависеть от ваших потребностей.

4 голосов
/ 10 июля 2010
public static MyType GetObject()
{
  return Blah.Blah();
}

public static string GetObjectAsXml()
{
  return Blah.Blah().Xml();
}
2 голосов
/ 10 июля 2010

Есть несколько способов сделать это - некоторые из ваших решений будут зависеть от вашей системы. Однако, если бы я проектировал систему, в которой информацию нужно было возвращать по-разному, в зависимости от того, кому она нужна, я бы не стал возлагать на объект ответственность за обеспечение правильного форматирования, поскольку это нарушает принцип поддержания высокого коэффициента сжатия (АКА, аспект система делает только одно).

Вместо этого я хотел бы создать подсистему, которая может принимать ваш бизнес-объект и иметь знания о том, как преобразовать его в XML, плоский файл, YAML, каким бы он ни был вам нужен. И, если у вас есть другие бизнес-объекты, которые являются производными от того же «базового класса бизнес-объектов», эта подсистема также будет работать для всех них, создавая систему, которую можно многократно использовать.

0 голосов
/ 10 июля 2010

Лучшая практика? Как насчет лучшей практики, в частности, принципа единой ответственности?

Ваш подход сочетает в себе обязанности по получению вашего объекта и его сериализации. SRP диктует, что это две совершенно разные обязанности. Кроме того, кто скажет, что вы хотите сериализовать его с помощью XmlSerializer, XamlSerializer или даже NetDataContractSerializer?

Я бы позволил типу, который должен иметь сериализованный объект, выполнить сериализацию. Я бы обозначил тип как мой сериализатор, вставил бы его как часть некоторой структуры Dependency Injection, и использовал бы это везде для моей сериализации. Или, если бы тип, нуждающийся в сериализации объекта, отвечал за сериализацию и десериализацию, я бы позволил ему позаботиться об ответственности за выбор самого сериализатора.

0 голосов
/ 10 июля 2010

Я не уверен, что вам вообще нужна перегрузка в этой ситуации. У вас есть

public static MyObject GetObject()
{
  return Blah.Blah();
}

чтобы получить объект. Получение XML для объекта представляется функцией экземпляра, а не статической функцией, и вы можете получить XML с помощью этого вызова:

string xmlStuff = GetObject().Xml();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...