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


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

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

Примеры

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

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 запроса } }

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

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

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

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

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

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

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

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

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

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

ФЗ от 03.07.2016 N 272-ФЗ установил более жесткие сроки перечисления заработной платы сотрудникам. Трудовой кодекс дополняется положением, устанавливающим новые сроки выплаты зарплаты с 3 октября. изложена в новой редакции: законодатель обозначил конкретную дату - предельный срок перечисления оплаты за труд. Это 15 число месяца, следующего за отработанным месяцем, за который начисляется заработная плата. Правило о том, что платить за труд нужно не реже, чем раз в полмесяца, сохраняется, но при этом ужесточается предельной сроком.

Между авансом и зарплатой должно быть не больше 15 дней

Трудовой кодекс требует выдавать деньги не реже чем каждые полмесяца, между авансом и зарплатой должно быть строго не больше 15 (пятнадцати) дней. Если Вы выплачиваете аванс 25 числа, то зарплату обязаны выдать 10 числа. Делать интервал более 15 дней нельзя. ЭТО НАРУШЕНИЕ! Все налоги с заработной платы перечисляются при последней выплате зарплаты.

Какая ответственность, если между авансом и зарплатой большее 15 дней

Новвоведения сопровождаются теперь и более высокими штрафами. С 3 октября 2016 года штрафы за первичное нарушение составляют (п.1 ст. 5.27 КоАП РФ):

  • от 1000 до 5000 руб. (ИП);
  • от 30 000 до 50 000 руб. (организации);
  • Штраф руководителю составит от 10 000 до 20 000 рублей;
  • За повторное нарушение: от 50 000 до 100 000 рублей.

Работодателю придется выплатить и компенсацию за задержку зарплаты. Компенсация вырастет вдвое, и будет рассчитываться из 1/150 ключевой ставки ЦБ РФ за каждый день задержки (ст. 236 ТК РФ).

Фирммейкер, сентябрь 2016
Анастасия Чижова (Конатова)
При использовании материала ссылка обязательна

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Правило о 25 учениках в классе разъяснили в пресс-службе Управления образования Астаны, передает .

В социальных сетях родители начали обсуждать норму, согласно которой в классах должно находиться не более 25 детей, а в старших классах - не более 20. Информацию об этом опубликовал юрист Жангельды Сулейманов в Facebook .

"Да, действительно, согласно новым санитарным требованиям к объектам образования, это приказ от 13 сентября 2017 года Министерства здравоохранения. И здесь есть пункт, что не более 25 человек могут находиться в классе", - сказала пресс-секретарь управления образования Астаны Жазира Асанова.

"На сегодняшний день в наших школах в среднем более 30 детей в классе. Это для нас первоочередная цель. У нас стоит цель снизить количество до 25 детей в классах. На сегодняшний день у нас 85 государственных школ и порядка 30 школ считаются переуплотненными. В них посещают ежедневно занятия по 35-38 детей в классах. Это происходит за счет того, что у нас хорошие рождаемость и миграция", - добавила Асанова.

По ее словам, за неисполнение данных норм предусмотрена ответственность.

"За неисполнение данных правил есть штрафные санкции. Там, где действительно сидят 45 детей, накладываются штрафные санкции. Но, естественно, мы активно работаем с госорганами, чтобы они нам пошли навстречу", - пояснила она.

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

Она также пояснила, что в большинстве случаев школы переуплотнены по причине популярности некоторых.

"Есть школы, которые очень популярны среди родителей, и все туда хотят попасть, за счет этого они переуплотнены. Но мы не можем родителям запретить отдавать своих детей в эти школы. Мы рекомендуем родителям отдавать детей в школы, находящиеся в их районе. Это вопрос безопасности детей в первую очередь", - добавила Асанова.

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

