Руководство по единому принципу

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

инструкции для сотрудников

Инструкция – это документ, который объясняет способы или правила выполнения определенных действий. А понятная инструкция делает то же самое, но простым языком. Многие руководства написаны очень сложно и люди предпочитают не заглядывать в них, пока что-то не сломается.

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

3 основных вида инструкций

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

Пошаговая инструкция

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

Пошаговое руководство

Вот как может выглядеть краткое пошаговое руководство по замене картриджа в лазерном принтере Brother HL-1110R:

  1. Откройте верхнюю крышку и извлеките блок фотобарабана
  2. Установите в нижнее положение переключатель в правом нижнем углу блока фотобарабана
  3. Вытащите тонер-картридж
  4. Поставьте на его место новый
  5. Подвигайте в разные стороны зеленую лапку в левом верхнем углу фотобарабана. Обязательно верните ее в исходное положение
  6. Установите фотобарабан обратно в принтер
  7. Закройте крышку
  8. Сделайте пробную печать. Если появляется сообщение «Замените тонер», значит фотобарабан установлен неправильно, и шаги 1-7 нужно проделать заново. Если неисправность не исчезает обратитесь к системному администратору

Инструкция по использованию

Это перечень рекомендаций по правильному использованию приборов, например, руководство к сканеру штрих-кодов. Такие мануалы будут полезны пользователям непростых устройств — на рабочем месте или в быту.

инструкция по использованию

В отличие от пошагового алгоритма, акцент делается не на достижении определенного результата, а на особенностях применения. Например, вот как можно кратко написать инструкцию по использованию ламинатора Rayson LM 330iD:

  • В зависимости от толщины пленки устанавливают необходимую температуру. Например, для 75 mic нужно 100-120°C, а для 250 mic 160-180°C.
  • Максимальное время работы ламинатора 4 часа. Затем нужно сделать получасовой перерыв.
  • Если внутри ламинатора застрял документ, нажмите кнопку «Реверс» и извлеките его. 
  • Внимание! Не ламинируйте влажные образцы жидкость может повредить электронные компоненты!
  • После ламинирования 10-15 листов, нужно очистить аппарат от клейкого материала. Для этого ламинатор отключают от сети и протирают валы тканью с моющим средством. 
  • Внимание! Не используйте для очистки бензин и растворители – это приводит к возгоранию! 

Должностная инструкция

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

Должностная инструкция

Вот как может выглядеть раздел обязанностей для грузчика ООО «Дельта»:

  1. Работник обязан выполнять погрузочно-разгрузочные работы на территории склада Организации
  2. При работе он может пользоваться спецтехникой (электрокаром) если у него есть необходимые допуски
  3. Бригадир раздает списки, по которым комплектуются грузы. 
  4. Отобранный товар кладут на паллету и закрепляют соблюдая технику безопасности при перевозке грузов
  5. Если есть необходимость, грузчик может привлекаться к другим работам на территории склада уборке, контролю за въездом транспорта и пр.

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

Ниже вы можете получить готовую структуру обучения для курса «Пособие по должности».

Общие правила при подготовке инструкций

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

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

Алгоритм разработки руководства: 9 шагов

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

  1. Собрать информацию
  2. Сгруппировать ее по отдельным этапам
  3. Изложить последовательность выполнения каждого этапа с учетом уровня подготовки читателя

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

Шаг 1. Изучить ситуацию

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

Шаг 2. Разложить все на отдельные этапы

Задача этого шага – создать предварительный план решения задачи. Такой алгоритм начинается с исходной ситуации и заканчивается достижением результата. В начало каждого пункта поставьте глагол, определяющий ключевое действие этого шага:

  1. Запустить программу Microsoft Word
  2. Создать новый документ
  3. Набрать необходимый текст
  4. Отформатировать его 
  5. Сохранить файл
  6. Сообщить в бухгалтерию, что заявление подготовлено 

Шаг 3. Описать каждый этап

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

Не стоит бояться слишком заурядных объяснений – скорее всего найдутся те, кто еще не знает этого, а остальные легко пропустят такое описание. Например, для тех, кто не работал с программой Word, нужно пояснить как создается файл:

2. Нажмите на раздел «Новый документ» в правой части экрана 

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

Совет. Старайтесь не нагромождать вашу инструкцию ненужными действиями. Например, лишней будет информация о том, какой шрифт использовать для заявления – в большинстве случаев пользователь столкнется с шаблоном Normal, где стоит подходящий Calibri размером 11 пунктов. 

Шаг 4. Рассмотреть нестандартные варианты развития ситуации

Стараясь предусмотреть форс-мажорные обстоятельства, улучшите свой алгоритм, предлагая варианты решения. Например:

3. <…> Если печатаются латинские символы, поменяйте раскладку. Для этого одновременно нажмите клавиши «Shift» и «Ctrl» в левой нижней части клавиатуры 

Шаг 5. Подобрать изображения и привести примеры

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

Шаг 6. Придумать заголовок

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

  • «Как написать инструкцию по подготовке заявления»
  • «6 шагов для подготовки электронного документа»
  • «Простой способ написать заявление на компьютере»
  • «Подробный алгоритм подготовки документа для безбумажного оборота»

Шаг 7. Оценить промежуточный вариант

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

Как написать простую инструкцию (образец): 

  1. Запустите программу Microsoft Word
  2. Нажмите на раздел «Новый документ» в правой части экрана 
  3. Наберите необходимый текст в открывшемся окне. Образец приведен ниже.
  4. Отформатируйте набранный текст с помощью верхней панели программы Word.
    • Сначала Выделите шапку заявления (адресата и составителя заявления). Нажмите на кнопку «Выравнивание по правому краю» на верхней панели программы Word. Строки переместятся вправо
    • Аналогичным способом отформатируйте заголовок (используем кнопку «Выравнивание по центру»)
    • Выделите список спецодежды и примените к нему функцию «Маркированный список» 
  1. Сохраните файл. Для этого:
    • Нажмите сочетание клавиш «Ctrl+S» или на иконку дискеты в левом верхнем углу
    • Выберите путь сохранения файла
    • В строке «Имя файла» удалите текущее содержимое и напишите: «Заявление от …». Вместо многоточия укажите фамилию, инициалы заявителя и дату, например «Заявление от Иванова В.И. 27.03.2022»
    • Нажмите кнопку «Сохранить»
  2. Сообщите в бухгалтерию (внутренний телефон: 2-31) или секретарю зам. директора по персоналу (т.: 2-42), что заявление подготовлено. 

Пример объявления, на который можете ориентироваться при подготовке:

Шаг 8. Тестирование

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

