«Высшее образование не должно быть массовым. Тем более, что оно не справилось со своей задачей. Детей в семье должно быть не больше трёх Не все сразу

«Высшее образование не должно быть массовым. Тем более, что оно не справилось со своей задачей. Детей в семье должно быть не больше трёх Не все сразу

Формулировка: не должно быть больше одной причины для изменения класса

Что является причиной изменения логики работы класса? Видимо, изменение отношений между классами, введение новых требований или отмена старых. Вообще, вопрос о причине этих изменений лежит в плоскости ответвенности, которую мы возложили на наш класс. Если у объекта много ответвенности, то и меняться он будет очень часто. Таким образом, если класс имеет больше одной ответственности, то это ведет к хрупкости дизайна и ошибкам в неожиданных местах при изменениях кода.

Примеры

Сценариев, где можно встретить нарушение этого принципа очень много. Я выбрал несколько самых популярных. Примеры будут приводиться с обозначением ошибки в дизайне, после чего будет приведено решение проблемы.

1. Active Record

Проблема

Совсем недавно в качестве ORM я использовал MyGeneration . Суть этой ORM состоит в том, что по таблицам базы данных, она генерирует бизнес-сущности. Возьмем для примера сущность пользователя - Account . Сценарий использования выглядит так:

// создание пользователя Accounts account = new Accounts(); account.AddNew(); account.Name = "Name"; account.Save(); // загрузка объекта по Id Accounts account = new Accounts() account.LoadByPrimaryKey(1); // загрузка связной коллекции при обращении к свойству объекта var list = account.Roles;

Шаблон Active Record может быть успешно использован в небольших проектах с простой бизнес-логикой. Практика показывает, что когда проект разрастается, то из-за смешанной логики внутри доменных объектов возникает много дублирования в коде и непредвиденных ошибок. Обращения к базе данных довольно сложно проследить, когда они скрыты, например, за свойством объекта account.Roles .

В данном случае объект Account имеет несколько ответственностей:

  1. является объектом домена и хранит бизнес-правила, например, связь с коллекцией ролей
  2. является точкой доступа к базе данных

Решение

Простым и действенным выходом является использование шаблона Repository . Хранилищу AccountRepository мы оставляем работу с базой данных и получаем «чистый» доменный объект.

// создание пользователя var account = new Account(); account.Name = "Name"; accountRepository.Save(account); // загрузка пользователя по Id var account = accountRepository.GetById(1); // загрузка со связной коллекцией // пример из LLBLGen Pro var account = accountRepository.GetById(1, new IPath{new Path(Account.PrefetchPathRoles)});

2. Валидация данных

Проблема

Если вы сделали хотя бы один проект, то перед вами наверняка стояла проблема валидации данных. Например, проверка введенного адреса эл. почты, длины имени пользователя, сложности пароля и т.п. Для валидации объекта резонно возникает первая реализация:

Public class Product { public int Price { get; set; } public bool IsValid() { return Price > 0; } } // проверка на валидность var product = new Product { Price = 100 }; var isValid = product.IsValid();

Такой подход является вполне оправданным в данном случае. Код простой, тестированию поддается, дублирования логики нет.

Теперь наш объект Product начал использовать в некоем CustomerService , который считает валидным продукт с ценой больше 100 тыс. рублей. Что делать? Уже сейчас понятно, что нам придется изменять наш объект продукта, например, таким образом:

Public class Product { public int Price { get; set; } public bool IsValid(bool isCustomerService) { if (isCustomerService == true) return Price > 100000; return Price > 0; } } // используем объект продукта в новом сервисе var product = new Product { Price = 100 }; var isValid = product.IsValid(true);

Решение

Стало очевидно, что при дальнейшем использовании объекта Product логика валидации его данных будет изменяться и усложняться. Видимо пора отдать ответственность за валидацию данных продукта другому объекту. Причем надо сделать так, чтобы сам объект продукта не зависел от конкретной реализации его валидатора. Получаем код:

Public interface IProductValidator { bool IsValid(Product product); } public class ProductDefaultValidator: IProductValidator { public bool IsValid(Product product) { return product.Price > 0; } } public class CustomerServiceProductValidator: IProductValidator { public bool IsValid(Product product) { return product.Price > 100000; } } public class Product { private readonly IProductValidator validator; public Product() : this(new ProductDefaultValidator()) { } public Product(IProductValidator validator) { this.validator = validator; } public int Price { get; set; } public bool IsValid() { return validator.IsValid(this); } } // обычное использование var product = new Product { Price = 100 }; // используем объект продукта в новом сервисе var product = new Product (new CustomerServiceProductValidator()) { Price = 100 };

Имеем объект Product отдельно, а любое количество всяческих валидаторов отдельно.