"Если посмотреть в 72-м пункте этих же правил, есть такой момент по недельной нагрузке. Есть определенное количество часов для каждой параллели, которые рекомендованы МЗ. (...) Условно, в какой-то параллели за неделю не должно быть более 32 часов. Если у родителей есть какие-то замечания и предложения, как лучше или эффективнее провести факультативные или вариативные часы, чем лучше занять ребенка. Это все обсуждается на уровне родительских комитетов, попечительских советов", - отметила Асанова.

Этому чемпионату, на котором, кажется, уже случилось все, что не могло случиться - я имею в виду турнирную интригу, - на финише не хватало чего-то завершающего. Не сенсации - это слово по ходу затерлось по причине слишком частого употребления. А чего-то вообще невообразимого в виде финала Бельгия - Хорватия. Бельгийцы подвели. А хорваты вышли в финал. И это будет вспоминаться через годы: «Это тот чемпионат мира, на котором в финале играла сборная Хорватии!» Ничего такого не было 50 с лишним лет. И не должно было быть.

Начиная с ЧМ-1966, который у нас впервые показывали по телевидению и который в первый и последний раз выиграли родоначальники футбола, никакого «второго эшелона» в финале быть не могло в принципе. Венгрия в 1954-м, Швеция в 1958-м, Чехословакия в 1962-м. Дальше в финал в разные годы выходили и побеждали исключительно монстры: Бразилия, Италия, Германия, Аргентина, Франция. Плюс вечный неудачник Голландия и впервые прорвавшаяся к столу только в 2010-м Испания, что сенсацией не стало. И все! И больше — ни-ко-го!

Футбольных стран хватает, футбольных держав чуть больше, чем пальцев на одной руке. На континентальных чемпионатах — пожалуйста, резвитесь хоть Мексика с Чили, хоть Дания-Греция-Португалия. Но на планетарном футбольном форуме ни-ни.

И не хорватам по всему было ломать традицию. Да, не попали в Россию Италия с Голландией, но когорта грандов выглядела достаточно мощно. Одного из них хорваты вынесли еще в группе, камня на камне не оставив на Аргентине. Но мало ли кого раньше называли теневым фаворитом и кто их с ходу вспомнит? Кубковый раунд подопечные Златко Далича начали и продолжили со скрипом, одержав победы над сборными Дании и России в серии пенальти. Два подряд матча по 120 с лишним минут изнурительной борьбы для возрастной команды — почти приговор. С сеткой, конечно, повезло — но не с Англией.

Вот кто был голоден, жаден и самое главное — свеж. Вот кто наверняка помнил, что именно немотивированная Хорватия лишила Англию участия в Евро-2008, открыв дорогу России.

Все завязалось в лужниковском полуфинале в тугой узел, и почти все козыри были на руках у Гарета Саутгейта. Почти все, кроме одного, — опыта, о чем человек в строгой жилетке не уставал напоминать уже после того, как все закончилось.

По сути, закончилось тем, что после гола Марио Манджукича обезумевшие от счастья хорватские футболисты за кромкой поля чуть не задавили сальвадорского фотографа. Когда прозвучал финальный свисток турецкого судьи Джюнайта Чакыра, часы готовились отбить полночь. Небо над бурлящей чашей Большой спортивной арены давно было темным, почти черным. Но для победителей на нем сияли звезды.

Но человечество наверх не глядело. Оно наслаждалось моментом. Самая заинтересованная в результате его часть — англичане в белых майках и хорваты в традиционных красно-белых «шашечках» — составляла максимум одну пятую аудитории. Остатки покинувших чемпионат болельщиков выделялись на общем фоне — мелькали то сомбреро, то пончо, то германский флаг, но и российских тоже хватало. А больше всего, по моим подсчетам, оказалось китайцев. Они наконец массово приобщились к мундиалю на уровне полуфинала, не пожалев денег. А как болельщики из Поднебесной выметали киоски с официальной атрибутикой уже после матча — надо было видеть.