Проверьте алгоритм с помощью этих вопросов:

  • Понятен ли указанный порядок действий? Да, мы улучшали его в шагах 2-5
  • Все ли нюансы учтены? Да, последовательность шагов охватывает всю необходимую процедуру
  • Есть ли в алгоритме сложные этапы, которые можно разбить на несколько частей? Нет, все они были скорректированы на предыдущих шагах
  • Достигнут ли результат? Будет ли он неизменным при разных условиях использования алгоритма? Да, на выходе мы получаем файл для безбумажного оборота. При правильном следовании приведенной последовательности, результата можно достичь вне зависимости от того, кто составляет заявление – грузчик или уборщица

Шаг 9. Обучить сотрудников по инструкции

Если руководство предназначено для сотрудников компании, важно проконтролировать, что они изучили ее. Для этого загрузите инструкцию для персонала на платформу Unicraft, назначьте на нее работника и отслеживайте его прогресс. 

Особенности такого обучения:

  • Информация сопровождается рисунками, схемами, анимацией, формами обратной связи – это увлекательнее, чем простое чтение текста
  • В режиме реального времени руководитель может видеть, какое количество материала уже изучено
  • В конце разделов и всего курса предусмотрены контрольные вопросы. Процент правильных ответов для успешного прохождения курса можно задавать самостоятельно (обычно он составляет 80%)

Примеры готовых инструкций

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

Вывод

Резюмируя все изложенное, можно составить требования к идеальной инструкции:

  • Актуальность. В тексте нет устаревших сведений
  • Информативность и целостность. Подготовленное руководство содержит все необходимые сведения
    по обозначенной теме. У пользователя не остается вопросов
  • Лаконичность. Приоритеты для составителя – это точность формулировок и отсутствие второстепенных сведений. Часто бывает, что инструкцию смотрят в сложных ситуациях, когда нужно быстро получить ответ на возникший вопрос
  • Наглядность. Информация сопровождается примерами и иллюстрациями
  • Конкретный результат. Руководство помогает получить конечное решение
  • Соотносимость с текущими знаниями пользователя. Чем ниже уровень знаний аудитории, тем подробнее объяснения
  • В тексте нет сложных конструкций. Они разбиты на несколько частей. Каждый пункт списка – это отдельное действие, которое дополняется комментариями и пояснениями

Вам будет интересно

агрегаторы курсов

Готовые курсы для бизнеса: проверенные агрегаторы онлайн курсов

как учиться эффективно

Как учиться эффективно: проверенная технология обучения

платформы для вебинаров

Где провести вебинар: лучшие программы для вебинаров

Перейти на главную блога

Время на прочтение
10 мин

Количество просмотров 38K

image Single responsibility principle, он же принцип единой ответственности,
он же принцип единой изменчивости — крайне скользкий для понимания парень и столь нервозный вопрос на собеседовании программиста.

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

В лесу нас разделили на группы по 8-9 человек в каждой и устроили соревнование — какая группа быстрее выпьет бутылку водки при условии, что первый человек из группы наливает водку в стакан, второй выпивает, а третий закусывает. Выполнивший свою операцию юнит встает в конец очереди группы.

Случай, когда размер очереди был кратен трем, и являлся хорошей реализацией SRP.

Определение 1. Единая ответственность.

Официальное определение принципа единой ответственности (SRP) говорит о том, что у каждого объекта есть своя ответственность и причина существования и эта ответственность у него только одна.

Рассмотрим объект «Выпивоха» (Tippler).
Для выполнения принципа SRP разделим обязанности на троих:

  • Один наливает (PourOperation)
  • Один выпивает (DrinkUpOperation)
  • Один закусывает (TakeBiteOperation)

Каждый из участников процесса ответственен за одну компоненту процесса, то есть имеет одну атомарную ответственность — выпить, налить или закусить.

Выпивоха же, в свою очередь является фасадом для данных операций:

сlass Tippler {
    //...
    void Act(){
        _pourOperation.Do() // налить
        _drinkUpOperation.Do() // выпить
        _takeBiteOperation.Do() // закусить
    }
}

image

Зачем?

Человек-программист пишет код для человека-обезьяны, а человек-обезьяна невнимателен, глуп и вечно куда-то спешит. Он может удержать и понять около 3 — 7 термов в один момент времени.
В случае выпивохи этих термов три. Однако если мы напишем код одной простыней, то в нем появятся руки, стаканы, мордобои и бесконечные споры о политике. И все это будет в теле одного метода. Уверен — вы видели такой код в своей практике. Не самое гуманное испытание для психики.

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

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

Так вот, SRP — это принцип, объясняющий КАК декомпозировать, то есть где провести линию разделения.

Он говорит, что декомпозировать надо по принципу разделения «ответственности», то есть по задачам тех или иных объектов.

image

Вернемся к выпивохе и плюсам, которые получает человек-обезьянка при декомпозировании:

  • Код стал предельно ясен на каждом уровне
  • Код могут писать несколько программистов сразу (каждый пишет отдельный элемент)
  • Упрощается автоматическое тестирование — чем проще элемент, тем легче его тестировать
  • Из этих трех операций, в будущем, вы сможете сложить обжору ( используя только TakeBitOperation), Алкоголика (используя только DrinkUpOperation напрямую из бутылки) и удовлетворить многие другие требования бизнеса.

И, конечно же, минусы:

  • Придется создать больше типов.
  • Выпивоха впервые выпьет на пару часов позже, чем мог бы

Определение 2. Единая изменчивость.

Позвольте господа! Класс выпивохи же также выполняет единую ответственность — он выпивает! И вообще, слово «ответственность» — понятие крайне размытое. Кто-то ответственен за судьбу человечества, а кто-то ответственен за поднимание опрокинутых на полюсе пингвинов.

Рассмотрим две реализации выпивохи. Первая, указанная выше, содержит в себе три класса — налить, выпить и закусить.

Вторая, написана через методологию «Вперед и только вперед» и содержит всю логику в методе Act:

//Не тратьте время  на изучение этого класса. Лучше съешьте печеньку
сlass BrutTippler {
   //...
   void Act(){
        // наливаем
    if(!_hand.TryDischarge(from:_bottle, to:_glass, size:_glass.Capacity))
        throw new OverdrunkException();

    // выпиваем
    if(!_hand.TryDrink(from: _glass,  size: _glass.Capacity))
        throw new OverdrunkException();

    //Закусываем
    for(int i = 0; i< 3; i++){
        var food = _foodStore.TakeOrDefault();
        if(food==null)
            throw new FoodIsOverException();

        _hand.TryEat(food);
    }
   }
}

Оба этих класса, с точки зрения стороннего наблюдателя, выглядят абсолютно одинаково и выполняют единую ответственность «выпить».

