индивидуальный код тестируемого как узнать
Как узнать результат теста на коронавирус в СПБ
Тестирование на коронавирус проводится в частных лабораториях и медицинских учреждениях государственного подчинения. Коммерческие диагностические отделения рассылают результат по электронной почте или в виде СМС-сообщения в тот же или на следующий день после забора биоматериала. Тем, кто сдавал анализ в поликлиниках, не всегда известно, куда звонить, чтобы узнать результат теста на коронавирус.
Как узнать результат теста на коронавирус в СПБ через Госуслуги Горздрав Роспотребнадзор в поликлинике
Сегодня тест на коронавирус – самый точный метод, который позволит определить факт заражения. Для исследования пациенты сдают биологический материал – это может быть мазок из носоглотки, кровь из пальца или вены. Узнать результат анализа можно по телефону, есть несколько организаций, куда звонить, чтобы узнать результаты теста на ковид-19.
Как проверить результат теста на коронавирус на сайте Роспотребнадзор
В поисках, где узнать результаты теста на коронавирус, многие пациенты заходят на официальный сайт Роспотребнадзора в надежде, что здесь им удастся быстрее получить результат исследования.
На самом деле, такого сервиса на сегодняшний день нет. Получить результат исследования можно только в той медицинской организации, где был осуществлен сбор биологического материала. Обычно это поликлиника по месту регистрации пациента или частная лаборатория.
Куда звонить, чтобы узнать результаты теста на коронавирус
Как узнать результат теста на коронавирус в СПБ через Госуслуги
Для россиян возможность узнать результаты теста на коронавирус, сданного в поликлинике, была проработана Министерством цифрового развития и Роспотребнадзором.
Процедура выглядит так:
К системе “Госуслуги Стоп Коронавирус” в разных регионах РФ подключено более 550 лабораторий, остальные диагностические отделения по всей стране будут подключены к концу марта 2021 года. На 30 ноября 2020 г. На портал ежедневно поступало 15 тысяч результатов тестирования, но планируется обработка не менее 40 тысяч диагностических результатов каждый день.
Электронная медицинская карта
Электронная медицинская карта является заменой привычным бумажным карточкам, которые хранятся в поликлиниках. Электронный документ содержит все сведения о состоянии здоровья пациента, пройденной им диагностике и лечении. В Москве электронные медицинские карты уже работают в нормальном режиме, в регионах еще идет процесс переноса информации пациентах. Электронная карточка уже работает, получить информацию о результатах теста очень удобно.
Доступ к электронной карте предоставляется людям старше 15 лет через сайт Госуслуги“, а жители Москвы — также на портале правительства и мэра города.
В электронной медкарте предоставлена расшифровка показателей анализа, а также имеется предписание относительно того, как действовать дальше.
На сайте госуслуг
Во время посещения лаборатории каждому тестируемому присваивается индивидуальный код мазка (пятизначный). Он необходим для получения результата диагностики через 2-3 дня. Для этого:
Информация на портале обновляется ежесуточно. Получить узнать результат теста онлайн можно спустя 2-3 дня после тестирования. В случае, если необходимо получить на руки официальный документ о результате проведенного анализа, следует обратиться в поликлинику по месту регистрации.
Узнать результаты теста на коронавирус по телефону в СПБ
Узнать результат теста на коронавирус можно по телефону. Точную информацию может предоставить учреждение, осуществлявшее мазок или забор крови:
Не во всех поликлиниках результаты анализа на коронавирус поступают в регистратуру. Чтобы не терять время на соединение с регистратором и наверняка получить информацию, стоит звонить семейному врачу либо в лабораторное отделение.
Телефоны горячей линии в СПБ — +7 (812) 275-88-87, +7 (812) 298-27-85.
Для жителей всех населенных пунктов России доступен телефон всероссийской горячей линии 8-800-2000-112. Ее операторы отвечают на все вопросы относительно того, как узнать результаты анализов на коронавирус и что делать дальше.
Дорогой читатель, мы собрали всю самую важную и актуальную информацию о COVID-19 на 1 странице — главное о коронавирусе.
Также, доступна актуальная статистика по: России, Москве, Подмосковью и городам, СпБ и всем регионам РФ и странам мира.
Куда звонить в случае контакта с зараженным коронавирусом В Санкт-Петербурге
Контактируя с зараженным или больным коронавирусом, высока вероятность заражения. Контактное лицо представляет потенциальную опасность для окружающих. Контактным лицом является тот, кто на протяжении 14 дней контактировал с человеком, у которого анализ подтвердил COVID-19.
Контактным лицом может быть член семьи, коллега по работе, сокурсник и т.д. При контакте с подтвержденным зараженным необходимо обратиться за подробной информацией по одному из указанных ниже телефонных номеров:
Во время звонка необходимо сообщить такие данные:
Контактировавшие с человеком, у которого анализ подтвердил COVID, обязаны сообщить об этом своему семейному врачу и сдать тест.
Весь период самоизоляции контактировавший с зараженным должен внимательно наблюдать за своим самочувствием. В случае ухудшения состояния необходимо вызвать врача.
У жителей северной столицы есть возможность получить полную информацию относительно действий при контакте с зараженным коронавирусом или в случае получения позитивного результата теста. Для этого необходимо позвонить на круглосуточную информационную линию Комитета по здравоохранению города: 63-555-77.
Для петербуржцев работают и другие информационные линии:
Где и как узнать результат теста на ковид?
Эксперт сайта, врач общей практики, два высших медицинских образования, стаж работы 37 лет. Реальное лицо, готовое отвечать на поступающие вопросы. Подробнее.
В жизни каждого человека всегда есть несколько волнительных дней в ожидании чего-то: свадьбы, рождения ребенка, встречи со старыми друзьями после длительной разлуки и т.д. В этот перечень добавилось и результаты анализов на COVID-19. Для кого-то приятные, а для большинства населения России, тревожные. В таких случаях всегда хочется узнать правду быстрее.
А ожидание может затянуться на несколько дней по двум причинам. Во-первых, сам тест могут делать в течение 48 часов после забора биопробы (Постановление Главного Государственного санитарного врача РФ от 13.11.2020 г. №35) из-за загруженности лабораторий, во-вторых, положительные результаты высылают всем заинтересованным сторонам сразу, точнее, в течение суток, отрицательные – могут отправить через 2-3 дня. Ускорить процесс может сам пациент, если знает где и как посмотреть итоги исследования.
О том, как узнать результат теста на ковид, рассказывает эксперт сайта LechuGuru.com.
Результаты теста на коронавирус – как и где узнать, готов ли
Тестирование на коронавирус позволяет своевременно выявить и изолировать больных. Время ожидания результатов для многих сдавших тест становится тяжелым периодом. Во-первых, психологическая нагрузка, во-вторых, неоконченные или предстоящие дела. Поэтому хочется побыстрее узнать результат. Сделать это можно по телефону или через портал Госуслуг. В ряде городов такая информация размещается на сайтах мэра или отдела здравоохранения.
Если анализы сдавались в коммерческие центры, то результаты приходят быстро на электронную почту. Можно посмотреть и на сайте организации в Личном кабинете. Если нужен бумажный носитель, то его можно забрать сразу, после появления итогов теста в электронном виде или распечатать самостоятельно, если стоит QR-code (в этом случае печать учреждения не нужна для предъявления по требованию).
Многие жители России в своих поисках заходят на сайт Роспотребнадзора, где найти результаты анализов на коронавирус не получится. Ведомство только собирает информацию, а размещает на объединенной с Госуслугами странице в электронной медицинской карте (в крупных регионах она уже оформлена на каждого пациента, в остальных процесс оцифровывания завершается) или в разделе «Тестирование на Covid-19».
В последнее время процедура упростилась. Почти все лаборатории, проводящие ПЦР-исследование, подключены к сервису Госуслуг и обязаны передать результаты исследований непосредственно на сайт. Точнее внести в электронную медкарту. На это отводится 1 час.
Ликвидация промежуточного звена в виде Роспотребнадзора сократила время поступления итогов исследования на сайт на 1-2 дня.
Где взять номер теста
Каждой биопробе при взятии мазка присваивается индивидуальный пятизначный код. Взять его можно сразу после сдачи анализа непосредственно в лаборатории.
Как узнать итоги анализа на коронавирус через Госуслуги
Увидеть нужную информацию сразу на портале Госуслуг не у всех получится. Все упирается в электронную медицинскую карту. Если она заведена, но еще не просматривалась, нужна идентификация хозяина (по российскому законодательству посмотреть постороннему медицинскую карту нельзя – это персональные данные, не подлежащие оглашению), несмотря на то, что уже есть Личный кабинет.
Схема идентификации стандартная: нужно ввести запрашиваемые системой данные, получить на сотовый телефон код, вставить его в соответствующее поле и отправить сервису. Проверка может занять от 5-7 часов до 2-3 дней.
При отсутствии медкарты все просто:
Можно ли узнать результаты по телефону
Результаты на ковид можно узнать и по телефону. Точную информацию могут предоставить:
Кроме этого, в каждом регионе работают круглосуточные горячие линии, по телефонам которых также дается информация по итогам ПЦР-анализа.
Для чего нужно размещать свой тест на Госуслугах
С 1.08.20 года в России введены специальные правила возвращения в страну туристов из-за границы. Они обязаны сдать тест на коронавирус, а результат выложить на сайте Госуслуг. Сделано это в целях безопасности окружающих.
По результатам анализов Роспотребнадзор принимает решение: поместить прилетевшего на карантин (при положительном тесте) или разрешить ему вернуться к обычной жизни (анализ отрицательный). При этом берутся во внимание анализы всех членов семьи, летавших на отдых. При положительной пробе кого-то одного, все уходят на самоизоляцию.
Как это сделать, сроки загрузки результатов
Государством установлено, что в течение трех суток после возвращения из-за границы турист обязан сдать тест на ковид, а результаты разместить на портале Госуслуг. При уклонении от выполнения правил или просрочке термина в 72 часа наступает административная или уголовная ответственность. Пока выписывались штрафы от 15 000 до 40 000 руб., дело до реальных тюремных сроков не доходило.
Внимание: подробно про административную и уголовную ответственность за нарушение правил Роспотребнадзора здесь.
Сдать анализы можно сразу после прилета (практически во всех аэропортах есть лаборатории), в частном клиническом центре или в государственной лаборатории. Но везде на платной основе. Сколько платить, нужно смотреть в прейскуранте или на сайтах организаций. Ведь разбежка в цене может быть существенной, от 1500 руб. до 5000 руб.
После получения результатов анализа на бумажном носителе, независимо от результатов расшифровки (положительный или отрицательный тест), их нужно разместить на портале Госуслуг (www.gosuslugi.ru). Для этого требуется зайти в Личный кабинет на сайте (если его нет, то зарегистрироваться), внести личные данные в специальную анкету, приложить к ней полученный из лаборатории документ, отправить.
Для справки: в бланке с результатом анализа указывается:
После отправки анализов Роспотребнадзор проводит проверку и принимает решение: самоизоляция или обычная жизнь без ограничений.
Советы врачей, что можно делать в ожидании результатов
Во время ожидания анализов врачи советуют соблюдать правила самоизоляции, чтобы не подвергать опасности членов семьи и окружающих:
Полностью правила самоизоляции изложены здесь.
Прекратить самоизоляцию можно после того, как удалось проверить анализ на коронавирус через Госуслуги (при отрицательном результате). Особо подчеркнем, прекращать самоизоляцию можно только после официального объявления итогов тестирования. А это – портал Госуслуг. Результаты по телефону – для успокоения.
IC Literacy Test: измерение ИК-компетентности
Усп ех чел ов ека, живущего в информационном обществе, в значительной степени определяется теми компетенциями, которыми он владеет. Образование через всю жизнь – тренд, задающий новые требования к выпускнику школы: он должен не только получить и усвоить в школе определенный набор знаний – он должен научиться приобретать знан ия и навыки в течение всей жизни. Для этого он должен обладать информационно-коммуникационной (ИК) компетентностью.
ИК-компетентность – это не только и не столько степень владения конкретными компьютерными программами и устройствами. Этот термин следует понимать гораздо шире. Сегодня под ИК-компетентностью мы понимаем способность использовать цифровые технологии, инструменты коммуникации и/или сети для получения доступа, управления, интеграции, оценивания, создания и передачи информации с соблюдением этических и правовых норм для того, чтобы успешно жить и трудиться в условиях современного инфор мационного общества.
IC Literacy Test прошёл успешную апробацию на нескольких десятках тысяч российских и зарубежных школьников и получил признание на международном уровне.
Возможности использования IC Literacy Test
— Индивидуальные рекомендации для каждого и возможность построения индивидуальной траектории работы с учащимися
— Разработка и сопровождение внедрения инновационных методик, педагогических технологий и специальных кейсов (при поддержке учебно-методических центров)
— Измерение метапредметных результатов (формирование и развитие компетентности в области использования ИКТ) освоения основной образовательной программы основного общего образования
— Сопровождение региональных систем образования по формированию и улучшению метапредметных результатов в области ИКТ
— Рекомендации для региональных программ развития образования по улучшению метапредметных образовательных результатов учащихся в области ИКТ, в т.ч. оценка интеграции ИКТ и электронных образовательных ресурсов в школьный образовательный процесс
О том, что такое IC Literacy Test, в чём состоят его преимущества, как его применять и как использовать результаты можно посмотреть на сайте
Единое национальное тестирование (ЕНТ)
Одна из форм отборочных экзаменов для поступления в организации высшего и (или) послевузовского образования
Что такое ЕНТ?
В каком формате будет проходить ЕНТ 2021?
Начиная с марта 2021 года, ЕНТ будет проводиться в компьютерном формате
Что такое компьютерный формат ЕНТ?
В чем преимущества компьютерного формата ЕНТ?
Какие задания будут на ЕНТ?
Единое национальное тестирование проводится по трём обязательным и двум профильным предметам:
15 тестовых заданий: история Казахстана и математическая грамотность
20 тестовых заданий: грамотность чтения
35 тестовых заданий: 1ый профильный предмет, 2ой профильный предмет
По каждому профильному предмету предлагается 35 заданий:
с 1 по 20 вопросы предлагается выбрать один правильный ответ;
с 21 по 25 выбрать один правильный из пяти предложенных заданий на основе контекста;
с 26 по 35 предлагается выбрать один или несколько правильных ответов из множества предложенных ответов.
Всего: 120 тестовых заданий, 140 баллов
Когда проходит ЕНТ?
Сроки проведения с марта по июнь 2021 года
Мартовское ЕНТ для поступления на платное отделение, при желании можете сдать платно, стоимость 2242 тенге.
ЕНТ для поступления на грант пройдёт в период с 15 апреля по 30 июня, где у Вас будут 2 бесплатные попытки (без каких-либо ограничений между днями).
Как долго будет проходить тестирование?
Время сдачи ЕНТ 205-220 минут.
Общая продолжительность ЕНТ 225-240 минут (с учетом перерывов и пауз)
Продолжительность ЕНТ по предметам естественно-математического направления (математика, физика, химия, биология, география) с учётом апелляции 270 минут.
Продолжительность ЕНТ по предметам общественно-гуманитарного направления (казахский язык, русский язык, французский язык, английский язык, немецкий язык, человек общество право, Всемирная история, казахская и русская литература) с учетом апелляции 255 минут.
Когда я узнаю результат ЕНТ?
Сразу же после завершения тестирования вы увидите свой результат.
При несогласии с результатами тестирования можно подать на апелляцию.
Я не согласен с результатом, что делать?
В случае несогласия с результатами ЕНТ, вы вправе подать аппеляцию.
Из-за чего я могу подать апелляцию?
Апелляция проводится в двух случаях:
1) По содержанию тестовых заданий:
Если правильный ответ не совпадает с кодом правильных ответов, отсутствует правильный ответ, имеется более одного правильного ответа в тестовых заданиях с выбором одного правильного ответа из всех предложенных, некорректно составленное тестовое задание
Подача заявлений на апелляцию по содержанию в течении 30 минут
2) По технических причинам
Если отсутствует фрагмент условия задания, в результате которого невозможно определить правильный ответ.
Апелляция по техническим причинам подаётся во время тестирования при подаче заявления по техническим причинам программа фиксирует ошибку (делает скриншот)
При возникновении ситуаций связанных с зависанием или сбоем программы обязательно составляется соответствующий акт.
Сколько у меня попыток?
Всего у Вас 3 попытки.
Первый раз ЕНТ можно сдать в марте для поступления на платное отделение и она будет платной.
В период с апреля по июнь, у Вас будет 2 бесплатные попытки
Где я смогу получить сертификат о прохождении ЕНТ?
Сертификат о сдаче ЕНТ выдается в электронном виде.
Как писать тестируемый код
Если вы программист (или чего хуже архитектор), то можете ли вы ответить на такой простой вопрос: как писать НЕ тестируемый код? Призадумались? Если с трудом можете назвать хотя бы 3 способа добиться не тестируемого кода, то статья для вас.
Многие скажут: а зачем мне знать, как писать не тестируемый код, плохому хочешь меня научить? Отвечаю: если знать типичные паттерны не тестируемого кода, то, если они есть, можно легко увидеть их в своем проекте. А, как известно, признание проблемы — уже половина пути к лечению. Также в статье дается ответ, как собственно осуществляется такое лечение. Прошу под кат.
В статье не будет упора на конкретный язык программирования, ниже написанное актуально для всех процедурных языков. Но, как мне кажется, статья будет особенно полезна тем, кто программирует на динамических интерпретируемых языках, и не имел серьезного опыта разработки на типизированных компилируемых языках. Именно в коде данной категории разработчиков я чаще всего замечал описанные ниже паттерны. Примеры будут на псевдокоде, схожем с Java, C# и TypeScript.
Сразу оговорюсь, что в статье не будет рассмотрен вопрос о том, как нужно писать тесты. На эту тему и так существует немало статей. Будет рассмотрен вопрос, как нужно писать код, чтобы его можно было просто и красиво тестировать, а получившиеся тесты получались простыми и поддерживаемыми. Далее под понятием тест подразумевается красивый и чистый unit тест, который написан без различных хаков, без дополнительных «магических» библиотек для подмены зависимостей на лету, и прочего удовольствия, затрудняющего чтение и поддержку тестов. То есть тест в самом прекрасном значении этого слова.
Немного философии. Стоит ли вообще писать тесты? Мое мнение: если вы создаете проект, который будет развиваться, то вам просто необходимы тесты. Помимо того, что тесты выполняют свою прямую функцию (позволяют проверять соответствие кода требованиям), они как побочный эффект «выпрямляют» дизайн классов. Все потому, что на класс с «кривым» дизайном тесты не напишешь, следовательно, чтобы добиться тестируемость приходится рефакторить класс. Либо, если тесты пишутся до кода, дизайн класса сразу рождается правильным. Тестируемый код является переиспользуемым, так как мы можем повторно использовать его в тестах. А переиспользуемость — важный критерий правильного дизайна класса. Так же тесты, возможно, но совсем не обязательно, улучшат архитектуру приложения в целом. Как кто-то хорошо подметил: дизайн класса хорош ровно настолько, насколько данный класс можно протестировать с помощью unit тестов.
Список главных убийц тестируемого кода:
Добыча знаний
Пример из жизни: когда в магазине у вас просят заплатить за покупку, что вы делаете: даете кошелек, чтобы кассир сам взял оттуда деньги, или вы даете деньги? Думаю, аналогия понятна — класс кассир должен требовать на вход метода расчета класс деньги, а не класс кошелек.
Рассмотрим пару примеров.
DiscountCard не использует напрямую userContext. Тому, кто будет писать тест, нужно будет изучить устройство класса DiscountCard, чтобы понять какие объекты там реально требуются, ведь userContext может содержать десятки объектов для инициализации. А это время и риск, что то сделать не так, а в результате тест может оказаться неправильным. Сделаем так, чтобы DiscountCard требовал то, что ему действительно нужно:
Также этот пример намеренно иллюстрирует знаменитый паттерн ServiceLocator, который хранит в себе все зависимости приложения. Именно поэтому такой паттерн считается анти паттерном. Старайтесь избегать его.
Рассмотрим еще один пример добычи знаний:
В тесте необходимо создать класс User, хотя от него требуется только адрес. То же самое можно сказать про класс Invoice. Опять же, от того, кто пишет тест, требуется «прошерстить» код SalesTaxCalculator, чтобы разобраться, что же там реально нужно. Багоёмкое место.
Также, SalesTaxCalculator невозможно переиспользовать в другом проекте, в котором нет классов User и Invoice.
Теперь класс требует только то, что нужно, и тесты стали прозрачными.
Оператор new в бизнес коде
Пожалуй, этому паттерну можно дать золотую медаль за создание не тестируемого кода.
Давайте начнем разбор с простого примера:
В этом коде плохо все. Его невозможно протестировать, потому что вызов любого метода House приведет к вызову kitchen и/или bedroom, а их мы не контролируем. Если они общаются с БД или шлют запросы в сеть, то тесты обречены. При помощи полиморфизма невозможно подменить кухню или спальню, наш дом жестко завязан на определенные классы. Как сделать код тестируемым?
Теперь наш класс House требует в конструктор все, что ему необходимо для работы. И его не волнует, откуда это там появится. Любой бизнес класс должен требовать готовые экземпляры своих зависимостей себе в конструктор, это главный принцип.
Но некоторые читатели скажут: «Минуточку. Если теперь все зависимости надо требовать в конструктор, то для того чтобы создать „глубокий“ дочерний класс (класс, находящийся в глубине графа зависимостей приложения), мне придется прокидывать все зависимости такого класса через родительские классы. А это приведет к тому, что конструкторы „верхних“ классов (классы, находящиеся ближе к началу графа зависимостей) превратятся в скопище всего и вся. А относительно примера это значит, что тому классу, который делает new House теперь придется самому требовать в конструктор kitchen, и bedroom. Но почему он должен про них знать? Это ж бред.»
Только в этих рассуждениях есть одна ошибка. Следуя выше обозначенному принципу, класс, создающий House, вообще НЕ должен его создавать. Ведь, согласно принципу, он сам должен требовать House себе в зависимости. Но тогда откуда же, в конце концов, возьмется класс House? Он будет создан на старте приложения (если время жизни House совпадает с временем жизни приложения) либо его создаст фабрика (если время жизни House меньше времени жизни приложения):
Связующий код — код, который позволяет бизнес коду взаимодействовать, связывает его между собой. Связующий код не содержит в себе никакой бизнес логики. Сюда относятся фабрики, стартовая точка приложения и прочие связующие места. В связующем коде много оператора new.
Такой подход с разделением кода на 2 группы позволяет избежать смешивания логики приложения с созданием объектного графа приложения. Поэтому всегда при использовании оператора new задумывайтесь, в той ли группе кода вы его применяете.
Исключение:
оператор new можно использовать в бизнес коде для создания объектов-хранилищ, не содержащих поведения (например, HashMap, Array).
Рассмотрим еще один распространенный случай на следующем примере:
Класс DocumentActions в каждом своем методе создает класс Revision, лишая тесты возможности подменить реализацию этого класса на моки. А что еще хуже DocumentActions требует в конструктор классы, которые не использует. Но что делать, если для создания Revision каждый раз нужно отдавать третий аргумент textOffset, который заранее не известен? Выход: создать класс, который возьмет на себя знание, о том, как создавать Revision. А это не что иное, как фабрика:
Фабрика знает, что для создания Revision точно нужны Network и DocumentModel. Поэтому она сама требует эти классы для себя. А все динамические параметры (textOffset), для создания Revision, будут требоваться в качестве аргументов метода build фабрики.
Теперь, если в будущем класс Revision потребует еще один постоянный аргумент в конструктор, то не составит труда немного поправить RevisionFactory, а класс DocumentActions останется вообще без изменений.
Глобальные переменные и синглтоны
Думаю, все согласятся с тем, что глобальные переменные это зло. Но многие не видят ничего плохого в синглтонах, хотя по своей сути это все те же глобальные переменные. Так чем плохи синглтоны? Вот 2 причины (хотя достаточно любой из них):
1) Проблема в использовании синглтонов в том, что они вносят жесткую связность в код. Создавая синглтон, вы говорите, что ваши классы могут работать только с одной единственной реализацией, которую обеспечивает синглтон. Вы не закладываете возможности заменить его. Это делает трудным тестирование класса в отрыве от синглтона, ведь сама природа теста требует возможности заменять реализации на альтернативные. Пока вы не измените такой дизайн, вы вынуждаете себя полагаться на правильную работу синглтона, чтобы тестировать любой из его клиентов.
2) Наличие синглтонов заставляет ваши классы врать о своих зависимостях, так как вносит «невидимые» зависимости. Чтобы понять реальные зависимости класса, вам нужно полностью читать его код, вместо того, чтобы просто взглянуть на список зависимостей конструктора/метода. И рано или поздно это приведет к тому, что тесты начнут влиять друг на друга, через скрытое глобальное состояние.
Пример из практики, иллюстрирующий сразу обе проблемы: в web приложении возникла необходимость логгировать действия пользователя. Для этого создали синглтон, который использовался в ряде классов. Упомяну, что синглтон использовал jQuery для получения дополнительной информации из DOM. Все шло хорошо до тех пор, пока не понадобилось переиспользовать часть классов в node версии приложения. Эта версия периодически начала падать в ходе тестирования. Оказалось, что в эту версию попали классы, которые использовали логгер синглтон, а в node нет DOM. Эти классы использовали «невидимую» зависимость (причина 2), в результате чего такая ситуация оказалась возможной. Не была заложена возможность подменить логгер на другой (причина 1), из-за чего пришлось переделывать некоторые классы.
Некоторые скажут: «я осознанно использую синглтон, чтобы иметь только единственный экземпляр класса на все приложение». Но создавая синглтон, вы делаете экземпляр класса единственным на все пространство исполнения кода (jvm в java, rhino или V8 в javascript), а не на все приложение. Просто в большинстве случаев внутри пространства исполнения кода находится только одно приложение, и получается, что эти пространства совпадают. Но это не так для тестов. Каждый тест — часть приложения, запущенная в одном пространстве исполнения с другими тестами.
Получается, что множество ваших мини приложений начинают жить в одном пространстве исполнения, в котором есть единственные и незаменимые синглтоны. Тут то и появляются побочные эффекты синглтонов, когда тесты начинают влиять друг на друга.
К тому же, возможно, когда-нибудь вам потребуется иметь более одной копии приложения или его части в одном пространстве исполнения кода. Тогда пространство приложения не будет равно пространству исполнения кода. И не останется ничего другого как проделать работу по избавлению от синглтонов.
Рассмотрим такой пример: вам поручают протестировать класс PhoneAccount, отвечающий за операции с телефонным аккаунтом. Недолго думая, вы пишите:
Запускаете изолированно свой тест и в рантайме получаете ошибку доступа к null. Что пошло не так? Вы спрашиваете у коллеги, писавшего этот класс. Он, долго думая, вспоминает, что нужно инициализировать класс синглтон PhoneAccountTransactionProcessor. Вы думаете: «а как я должен был до этого догадаться?». Затем, добавляете:
Но опять при запуске получаете ошибку доступа к null. В недоумении вы снова спрашиваете коллегу: «что я делаю не так?». На что получаете ответ: «А ты инициализировал очередь транзакций — AccountTransactionQueue?». Немного раздраженный вы дописываете код, но что-то вам подсказывает, что этим дело не ограничится, и просите не уходить «опытного» коллегу.
И снова ошибка. Но не успеваете вы задать вопрос, как коллега выдает: «Ты же не подключил базу транзакций!». Дописываете, глубоко вздыхая:
Наконец, тест проходит.
Думаю, вы уже поняли, что не так с этим кодом — какая-то черная магия. Три класса врут о своих зависимостях, порядок инициализаций должен быть именно таким, хотя код не диктует вам именно такой порядок.
А что если не будет синглтонов, и каждый класс будет требовать все что ему нужно для работы в конструктор?
Теперь нет никакой магии, никаких скрытых каналов общения между классами. Любой новый член команды сможет самостоятельно написать такой тест, потому что он сразу увидит все зависимости. Сам код диктует порядок инициализации, нельзя сделать по-другому. И это огромный плюс, ведь в реальных приложениях могут быть десятки строк с инициализацией классов. И еще одно важное заключение: в таком коде появляется возможность передать null вместо класса (там, где это возможно) либо заменить класс моком. В коде с синглтонами такое было невозможно.
Теперь можно легко и просто подменять LoginService, а так же не нужны методы «только для тестов».
Исключения, в каких случаях синглтоны все-таки можно использовать:
Матерый конструктор
Последние 3 паттерна характерны не только для конструкторов, поэтому они были рассмотрены для общего случая выше.
Инициализация аргументов конструктора
Конструктор класса Metro выполняет не свою обязанность — инициализирует аргумент. Такой код плох по многим причинам, но нас интересует тестируемость. Если инициализация будет медленной, то все тесты на Metro будут выполняться долго.
Теперь в тесте мы можем не создавать не нужные для теста классы, заменяя их на пустышками. Логика создания и инициализации TicketPrices ушла в фабрику.
Условия и циклы
Тест завязан на некий флаг. Априори можно протестировать только 2 варианта двигателей.
Перенос части конструктора в другие методы класса
В этом примере при помощи метода init, забирающего на себя часть работы конструктора, пытаются облегчить жизнь в тестах. init будет использоваться в боевом коде, а в тестах будут подставляться нужные calls в обход тяжелого вызова init. Казалось бы, ничего плохого тут нет, и тесты можно нормально писать. Но это не выход. Нарушается принцип единой ответственности — за инициализацию класса отвечают несколько мест кода. Это вносит путаницу в код и затрудняет добавление нового функционала в такой класс. К тому же не тестируется метод init. Как правило, наличие таких методов как init, initialize, setup говорит о том, что класс берет на себя слишком много обязанностей. В данном примере класс Voicemail знает о способе получения звонков (server.getCallsFor). Но способ получения звонков не должен интересовать Voicemail:
Заключение
Многие принципы, которые были приведены в статье (не использовать оператор new в бизнес коде, требовать все зависимости явно в конструктор), известны давно, и все вместе они образуют принцип Dependency Injection.
Если для вашего языка существует IoC контейнер, то я вас поздравляю — вы избавлены от необходимости писать системный код (фабрики), о котором шла речь выше. За вас эту работу сделает IoC контейнер на основе заданной конфигурации. Именно для этого IoC контейнеры и были придуманы — избавить разработчиков от написания однообразных фабрик.
В языках, для которых нет IoC контейнеров (в основном динамические языки), тем не менее, ничего не мешает применять принцип Dependency Injection. Просто придется вручную писать системный код, что абсолютно не является катастрофой.
В заключение хочу отметить, что всё выше написанное не претендует на полноту охвата данной темы. Все изложенное основано на личном опыте (два крупных проекта), статьях по данной теме (особенно помог «прозреть» блог одного из разработчиков angular Miško Hevery), а также на спорах и общении с коллегами.