Тучу прогнал шум трибун. Место досталось хорошее, где-то на среднем уровне. Оттуда хорошо было видно, как ребята в белом электричками носятся мимо платформ. Платформами были хорватские игроки. Казалось, что им дается с трудом каждое движение. Они элементарно не успевали за лихими атаками. Никто не успевал. Многоопытный Лука Модрич завалил Деле Алли, который выше его на голову, на границе штрафной площади в самом начале матча. Выполняющий все штрафные Киран Триппьер из «Тоттенхэма» запустил мяч над стенкой, Деян Ловрен из «Ливерпуля» чуть не допрыгнул, у вратаря Даниэля Субашича не осталось шансов. Английская торсида издала клич восторга и запела по-настоящему, что периодически прерывалось вздохом разочарования.

Было от чего. Капитан Гарри Кейн с метра угодил в штангу и запорол момент, который может возглавить любой хит-парад курьезов. Джесси Лингард аккуратно и без помех укладывал мяч в правый от голкипера угол, но промахнулся. Подходов было не счесть. Хорваты упирались как могли, но выглядели обреченными. С трибун свистели.

Не всем — «Лужники» сборную Хорватии как раз поддерживали куда больше, чем англичан. Свист адресовался конкретному игроку. Не англичане свистели, и тем более не китайцы. Хозяева отличались, россияне, о чьем радушии и не устают кричать на всех телеканалах. Мишенью стал защитник Домагой Вида. Мало того что он забил второй, едва не ставший решающим, мяч в ворота Игоря Акинфеева. Он после матча вместе с членом хорватской делегации Огненом Вукоевичем еще и сделал достоянием интернета ролик, в котором было больше глупости, чем крамолы.

На «Слава Украине!» наши пропагандисты накинулись как на красную тряпку. Уже и ФИФА наказала штрафников, уже и сами хорваты лишили аккредитации Вукоевича, уже и сам Вида извинился, уже и болельщики растянули чуть ли не на два сектора полотнище со словами благодарности России.

Но Виду не поняли и не простили, проявив даже большую, чем игравший в киевском «Динамо» футболист, зависимость от политики.

Вида ухом не повел. Хорваты выстояли. Англичанам стоило насторожиться. Но они вышли на второй тайм, явно собираясь играть по счету. Раньше это у них получалось — Саутгейт многому научил свою молодую и не слишком искушенную команду. Однако на этот раз против них были хорваты, которые дважды проигрывали соперникам по ходу матча в кубковом раунде — и дважды побеждали. Бойцы и мастера, которые никогда не сдаются. Они же без замен играли, вплоть до начала дополнительного времени — факт для такого матча невероятный.


Вида с сыном празднуют выход в финал. Фото: Влад Докшин / «Новая газета»

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

Злым гением для нее стал Марио Манджукич. Форварда «Ювентуса» упустили в штрафной, мяч скинул герой матча Перишич (позже Иван скажет, что Марио оказался в правильном месте), а Манджукич таких моментов не упускает. Потом дважды будто состоящий из одних жил гигант будет без сил усаживаться на газон, а подняться ему будут помогать англичане, уже считавшие каждую потерянную секунду.

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

Саутгейт на пресс-конференции будет в основном говорить о том же, о чем говорят после победного поражения сборной России: о прогрессе команды и полученном ею опыте. И меньше всего — об утешительном финале в Санкт-Петербурге с бельгийцами.

Фраза «на месте хорватов должна была оказаться сборная России» не подходит. Могла, но не оказалась. И точка.

Да, а как же полуфинал Франция — Бельгия? Как же несостоявшийся триумф самой зрелищной сборной чемпионата? Почему же не получилось у блистательного трио Азар — де Брейне — Лукаку?

Да потому что французы. Наверное, будущие чемпионы. Пружинистая, гибкая, хитрая, до ужаса прагматичная сборная, каковой никогда до этого она не была. Дидье Дешам после обидно проигранного финала домашнего Евро двухгодичной давности включил программу под названием «главное — результат». И сделал из очень талантливой, но сыроватой сборной команду-убийцу, которая может задушить любого соперника.

Перед воскресеньем все за французов. Абсолютно все. Но вишенка на торте уже есть. Вы знаете, как она называется.