Конфуз!

Тогда мы лезем в интернет и узнаем другое определение SRP — Принцип единой изменчивости.

Это определение гласит, что «У модуля есть один и только один повод для изменения«. То есть «Ответственность — это повод для изменения».

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

В подходе «Вперед и только вперед», все что можно поменять — меняется только в методе Act. Это может быть читабельно и эффективно в случае, когда логики немного и она редко меняется, но зачастую это кончается ужасными методами по 500 строк в каждом, с количеством if -ов большим, чем требуется для вступления России в нато.

Определение 3. Локализация изменений.

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

Начнем логировку с процесса наливания:

class PourOperation: IOperation{
    PourOperation(ILogger log /*....*/){/*...*/}
    //...
    void Do(){
        _log.Log($"Before pour with {_hand} and {_bottle}");
        //Pour business logic ...
        _log.Log($"After pour with {_hand} and {_bottle}");
    }
}

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

interface IPourLogger{
    void LogBefore(IHand, IBottle){}
    void LogAfter(IHand, IBottle){}
    void OnError(IHand, IBottle, Exception){}
}

class PourOperation: IOperation{
    PourOperation(IPourLogger log /*....*/){/*...*/}
    //...
    void Do(){
        _log.LogBefore(_hand, _bottle);
        try{
             //... business logic
             _log.LogAfter(_hand, _bottle");
        }
        catch(exception e){
            _log.OnError(_hand, _bottle, e)
        }
    }
}

Дотошный читатель заметит, что LogAfter, LogBefore и OnError также могут меняться по отдельности, и по аналогии с предыдущими действиями создаст три класса: PourLoggerBefore, PourLoggerAfter и PourErrorLogger.

А вспомнив, что операций для выпивохи три — получаем девять классов логирования. В итоге весь выпивоха состоит из 14 (!!!) классов.

Гипербола? Едва ли! Человек-обезьянка с декомпозиционной гранатой раздробит “наливателя” на графин, стакан, операторы наливания, сервис подачи воды, физическую модель столкновения молекул и следующий квартал будет пытаться распутать зависимости без глобальных переменных. И поверьте — он не остановится.

Именно на этом моменте многие приходят к выводу, что SRP — это сказки из розовых королевств, и уходят вить лапшу…

… так и не узнав о существовании третьего определения Srp:

«Схожие для изменения вещи должны храниться в одном месте«. или “То, что изменяется вместе, должно храниться в одном месте

То есть, если мы меняем логировку операции, то мы должны это менять в одном месте.

Это очень важный момент — так как все объяснения SRP, которые были выше, говорили о том, что надо дробить типы, пока они дробятся, то есть накладывало «ограничение сверху» на размер объекта, а теперь мы говорим уже и об «ограничении снизу». Иными словами, SRP не только требует «дробить пока дробится», но и не перестараться — «не раздробить сцепленные вещи». Не усложнять без надобности. Это великая битва бритвы Оккама с человеком-обезьяной!

image

Теперь выпивохе должно стать полегче. Помимо того, что не надо дробить логировщик IPourLogger на три класса, мы также можем объединить все логировщики в один тип:

class OperationLogger{
    public OperationLogger(string operationName){/*..*/}
    public void LogBefore(object[] args){/*...*/}       
    public void LogAfter(object[] args){/*..*/}
    public void LogError(object[] args, exception e){/*..*/}
}

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

В результате у нас 5 классов для решения задачи выпивания:

  • Операция наливания
  • Операция выпивания
  • Операция заедания
  • Логировщик
  • Фасад выпивохи

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

Примеры из реальной жизни

Сериализация и десериализация

В рамках разработки протокола передачи данных нужно сделать сериализацию и десериализацию некоторого типа «User» в строку.

User{
    String Name;
    Int Age;
}

Можно подумать, что сериализацию и десериализацию нужно делать в отдельных классах:

UserDeserializer{
    String deserialize(User){...}
}
UserSerializer{
    User serialize(String){...}
}

Так как у каждого из них есть своя ответственность и один повод для изменения.

Но повод для изменения у них общий — «изменение формата сериализации данных».
И при изменение этого формата всегда будут меняться и сериализация и десериализация вместе.

Согласно принципу локализации изменений мы должны объединить их в один класс:

UserSerializer{
    String deserialize(User){...}
    User serialize(String){...}
}

Это избавиляет нас от излишней сложности, и необходимости помнить, что при каждом изменении сериализатора, нужно помнить и о десериализаторе.

Посчитай и сохрани

Необходимо посчитать годовую выручку компании и сохранить ее в файл C:results.txt.

Быстро решаем это при помощи одного метода:

void SaveGain(Company company){
    //Код по подсчету выручки компании 
        //и сохранению результатов
}

Уже из определения задачи видно, что есть две подзадачи -«Посчитать выручку» и «Сохранить выручку». Каждая из них имеет по одному поводу для изменений — «изменене методики подсчета» и «изменение формата сохранения». Эти изменения никак не пересекаются. Так же, мы не можем односложно ответить на вопрос — «что делает метод SaveGain?». Этот метод И считает выручку И сохраняет результаты.

Потому нужно разделить этот метод на два:

Gain CalcGain(Company company){..}
void SaveGain(Gain gain){..}

Плюсы:

  • можно отдельно протестировать CalcGain
  • проще локализовать баги и вносить изменения
  • повысилась читабельность кода
  • уменьшился риск ошибки в каждом из методов из-за их упрощения

Сложная бизнес логика

Однажды мы писали сервис автоматической регистрации b2b клиента. И появился GOD -метод на 200 строк подобного содержимого:

  • Сходи в 1С и заведи счет
  • С этим счетом сходи к платежному модулю и заведи его там
  • Проверь, что аккаунт с таким счетом не создан в главном сервере
  • Создай новый аккаунт
  • Результат регистрации в платежном модуле и номер 1с добавь в сервис результатов регистрации
  • Добавь в эту таблицу информацию об аккаунте
  • Создай номер точки для этого клиента в сервисе точек. Передай в этот сервис номер счета 1с.

В этом списке было еще около 10-ти бизнес операций с жуткой связанностью. Объект счета нужен был почти всем. Идентификатор точки и имя клиента нужны были в половине вызовов.

После часового рефакторинга, мы смогли отделить инфраструктурный код и некоторые нюансы работы с аккаунтом в отдельные методы/классы. God метод полегчал, но осталось 100 строк кода, которые распутываться никак не хотели.

Лишь через несколько дней пришло понимание, что суть этого «полегчавшего» метода — и есть бизнес алгоритм. И что изначальное описание ТЗ было довольно сложным. И именно попытка разбить на куски этот метод будет нарушением SRP, а не наоборот.

Формализм.

Пришло время оставить в покое нашего выпивоху. Вытрите слезы — мы обязательно вернемся к нему как-нибудь. А сейчас формализуем знания из этой статьи.

Формализм 1. Определение SRP