В дополнение хочу посоветовать книгу Применение DDD и шаблонов проектирования. Проблемно-ориентированное проектирование приложений с примерами на C# и.NET . В ней очень подробно рассмотрен вопрос валидации данных.

3. God object

Проблема

Предел нарушения принципа единственности ответственности – God object . Этот объект знает и умеет делать все, что только можно. Например, он делает запросы к базе данных, к файловой системе, общается по протоколам в сеть и содержить тонну бизнес-логики. В пример приведу объект, который называется ImageHelper :

Public static class ImageHelper { public static void Save(Image image) { // сохранение изображение в файловой системе } public static int DeleteDuplicates() { // удалить из файловой системы все дублирующиеся изображения и вернуть количество удаленных } public static Image SetImageAsAccountPicture(Image image, Account account) { // запрос к базе данных для сохранения ссылки на это изображение для пользователя } public static Image Resize(Image image, int height, int width) { // изменение размеров изображения } public static Image InvertColors(Image image) { // изменить цвета на изображении } public static byte Download(Url imageUrl) { // загрузка битового массива с изображением с помощью HTTP запроса } // и т.п. }

Кажется, что границы ответственности у него вообще нет. Он может сохранять в базу данных, причем знает правила назначения изображений пользователям. Может скачивать изображения. Знает, как хранятся файлы изображений и может работать с файловой системой.

Каждая ответственность этого класса ведет к его потенциальному изменению. Получается, что этот класс будет очень часто менять свое поведение, что затруднит его тестирование и тестирование компонентов, которые его используют. Такой подход снизит работоспособность системы и повысит стоимость ее сопровождения.

Решение

Решением является разделить этот класс по принципу единственности ответственности: один класс на одну ответственность.

Public static class ImageFileManager { public static void Save(Image image) { // сохранение изображение в файловой системе } public static int DeleteDuplicates() { // удалить из файловой системы все дублирующиеся изображения и вернуть количество удаленных } } public static class ImageRepository { public static Image SetImageAsAccountPicture(Image image, Account account) { // запрос к базе данных для сохранения ссылки на это изображение для пользователя } } public static class Graphics { public static Image Resize(Image image, int height, int width) { // изменение размеров изображения } public static Image InvertColors(Image image) { // изменить цвета на изображении } } public static class ImageHttpManager { public static byte Download(Url imageUrl) { // загрузка битового массива с изображением с помощью HTTP запроса } }

Этот пост входит в серию

Оргкомитет обращает внимание на правильность оформления заявок и статей. При несоответствии правилам оформления оргкомитет конференции оставляет за собой право отослать назад автору его материалы для исправления выявленных ошибок.

Единый формат оформления пристатейных библиографических ссылок в соответствии с ГОСТ Р 7.0.5 2008 «Библиографическая ссылка»

(Примеры оформления ссылок и пристатейных списков литературы)

Статьи из журналов и сборников:

Адорно Т. В. К логике социальных наук // Вопр. философии. - 1992. - № 10. - С. 76-86.

Crawford P. J. The reference librarian and the business professor: a strategic alliance that works / P. J. Crawford, T. P. Barrett// Ref. Libr. - 1997. Vol. 3, № 58. - P. 75-85.

Crawford P.J., Barrett Т. P. The reference librarian and the business professor: a strategic alliance that works // Ref. Libr. 1997. Vol. 3. № 58. P. 75-85.

Корнилов В.И. Турбулентный пограничный слой на теле вращения при периодическом вдуве/отсосе // Теплофизика и аэромеханика. - 2006. - Т. 13, №. 3. - С. 369-385.

Кузнецов А. Ю. Консорциум - механизм организации подписки на электронные ресурсы // Российский фонд фундаментальных исследований: десять лет служения российской науке. - М.: Науч. мир, 2003. - С. 340-342.

Тарасова В. И. Политическая история Латинской Америки: учеб. для вузов. - 2-е изд. - М.: Проспект, 2006. - С. 305-412

Допускается предписанный знак точку и тире, разделяющий области библиографического описания, заменять точкой.

Философия культуры и философия науки: проблемы и гипотезы: межвуз. сб. науч. тр. / Сарат. гос. ун-т; [под ред. С. Ф. Мартыновича]. Саратов: Изд-во Сарат. ун-та, 1999. - 199 с.

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

Райзберг Б. А. Современный экономический словарь / Б. А. Райзберг, Л. UJ. Лозовский, Е. Б. Стародубцева. -5-е изд., перераб. и доп. - М.:ИНФРА-М, 2006. - 494 с.

Райзберг Б. А., Лозовский Л. Ш., Стародубцева Е. Б. Современный экономический словарь. 5-е изд., перераб. и доп. М.: ИНФРА-М, 2006. 494 с.

Глухов В.А. Исследование, разработка и построение системы электронной доставки документов в библиотеке: Автореф. дис. канд. техн. наук. - Новосибирск, 2000. - 18 с.

Диссертации

Фенухин В. И. Этнополитические конфликты в современной России: на примере Северокавказского региона: дис.... канд. полит, наук. - М.. 2002. - С. 54-55.

Аналитические обзоры:

Экономика и политика России и государств ближнего зарубежья: аналит. обзор, апр. 2007/ Рос. акад. наук, Ин-т мировой экономики и междунар. отношений. - М. : ИМЭМО, 2007. - 39 с.

Патенты:

Патент РФ № 2000130511/28, 04.12.2000.

Еськов Д.Н., Бонштедт Б.Э., Корешев С.Н., Лебедева Г.И., Серегин А.Г. Оптико-электронный аппарат//Патент России № 2122745.1998. Бюл. № 33.

Материалы конференций

Археология: история и перспективы: сб. ст. Первой межрегион, конф.. Ярославль, 2003. 350 с.

Марьинских Д.М. Разработка ландшафтного плана как необходимое условие устойчивого развития города (на примере Тюмени) // Экология ландшафта и планирование землепользования: тезисы докл. Всерос. конф. (Иркутск, 11-12 сент. 2000 г.). - Новосибирск, 2000. - С.125-128.

Интернет-документы:

Официальные периодические издания: электронный путеводитель / Рос. нац. б-ка, Центр правовой информации. [СПб.], 20052007. URL: http://www.nlr.ru/lawcenter/izd/index.html (дата обращения: 18.01.2007).

Логинова Л. Г. Сущность результата дополнительного образования детей // Образование: исследовано в мире: междунар. науч. пед. интернет-журн. 21.10.03. URL: http://www.oim.ru/reader.asp7nomers 366 (дата обращения: 17.04.07).

Рынок тренингов Новосибирска: своя игра [Электронный ресурс]. - Режим доступа: http://nsk.adme.ru/news/2006/07/03/2121 .html (дата обращения: 17.10.08).

Литчфорд Е. У. С Белой Армией по Сибири [Электронный ресурс] // Восточный фронт Армии Генерала А. В. Колчака: сайт. - URL: http://east-front.narod.ru/memo/latchford.htm (дата обращения 23.08.2007).

Монографи

51 год назад, 8 октября 1967 года, в Великобритании впервые принят закон, регламентирующий содержание алкоголя в крови водителей.

Употребление спиртных напитков для водителей всех видов транспорта опасно - даже незначительное снижение реакции и внимания приводит к росту аварийных ситуаций и числа ДТП со смертельным исходом.

Водители транспорта в состоянии опьянения обратили на себя внимание ещё в XIX столетии.

В 1872 году в Англии появился первый официальный документ, который определил как нарушение общественного порядка «состояние опьянения водителя кареты, повозки, а также паровой машины на дорогах или в других публичных местах».

В 1925 году в этот документ было внесено дополнение: «водитель любого механического транспортного средства».

В 1932 году профессор Видмарк (Швеция) впервые разработал устройство для научно обоснованного определения алкоголя в крови. Этот год следует считать началом эры анализа крови водителей на алкоголь.

В 1935 году Британская медицинская ассоциация опубликовала результаты исследования «Дорожные аварии, связанные с алкоголем». В 1936 году начинается широкая кампания по внедрению научно обоснованного метода анализа крови на алкоголь. В 1939 году комитет палаты лордов рекомендует внедрить этот анализ для контроля водителей, но исключительно на добровольных началах.

В 1966 году предпринята первая попытка провести через парламент закон, регламентирующий содержание этанола в крови: 0,8 промилле как гранично-допустимый уровень и максимальную скорость - 70 миль/час. Превышение этих показателей должно было рассматриваться как серьёзное нарушение.

8 октября 1967 года закон был принят. Последствия были впечатляющими: количество смертей на дорогах Англии снизилось практически в два раза.

1. Число участников общества с ограниченной ответственностью не должно превышать пятьдесят. В противном случае оно подлежит преобразованию в акционерное общество в течение года, а по истечении этого срока — ликвидации в судебном порядке, если число его участников не уменьшится до указанного предела.

2. Общество с ограниченной ответственностью может быть учреждено одним лицом или может состоять из одного лица, в том числе при создании в результате реорганизации.

Комментарий к Ст. 88 ГК РФ

1. Общество с ограниченной ответственностью может иметь одного участника («общество одного лица») или нескольких.

В силу п. 3 ст. 7 Закона об обществах с ограниченной ответственностью число участников общества не должно быть более 50. В случае если число участников общества превысит этот предел, общество в течение года должно преобразоваться в открытое акционерное общество или в производственный кооператив. Если в течение указанного срока общество не будет преобразовано и число участников общества не уменьшится до 50, оно подлежит ликвидации в судебном порядке по требованию органа, осуществляющего государственную регистрацию юридических лиц, либо иных государственных органов или органов местного самоуправления, которым право на предъявление такого требования предоставлено федеральным законом.

Установленное законом предельное число участников — характерная черта общества с ограниченной ответственностью. В отличие от акционерного общества общество с ограниченной ответственностью не предполагает создания сложной корпоративной структуры. Принято считать, что акционерное общество, обладая уставным капиталом в больших размерах, чем общество с ограниченной ответственностью, и концентрируя его за счет привлечения средств множества участников, нуждается в особой системе управления.

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

3. Комментируемая статья именуется «Участники общества с ограниченной ответственностью», однако устанавливает лишь положения, относящиеся к их численности.

Участниками общества могут быть граждане и юридические лица. Это правило имеет исключения. В силу п. 4 ст. 66 ГК РФ законом может быть запрещено или ограничено участие отдельных категорий граждан в хозяйственных товариществах и обществах, за исключением открытых акционерных обществ.

Так, в соответствии с Федеральным законом «О государственной гражданской службе Российской Федерации» в случае, если владение гражданским служащим приносящими доход ценными бумагами, акциями (долями участия в уставных капиталах организаций) может привести к конфликту интересов, он обязан передать принадлежащие ему указанные ценные бумаги, акции (доли участия в уставных капиталах организаций) в доверительное управление в соответствии с гражданским законодательством Российской Федерации.

Как указывается в п. 4 ст. 66 ГК РФ, государственные органы и органы местного самоуправления не вправе выступать участниками обществ, если иное не установлено федеральным законом (см. комментарий к ст. 66). Вместе с тем неверно было бы считать, что в предусмотренных законом случаях вступления указанных органов в общество участником общества становится орган государственной власти или местного самоуправления. Таким участником можно считать лишь самого публично-правового субъекта (Российскую Федерацию, субъекта Федерации, муниципальное образование), а соответствующий орган приобретает права для такого субъекта и от его имени (ст. 125 ГК).

Так, Бюджетный кодекс РФ в ст. 80 устанавливает, что предоставление бюджетных инвестиций юридическим лицам, не являющимся государственными и муниципальными учреждениями и государственными или муниципальными унитарными предприятиями, влечет возникновение права государственной или муниципальной собственности на эквивалентную часть уставных (складочных) капиталов указанных юридических лиц, которое оформляется участием Российской Федерации, субъектов Федерации и муниципальных образований в уставных (складочных) капиталах таких юридических лиц в соответствии с гражданским законодательством Российской Федерации. Оформление доли Российской Федерации, субъекта Федерации, муниципального образования в уставном (складочном) капитале, принадлежащей Российской Федерации, субъекту Федерации, муниципальному образованию, осуществляется в порядке и по ценам, которые определяются в соответствии с законодательством Российской Федерации.

В силу ст. 66 ГК РФ учреждения могут быть участниками обществ с ограниченной ответственностью с разрешения собственника, если иное не установлено законом. Это положение не так давно было уточнено. Федеральный закон от 2 августа 2009 г. N 217-ФЗ «О внесении изменений в отдельные законодательные акты Российской Федерации по вопросам создания бюджетными научными и образовательными учреждениями хозяйственных обществ в целях практического применения (внедрения) результатов интеллектуальной деятельности» допустил в ряде случаев участие научных и образовательных бюджетных учреждений в хозяйственных обществах «без согласия собственника их имущества с уведомлением федерального органа исполнительной власти, осуществляющего функции по выработке государственной политики и нормативно-правовому регулированию в сфере научной и научно-технической деятельности». Вместе с тем действующая редакция п. 1 ст. 298 ГК РФ по-прежнему запрещает бюджетным учреждениям отчуждать либо иным способом распоряжаться имуществом, закрепленным за ним собственником или приобретенным этим учреждением за счет средств, выделенных ему собственником на приобретение такого имущества. Из этого следует, что бюджетное учреждение вправе стать участником общества лишь в случае оплаты доли в уставном капитале общества средствами, вырученными от самостоятельной деятельности, или приобретенным за счет этих средств имуществом (п. 2 ст. 298 ГК).


Самое обсуждаемое
Музыкальный праздник в подготовительной группе ДОУ по сказкам Чуковского Музыкальный праздник в подготовительной группе ДОУ по сказкам Чуковского
Принцип деления Европы на субрегионы Принцип деления Европы на субрегионы
Какие растения растут в пустыне Какие растения растут в пустыне


top