Я работаю над приложением ASP.NET MVC, и у меня появилась привычка вставлять то, что кажется полезным и удобным средством получения, в мои классы моделей / сущностей.
Например:
public class Member
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
public string FullName
{
get { return FirstName + " " + LastName; }
}
public string FormattedPhoneNumber
{
get { return "(" + PhoneNumber.Substring(0, 3) + ") " + PhoneNumber.Substring(3, 3) + "-" + PhoneNumber.Substring(6); }
}
}
Мне интересно, что люди думают о FullName
и FormattedPhoneNumber
добытчиках.
Они позволяют очень легко создавать стандартизированные форматы данных во всем приложении, и, похоже, они сохраняют много повторяющегося кода, но можно с уверенностью утверждать, что формат данных - это то, что должно обрабатываться при отображении из модели в модель представления.
Фактически, я первоначально применял эти форматы данных на своем сервисном уровне, где я делаю свое отображение, но становилось бременем постоянно писать программы форматирования, а затем применять их во многих разных местах. Например, я использую «Полное имя» в большинстве представлений, и мне нужно напечатать что-то вродеmodel.FullName = MappingUtilities.GetFullName(entity.FirstName, entity.LastName);
повсюду казалось менее элегантной, чем просто печатать model.FullName = entity.FullName
(или, если вы используете что-то вроде AutoMapper, возможно, вообще ничего не печатать).
Итак, где вы проводите черту, когда дело доходит до форматирования данных. Это нормально для форматирования данных в вашей модели или это «запах шаблона»?
Примечание: у меня точно нет html в моей модели. Я использую помощники HTML для этого. Я строго говорю о форматировании или объединении данных (и особенно данных, которые часто используются).
источник
PhoneNumber
вероятно, принадлежит к своему классу (который я сейчас реализовал). Но этоFullName
был действительно тот, который побудил меня написать вопрос. Но мне интересно узнать, имеет ли смысл в общем случае форматировать / комбинировать данные и т. Д. В модели для вещей, которые будут применяться в масштабах всего приложения. Судя по ответам ниже, кажется, что это не анти-паттерн, но решение должно приниматься осторожно.Ответы:
В вашем примере мне нравится метод получения
FullName
(по всем причинам, которые вы указали), но мне не нравится метод получения FormattedPhoneNumber. Причина в том, что это, вероятно, не так просто (если у вас есть международные телефонные номера и т. Д.), И если вы разместите логику для форматирования телефонных номеров в методеMember
, скорее всего, вам потребуется рефакторинг (или копирование-вставка caugh ), как только вы нужен форматированный номер телефонаInstitution
иVendor
т. д.РЕДАКТИРОВАТЬ: ИМО было бы лучше иметь
PhoneNumber
класс сFormatted
геттером.источник
String
класса, я полагаю), вы «учите»String
класс, как форматировать телефонные номера. Это действительно обязанностьString
класса знать о телефонных номерах? Я так не думаю. Используемые таким образом методы расширения являются синтаксическим сахаром, позволяющим чему-то явно не объектно-ориентированному выглядеть так, как это было раньше.PhoneNumber
класса. В любом случае я планировал сделать это, потому что у меня естьPhoneType
собственность.PhoneNumber
в качестве экземпляра класса, потому что данные изначальноstring
. Скорее, это должен быть статический класс с такими методами, какpublic static string Format(string phoneNumber, PhoneNumberStyle style)
.Что нужно учитывать при написании кода: правильно ли это? Это читабельно? Это эффективно? Это ремонтопригодно? Я бы сказал, как упомянул @btilly, что это не поддерживается из-за специфического для культуры форматирования, но вопрос, кажется, более общий, чем этот.
Использование таких методов доступа делает ваш код более читабельным и, в зависимости от того, как вы его используете, может сделать другие части вашего кода намного чище. На мой взгляд, это совсем не пахнет. Запах бы начался, если бы у вас были средства форматирования для любой строки, которую вы захотите напечатать (
public string FirstLastName; public string FullName; public string FullNameWithMiddleInitial; public string PhoneNumberWithAreaCode; public string PhoneNumberWithoutAreaCode; public string PhoneNumberWithCountryCode;
и т. Д.)Или, другими словами, использование шаблона не делает ваш код «запахом шаблона». Вам нужно злоупотреблять этим, если вы хотите получить этот атрибут.
источник
Нарушает принцип единоличной ответственности. Почему бы не сделать класс номера телефона и т.д ...?
источник
FullName
класс?Для вашего примера я не считаю слишком большой проблемой использование определенных форматов. Это одна или две, и все части приложения используют один и тот же формат.
Это решение может начать разрушаться, когда одни и те же данные отправляются в несколько разных мест, требующих разных форматов .
Если бы это случилось, я бы соблазнился
Member
вернуть класс к:А потом делайте разные адаптеры для каждой цели. Например, предположим, что информация требовалась в формате CSV:
Всегда предполагая, что вы санировали данные, чтобы в строках не было запятых и т. Д.
Адаптер не должен быть методом расширения, но для этого вымышленного случая он подходит.
источник
over
столько раз, то с дизайном что-то не так.