  1. Разделяйте элементы так, чтобы каждый из них был ответственен за что-то одно.
  2. Ответственность расшифровывается как «повод для изменения». То есть каждый элемент имеет только один повод для изменения, в терминах бизнес логики.
  3. Потенциальные изменения бизнес логики. должны быть локализованы. Изменяемые вместе элементы должны быть рядом.

Формализм 2. Необходимые критерии самопроверки.

Мне не встречались достаточные критерии выполнения SRP. Но есть необходимые условия:

1) Задайте себе вопрос — что делает этот класс/метод/модуль/сервис. вы должны ответить на него простым определением. ( благодарю Brightori )

пояснения

Впрочем иногда подобрать простое определение очень сложно

2) Фикс некоторого бага или добавление новой фичи затрагивает минимальное количество файлов/классов. В идеале — один.

пояснения

Так как ответственность (за фичу или баг) инкапсулированна в одном файле/классе, то вы точно знаете где искать и что править. Например: фича изменения вывода логировки операций потребует изменить только логировщик. Бегать по всему остальному коду не требуется.

Другой пример — добавление нового UI-контрола, схожего с предыдущими. Если это заставляет вас добавить 10 разных сущностей и 15 разных конвертеров — кажется, вы “передробили”.

3)Если несколько разработчиков работают над разными фичами вашего проекта, то вероятность мердж -конфликта, то есть вероятность того, что один и тот же файл/класс будет изменен у нескольких разработчиков одновременно — минимальна.

пояснения

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

4) При уточняющем вопросе про бизнес логику (от разработчика или менеджера) вы лезете строго в один класс/файл и получаете информацию только от туда.

пояснения

Фичи, правила или алгоритмы компактно написаны каждая в одном месте, а не разбросаны флагами по всему пространству кода.

5) Нейминг понятен.

пояснения

Наш класс или метод ответственен за что-то одно, и ответственность отражена в его названии

AllManagersManagerService — скорее всего, God-класс
LocalPayment — вероятно, нет

Формализм 3. Методика разработки «Оккама-first».

В начале проектирования, человек-обезьянка не знает и не чувствует всех тонкостей решаемой задачи и может дать маху. Ошибаться можно по разному:

  • Сделать слишком большие объекты, склеив разные ответственности
  • Передробить, разделив единую ответственность на много разных типов
  • Неверно определить границы ответственности

Важно запомнить правило: «ошибаться лучше в большую сторону», или «не уверены — не дробите». Если, например, ваш класс собирает в себе две ответственности — то он по прежнему понятен и его можно распилить на два с минимальным изменением клиентского кода. Собирать же из осколков стекла стакан, как правило, сложнее из-за размазанного по нескольким файлам контекста и отсутствия необходимых зависимостей в клиентском коде.

Пора закругляться

Сфера применения SRP не ограничивается ООП и SOLID. Он применим к методам, функциям, классам, модулям, микросервисам и сервисам. Он применим как к “фигакс-фигакс-и-в-прод”, так и к “рокет-сайнс” разработке, везде делая мир чуточку лучше. Если задуматься, то это едва ли не фундаментальный принцип всей инженерии. Машиностроение, системы управления, да и вообще все сложные системы — строятся из компонентов, и “недодробление” лишает конструкторов гибкости, “передробление” — эффективности, а неверные границы — разума и душевного спокойствия.

image

SRP не выдуман природой и не является частью точной науки. Он вылезает из наших с вами биологических и психологических ограничений.Это всего лишь способ контролировать и развивать сложные системы при помощи мозга человека-обезьяны. Он рассказывает нам, как декомпозировать систему. Изначальная формулировка требовала изрядного навыка телепатии, но надеюсь, эта статья слегка развеяла дымовую завесу.

Предложения со словосочетанием «единое руководство»

Расчленённые танками и авиацией врага, они были лишены единого руководства.

На крайний случай рассеять, раздробив на малые отряды, лишив единого руководства.

К середине 1830-х годов она почувствовала необходимость единого руководства всем прогрессивным движением.

Подготовка полезного бизнес-плана – трудоёмкий процесс, требующий определённых материальных затрат и затрат времени многих специалистов предприятия, объединённых единым руководством и одной идеей.

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

Привет! Меня зовут Лампобот, я компьютерная программа, которая помогает делать
Карту слов. Я отлично
умею считать, но пока плохо понимаю, как устроен ваш мир. Помоги мне разобраться!

Спасибо! Я стал чуточку лучше понимать мир эмоций.

Вопрос: табунок — это что-то нейтральное, положительное или отрицательное?

Таким образом, отдельные мононациональные государства практически не имели шансов на выживание и дальнейшее развитие, пока север страны был объединён под сильным единым руководством.

У нас каждый человек на счёту, и сегодня более, чем когда-либо, необходимо единое руководство всеми нашими силами.

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

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

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

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

И что было самое неприятное – эти бандиты, вне всякого сомнения, имели средства связи и подчинялись единому руководству.

Современное масонство неоднородно, не имеет единого руководства, центра управления и единой иерархии.

На самом деле, то, что удалось сделать выжившим при атаке дронам, лишённым единого руководства и изолированным друг от друга в полуразрушенных помещениях и коридорах, следовало считать редкой удачей.

Воспользовавшись отсутствием у римлян единого руководства, персы одержали блистательную победу200.

Но арест городских старшин сделал своё дело, лишив язычников единого руководства.

Организационное единство предприятия означает наличие единого руководства, учёта, стратегии развития.

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

Разведка не была объединена единым руководством.

Как будто существует единое руководство по выживанию в аду.

Нет единого руководства по всем клиническим ситуациям.

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

Против нас действует сборная солянка, не имеющая единого руководства!

Я вообще такого соблюдения законности сроду не видывал, всё, как по написанному: единое руководство осмотром места происшествия возлагается на следователя.

Чтобы избавиться от возникавших в связи с этим серьёзных помех, Информационный центр исследова¬ний мозга UCLA финансировал проект по разработке единого руководства по классификации фаз сна.

В отсутствии единого руководства рода войск противника жили каждый своей жизнью.

Всё это в одном флаконе и под единым руководством временного следственного управления, специально созданного по такому случаю.

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

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

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

Сформировалось и единое руководство отрядами, называвшее себя: Партия защиты крестьянства.

Вместе с теплом в горы придут монголы, и, без единого руководства обороной, государство рухнет.

Готские племена в то время не составляли союза и не имели единого руководства.

Все государства подчиняются единому руководству и имеют одно законодательство.

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

Предприятие обладает организационным единством, что означает наличие единого руководства, учёта, стратегии развития.

Бывали времена, когда ему казалось, что различные части его не подчиняются единому руководству.

На первых порах крепко мешало отсутствие единого руководства.

Расчленённые танками и авиацией, они были лишены единого руководства.

Ассоциации к слову «единый»

Ассоциации к слову «руководство»

Синонимы к словосочетанию «единое руководство»

Цитаты из русской классики со словосочетанием «единое руководство»

  • И как, перебирая, не находили виновного, то и приказали всех парубков до единого, — был ли кто из них или не был в экспедиции, участвовал ли в чем или нет, — собрать во двор и под наблюдением Петруся и под руководством почтенного наставника нашего управиться с ними по своему усмотрению.
  • (все
    цитаты из русской классики)

Сочетаемость слова «руководство»

  • советское руководство
    высшее руководство
    партийное руководство
  • руководство страны
    руководство компании
    руководство партии
  • стиль руководства
    смена руководства
    мнение руководства
  • руководство считает
    руководство решило
    руководство понимает
  • взять на себя руководство
    работать под чьим-либо руководством
    осуществлять общее руководство
  • (полная таблица сочетаемости)

Значение слова «единый»

  • ЕДИ́НЫЙ, —ая, —ое; еди́н, -а, -о. 1. ( обычно с отрицанием). Один. (Малый академический словарь, МАС)

    Все значения слова ЕДИНЫЙ

Значение слова «руководство»

  • РУКОВО́ДСТВО, -а, ср. 1. Действие по глаг. руководить (в 1 знач.). Руководство революционной борьбой пролетариата. (Малый академический словарь, МАС)

    Все значения слова РУКОВОДСТВО

Афоризмы русских писателей со словом «единый»

  • Есть слово — и оно едино.
    Россия. Этот звук — свирель.
    В нем воркованье голубино.
  • Плывя, я возглашу единый клич:»Россия!»
    Горя, я пропою:»Люблю тебя — везде!»
  • Из нас, я думаю, не скажет ни единый
    Осине: дубом будь, иль дубу — будь осиной;
    Меж тем как странны мы! Меж тем любой из нас
    Переиначить свет задумывал не раз.
  • (все афоризмы русских писателей)

Отправить комментарий

Дополнительно

СОГЛАШЕНИЕ
О ЕДИНЫХ ПРИНЦИПАХ И ПРАВИЛАХ ОБРАЩЕНИЯ ЛЕКАРСТВЕННЫХ
СРЕДСТВ В РАМКАХ ЕВРАЗИЙСКОГО ЭКОНОМИЧЕСКОГО СОЮЗА

(Москва, 23 декабря 2014 года)

Государства — члены Евразийского экономического союза, именуемые далее государствами-членами,

основываясь на Договоре о Евразийском экономическом союзе от 29 мая 2014 года,

подтверждая намерение развивать экономическое сотрудничество и расширять торгово-экономические связи,

признавая, что лекарственные средства относятся к социально значимой продукции,

в целях формирования общего рынка лекарственных средств в рамках Евразийского экономического союза (далее — Союз),

ставя целью укрепление здоровья населения государств-членов путем обеспечения доступа к безопасным, эффективным и качественным лекарственным средствам,

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

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

стремясь к устранению необоснованных ограничений во взаимной торговле,

согласились о нижеследующем:

1. Для целей настоящего Соглашения используются понятия, которые означают следующее:

«лекарственное средство» — средство, представляющее собой или содержащее вещество или комбинацию веществ, вступающее в контакт с организмом человека, предназначенное для лечения, профилактики заболеваний человека или восстановления, коррекции или изменения его физиологических функций посредством фармакологического, иммунологического либо метаболического воздействия или для диагностики заболеваний и состояний человека;

«лекарственный препарат» — лекарственное средство в виде лекарственной формы;

«надлежащие фармацевтические практики в сфере обращения лекарственных средств» (далее — надлежащие фармацевтические практики) — правила, распространяющиеся на все этапы обращения лекарственных средств: надлежащая лабораторная практика, надлежащая клиническая практика, надлежащая производственная практика, надлежащая дистрибьюторская практика, надлежащая аптечная практика, надлежащая практика фармаконадзора и другие практики;

«обращение лекарственных средств» — деятельность, включающая процессы разработки, доклинических исследований, клинических исследований (испытаний), экспертизы, регистрации, фармаконадзора, контроля качества, производства, изготовления, хранения, транспортирования, ввоза на таможенную территорию Союза и вывоза с таможенной территории Союза, перемещения с территории одного государства-члена на территории других государств-членов, отпуска, реализации, передачи, применения, уничтожения лекарственных средств;

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

2. Государства-члены при формировании общего рынка лекарственных средств в рамках Союза руководствуются унифицированными понятиями и их определениями в соответствии с информационным справочником понятий и определений в сфере обращения лекарственных средств, формирование и ведение которого осуществляется Евразийской экономической комиссией (далее — Комиссия).

1. Настоящее Соглашение устанавливает единые принципы и правила обращения лекарственных средств в рамках Союза в целях формирования общего рынка лекарственных средств в рамках Союза.

2. Действие настоящего Соглашения распространяется на правоотношения, возникающие в сфере обращения лекарственных средств, находящихся в обращении в рамках Союза.

1. Регулирование обращения лекарственных средств в рамках Союза осуществляется в соответствии с настоящим Соглашением, другими международными договорами, входящими в право Союза, решениями Комиссии и законодательством государств-членов.

Решения Комиссии, регулирующие обращение лекарственных средств, разрабатываются на основе международных норм.

2. Государства-члены направляют в Комиссию предложения в отношении разработки проектов актов органов Союза в сфере обращения лекарственных средств.

3. В целях обеспечения выполнения требований в сфере обращения лекарственных средств в рамках Союза Комиссия вправе принимать рекомендации, касающиеся определения оптимальных подходов, реализация которых позволит обеспечить выполнение таких требований.

1. Государства-члены формируют общий рынок лекарственных средств, соответствующих требованиям надлежащих фармацевтических практик, согласно принципам, указанным в статье 30 Договора о Евразийском экономическом союзе от 29 мая 2014 года.

2. Государства-члены проводят скоординированную политику в сфере обращения лекарственных средств посредством:

а) принятия мер, необходимых для гармонизации и унификации законодательства государств-членов в сфере обращения лекарственных средств;

б) принятия единых правил и требований регулирования обращения лекарственных средств;

в) обеспечения единства обязательных требований к безопасности, эффективности и качеству лекарственных средств на территориях государств-членов и их соблюдения;

г) обеспечения единых подходов к созданию системы обеспечения качества лекарственных средств;

д) гармонизации законодательства государств-членов в области контроля (надзора) в сфере обращения лекарственных средств.

3. Для целей реализации настоящего Соглашения государства-члены определяют органы государственной власти, уполномоченные на осуществление и (или) координацию деятельности в сфере обращения лекарственных средств.

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

5. Органы государственной власти государств-членов, указанные в пункте 3 настоящей статьи, проводят консультации, направленные на согласование позиций государств-членов по вопросам регулирования обращения лекарственных средств.

1. Государства-члены принимают меры для установления фармакопейных требований Союза посредством последовательной гармонизации фармакопейных статей (общих и частных) государственных фармакопей государств-членов.

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

3. Фармакопейные статьи (общие и частные), одобренные Фармакопейным комитетом Союза, в совокупности образуют Фармакопею Союза, которая утверждается Комиссией.

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

5. Порядок деятельности Фармакопейного комитета Союза определяется Комиссией.

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

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

1. Государства-члены осуществляют регистрацию и экспертизу лекарственных средств, предназначенных для обращения на общем рынке лекарственных средств в рамках Союза, в соответствии с правилами регистрации и экспертизы лекарственных средств, утверждаемыми Комиссией.

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

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

4. Регистрация под одним торговым наименованием лекарственных средств, имеющих различный качественный состав действующих веществ, запрещается.

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

6. В рамках Союза регистрации не подлежат:

а) лекарственные средства, изготовленные в аптеках;

б) фармацевтические субстанции;

в) лекарственные средства, предназначенные для использования в качестве выставочных образцов;

г) лекарственные средства, предназначенные для проведения доклинических и клинических исследований (испытаний);

д) лекарственные средства, ввезенные физическим лицом для личного применения;

е) радиофармацевтические лекарственные препараты, изготовленные непосредственно в медицинских организациях в порядке, установленном уполномоченными органами государств-членов;

ж) лекарственные средства, не предназначенные для реализации на таможенной территории Союза;

з) образцы лекарственных средств, предназначенные для регистрации и стандартные образцы.

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

Государства-члены создают условия для проведения исследований (испытаний) лекарственных средств в соответствии с международными стандартами и обеспечивают сопоставимость их результатов.

8. Урегулирование возникающих при регистрации лекарственных средств разногласий осуществляется Экспертным комитетом по лекарственным средствам (далее — Экспертный комитет), создаваемым при Комиссии из представителей государств-членов и осуществляющим деятельность в порядке, утверждаемом Комиссией.

9. Решение уполномоченного органа государства-члена об отказе в выдаче регистрационного удостоверения лекарственного средства может быть обжаловано в суде этого государства-члена в порядке, предусмотренном для разрешения споров, возникающих из административных и иных публичных правоотношений.

1. В рамках Союза допускается реализация лекарственных средств при условии, что они прошли регистрацию в соответствии с процедурой, устанавливаемой Комиссией, и сведения о них внесены в единый реестр зарегистрированных лекарственных средств Евразийского экономического союза.

2. Лекарственные средства, зарегистрированные уполномоченным органом государства-члена до вступления в силу настоящего Соглашения, реализуются на территории этого государства-члена до окончания срока действия регистрационных удостоверений, выданных уполномоченным органом государства-члена.

3. Лекарственные средства, зарегистрированные в соответствии со статьей 7 настоящего Соглашения и реализуемые в рамках Союза, должны иметь маркировку в соответствии с едиными требованиями к маркировке лекарственных средств, утверждаемыми Комиссией, и к ним должна прилагаться инструкция по применению, соответствующая единым требованиям к инструкции по медицинскому применению лекарственных средств, утверждаемым Комиссией.

1. Производство лекарственных средств в рамках Союза осуществляется в соответствии с правилами надлежащей производственной практики, утверждаемыми Комиссией, на основании разрешения (лицензии) на производство лекарственных средств, выданного в соответствии с законодательством государств-членов.

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

3. В случае ненадлежащего исполнения своих обязанностей уполномоченные лица производителей лекарственных средств несут ответственность в соответствии с законодательством государств-членов.

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

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

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

4. Комиссией с учетом предложений государств-членов ведется реестр фармацевтических инспекторов Евразийского экономического союза. Формирование и ведение указанного реестра осуществляется в порядке, утверждаемом Комиссией.

5. Обеспечение деятельности фармацевтических инспекторатов государств-членов осуществляется государствами-членами.

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

1. Государства-члены обеспечивают эффективное функционирование национальной системы фармаконадзора в соответствии с надлежащей практикой фармаконадзора, утверждаемой Комиссией, и законодательством государств-членов.

2. Государства-члены устанавливают в своем законодательстве положения об ответственности держателей регистрационных удостоверений лекарственных средств и иных субъектов обращения лекарственных средств, нарушающих обязательные требования в сфере фармаконадзора.

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

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

5. Экспертный комитет рассматривает случаи расхождения в позициях государств-членов по вопросу оценки соотношения пользы и риска лекарственных средств, находящихся в обращении на территориях государств-членов.

6. Государства-члены осуществляют обмен информацией по результатам проведения инспекций системы фармаконадзора держателя регистрационного удостоверения лекарственного средства с целью определения их соответствия законодательству государств-членов.

1. Государства-члены осуществляют государственный контроль (надзор) за обращением лекарственных средств в порядке, установленном законодательством государств-членов.

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

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

В целях обеспечения условий для обращения на территориях государств-членов безопасных, эффективных и качественных лекарственных средств Комиссией формируются и ведутся:

единый реестр зарегистрированных лекарственных средств Евразийского экономического союза (далее — единый реестр) с интегрированными в него информационными базами данных инструкций по медицинскому применению, графическому оформлению (дизайну) упаковок и нормативными документами по качеству;

единая информационная база данных лекарственных средств, не соответствующих требованиям по качеству, а также фальсифицированных и (или) контрафактных лекарственных средств, выявленных на территориях государств-членов;

единая информационная база данных по выявленным нежелательным реакциям (действиям) на лекарственные средства, включающая сообщения о неэффективности лекарственных средств;

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

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

Комиссия обеспечивает создание и функционирование информационной системы Союза в сфере обращения лекарственных средств (далее — информационная система) с целью предоставления информации о требованиях в сфере обращения лекарственных средств, действующих в рамках Союза, информации, содержащейся в едином реестре и информационных базах данных, указанных в статье 14 настоящего Соглашения, а также данных фармаконадзора и иных групп информации, предусмотренных правилами создания и функционирования информационной системы.

Правила создания и функционирования информационной системы утверждаются решением Комиссии и определяют основы ее создания, функционирования и развития, источники и порядок финансирования.

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

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

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

Уполномоченные органы государств-членов осуществляют мероприятия по обмену опытом, организации совместного обучения специалистов.

По взаимному согласию государств-членов в настоящее Соглашение могут быть внесены изменения, которые оформляются отдельными протоколами и являются неотъемлемой частью настоящего Соглашения.

Споры, связанные с толкованием и (или) применением положений настоящего Соглашения, разрешаются в порядке, определенном статьей 112 Договора о Евразийском экономическом союзе от 29 мая 2014 года.

1. Лекарственные средства, зарегистрированные в государствах-членах до вступления в силу настоящего Соглашения, должны быть приведены в соответствие с требованиями и правилами Союза до 31 декабря 2025 г. в соответствии с процедурой, установленной правилами регистрации и экспертизы лекарственных средств, указанными в статье 7 настоящего Соглашения.

Государства-члены допускают подтверждение регистрации лекарственных средств, имеющих срочные регистрационные удостоверения, выданные до вступления в силу настоящего Соглашения, по истечении их срока действия в соответствии с законодательством государства-члена.

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

1. Настоящее Соглашение вступает в силу с даты получения депозитарием последнего письменного уведомления о выполнении государствами-членами внутригосударственных процедур, необходимых для его вступления в силу, но не ранее 1 января 2016 г.

2. Настоящее Соглашение является международным договором, заключенным в рамках Союза, и входит в право Союза.

Совершено в городе Москве 23 декабря 2014 года в одном подлинном экземпляре на русском языке.

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

За Республику Беларусь

За Республику Казахстан

За Российскую Федерацию

Принцип единственной обязанности, ПЕО (англ. Single responsibility principle, SPR) — один из принципов, которого следует придерживаться при написании кода. Он декларирует, что каждый объект должен иметь одну единственную обязанность и эта обязанность должна быть инкапсулирована в класс.

Термин «SOLID» представляет собой аббревиатуру пяти важнейших принципов работы с классами в объектно-ориентированном проектировании:

  1. Принципа единственной обязанности;
  2. Принципа открытости/закрытости;
  3. Принципа подстановки Барбары Лисков;
  4. Принципа разделения интерфейса;
  5. Принципа инверсии зависимостей.

Этими пятью гибкими принципами следует руководствоваться при написании кода.

Определение

Класс должен иметь одну и только одну причину для изменений.

Это один из 5 гибких принципов SOLID, определенных в книге «Быстрая разработка программ. Принципы, примеры, практика» Робертом С. Мартином. Затем эта книга была переиздана в версии для C# «Принципы, паттерны и методики гибкой разработки на языке C#». То, что декларирует данный принцип, вполне легко понять, однако не так легко  реализовать на практике.

Класс должен иметь одну единственную причину для изменений. Но чем обусловлена подобная необходимость? В компилируемых статически типизированных языках программирования существование нескольких причин может повлечь за собой ряд нежелательных изменений.

Две различные причины для изменений подобны двум различным командам, которые могут работать с одним кодом, и каждая из них будет разворачивать свое собственное решение, которое в случае C++, C# Java или других компилируемых языков, может привести к несовместимости между различными частями приложения.

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

Аудитория

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

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

  1. Модуль сохраняемости — аудитория включает администраторов баз данных и проектировщиков ПО.
  2. Модуль отчетности — аудитория включает клерков, бухгалтеров и операционистов.
  3. Модуль расчета платежей для системы расчета заработной платы — аудитория может включать юристов, менеджеров и бухгалтеров.
  4. Модуль поиска книг в библиотеке — аудитория может включать библиотекаря и читателей.

Роли и актеры

Ассоциирование конкретных лиц с ролями – весьма непростая задача. В небольшой фирме одно единственное лицо может играть сразу несколько ролей, в то время как в крупной организации может быть привлечено несколько исполнителей для выполнения одной функции. Поэтому, пожалуй, будет немаловажно подумать об этих ролях. Однако определить сами роли бывает достаточно сложно. Гораздо легче обозначить актёров, играющих эти роли и связать актёров и нашу аудиторию.

Таким образом, если аудитория обусловливает причины изменения, актёры определяют аудиторию. Это позволит нам свести понятия конкретных лиц вроде «Архитектора Джона» или «Секретаря Марии» к операциям.

Таким образом, согласно Роберту С. Мартину, ответственность — это определенный набор функций, которые выполняет один взятый актёр.

Источник изменений

Рассуждая таким образом, можно сделать вывод о том, что актёры представляют собой источник изменений для набора функций, которые удовлетворяют потребности самих актёров. Наряду с изменением потребностей актёров, этот специфичный набор функций тоже должен измениться и приспособиться под новые потребности актеров.

Актер для ответственности — единственный источник изменений этой ответственности. (Роберт С. Мартин)

Классические примеры

Объекты, которые могут распечатывать сами себя

Предположим, что у нас есть класс Book, который инкапсулирует в себе книгу вместе с её функциональностью.

class Book {
 
    function getTitle() {
        return "A Great Book";
    }
 
    function getAuthor() {
        return "John Doe";
    }
 
    function turnPage() {
        // pointer to next page
    }
 
    function printCurrentPage() {
        echo "current page content";
    }
}

Это может выглядеть как целесообразный класс. У нас есть книга, которая может предоставлять информацию о своем названии, авторе и способна перелистывать страницы. Также этот класс может отображать на экране текущую страницу книгу. Однако существует маленькая проблема в определении актёров, которые могли бы быть вовлечены в управление объектом Book. Сходу можно назвать двух различных актёров: Управление книгой (к примеру, библиотекарь) и Механизм представления данных (например, способ, с помощью которого мы планируем выводить содержимое пользователю — на экран, в графическом виде, только текст или же распечатывать). Существует значительное различие между этими двумя актерами.

Разделяй и властвуй

Совмещение бизнес-логики с представлением является крайне нежелательным, т.к. это будет противоречить принципу единой ответственности (ПЕО). Рассмотрим код ниже:

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

Объекты, которые способны «сохранять» себя

Еще один похожий на предыдущий вариант пример того, как объект может сам себя сохранять и восстанавливаться из представления.

class Book {

	function getTitle() {
		return "A Great Book";
	}

	function getAuthor() {
		return "John Doe";
	}

	function turnPage() {
		// pointer to next page
	}

	function getCurrentPage() {
		return "current page content";
	}

	function save() {
		$filename = '/documents/'. $this->getTitle(). ' - ' . $this->getAuthor();
		file_put_contents($filename, serialize($this));
	}

}

Мы снова можем определить несколько актёров, например, Систему управления книгой и Сохраняемость. Этот класс подлежит модификации каждый раз при измении сохраняемости или способа перелистывания страницы. Можно отметить несколько вариантов изменения данных.

class Book {

	function getTitle() {
		return "A Great Book";
	}

	function getAuthor() {
		return "John Doe";
	}

	function turnPage() {
		// pointer to next page
	}

	function getCurrentPage() {
		return "current page content";
	}

}

class SimpleFilePersistence {
	function save(Book $book) {
		$filename = '/documents/' . $book->getTitle() . ' - ' . $book->getAuthor();
		file_put_contents($filename, serialize($book));
	}
}

Переместив метод сохранения объекта в другой класс, мы сможем явно разделить ответственность и легко изменить данный метод сохраняемости, никак не влияя на класс Book. Так, внедрение класса DatabasePersistence будет абсолютно тривиальным, и наша бизнес-логика, выстроенная вокруг действий с книгой никак не изменится.

Высокоуровневое представление

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

Если мы проанализируем данную схему, то сразу поймем, как соблюдается ПЕО. Создание нового объекта обозначено с правой стороны схемы с помощью «Фабрик» (Factories) и единой точки входа нашего приложения (Main). Один актёр - одна ответственность. О сохраняемости (Persistence) также позаботились, расположив ее внизу. Отдельный модуль предназначается для отдельной ответственности. И наконец, с левой стороны мы разместили представление, или механизм доставки, в виде MVC или каком-либо другом типе пользовательского интерфейса. И вновь соблюден принцип единой ответственности. Все, что нам остается выяснить, - это что делать с самой бизнес-логикой.

Вопросы проектирования программного обеспечения

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

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

Изложим по шагам:

Значение первого критерия должно быть установлено до определения значения второго критерия.

  1. Второй критерий отвечает за удовлетворение потребностей пользователей.
  2. Потребности пользователей – это потребности актёров.
  3. Потребности актёров определяют необходимость изменения этих актёров.
  4. Потребности в изменениях актёров, в свою очередь, определяют нашу ответственность.

Таким образом, в процессе разработки архитектуры нашего программного обеспечения, мы должны:

  1. Определить актёров.
  2. Выявить область ответственности каждого актёра.
  3. Сгруппировать классы и функции так, чтобы каждый из них отвечал только за свою часть.

Менее очевидный пример

class Book {

	function getTitle() {
		return "A Great Book";
	}

	function getAuthor() {
		return "John Doe";
	}

	function turnPage() {
		// pointer to next page
	}

	function getCurrentPage() {
		return "current page content";
	}

	function getLocation() {
		// returns the position in the library
		// ie. shelf number & room number
	}

}

Теперь это выглядит вполне очевидно и рационально. У нас нет метода, который относился бы к сохранению или отображению данных. Мы располагаем функционалом метода turnPage() и еще несколькими методами, позволяющими предоставить необходимые сведения о книге. Однако мы можем столкнуться с некоторой проблемой. Чтобы ее установить, давайте проанализируем наше приложение. Проблема может быть в функции getLocation().

Всем методы нашего класса Book реализуют задуманную бизнес-логику. Поэтому мы должны рассматривать свои перспективы с точки зрения задачи. Если наше приложение написано специально для использования библиотекарями, которые ищут и выдают нам реальные книги, то ПЕО может быть нарушен.

Варианты интерпретации

Мы можем сделать вывод, что методы getAuthor(), getTitle()и getLocation() могут быть нужны только для выполнения операций актеров. Посетители также могут иметь доступ к приложению для выбора книги и чтения нескольких первых ее страниц, которые могут помочь им решить, нужна ли им эта книга или нет. Следовательно, для таких актёров как читатели могут быть полезны все имеющиеся методы, кроме getLocation(), т.к. читателей не волнует, где в библиотеке хранятся нужные книги. Книгу найдет и отдаст в руки посетителя библиотекарь. Таким образом, мы действительно имеем нарушение принципа единой ответственности.

class Book {

	function getTitle() {
		return "A Great Book";
	}

	function getAuthor() {
		return "John Doe";
	}

	function turnPage() {
		// pointer to next page
	}

	function getCurrentPage() {
		return "current page content";
	}

}

class BookLocator {

	function locate(Book $book) {
		// returns the position in the library
		// ie. shelf number & room number
		$libraryMap->findBookBy($book->getTitle(), $book->getAuthor());
	}

}

Для того чтобы найти нужную книгу, библиотекарь должен будет применить класс BookLocator. Посетителю же потребуется только класс Book. Конечно же, BookLocator можно реализовать несколькими разными способами. Так, можно использовать автора книги и ее название, чтобы найти информацию из объекта Book. Это всегда зависит от нашей задачи. Важно то, что при переезде библиотеки в другое помещение организация хранения книг, скорее всего, изменится, и библиотекарю придется искать книги в новой библиотеке, но при этом объект Book затронут не будет. Точно также, если мы позволим читателям просматривать только аннотации книг, закрыв доступ к их страницам – мы никак не повлияем ни на библиотекаря, ни на собственно процесс поиска полок, на которых находятся книги.

Однако если наша задача – исключить библиотекаря и разработать механизм самообслуживания в нашей библиотеке, то мы можем считать, что ПЕО был соблюден в нашем первом примере. Читатели в этом случае сами станут выступать в роли библиотекарей, и им придется идти искать книги самостоятельно, после чего подтверждать получение нужной книги в автоматизированной системе. Существует и такая возможность. Главное, что здесь нужно запомнить, - это то, что Вы всегда должны обдумывать свои задачи очень тщательно.

Выводы

Принцип единcтвенной ответственности должен соблюдаться каждый раз, когда вы пишите код. Построение классов и модулей во многом определяется ПЕО, который позволяет сокращать зависимость между ними. Но, как и каждая медаль, ПЕО имеет две противоположные стороны. Очень удобно планировать архитектуру приложения, учитывая ПЕО, с самого начала разработки. Также удобно сразу выделить столько актеров, сколько нам понадобится. Однако, с точки зрения архитектуры, крайне опасно пытаться продумать все составляющие части приложения с самого начала. Излишнее соблюдение ПЕО может с легкостью привести к чрезмерной оптимизации, и вместо хорошей архитектуры, мы получим архитектуру, в которой будет очень сложно разобраться, какой класс или модуль за что отвечает.

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

Источник: code.tutsplus.com

Понравилась статья? Поделить с друзьями:
  • Восстание под руководством булавина произошло при
  • Беговая дорожка торнео линия инструкция по эксплуатации
  • Руководство персонала проекта
  • Ленгортранс официальный сайт руководство
  • Мукалтин в таблетках инструкция по применению детям