Что такое дженерики

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

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

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

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

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

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

C 1 июля 2013 вступил в силу приказ Минздрава, согласно которому, врач обязан назначать препарат пациенту по международному непатентованному наименованию (МНН), а не по торговому. Это значит, что врач выписывает вам рецепт на действующее вещество, а какой препарат покупать решать вам. Каждый раз в аптеке вам могут по рецепту продавать разные препараты с одним действующим веществом. И тут главная проблема в том, что концентрация действующего вещества в крови после приема разных лекарственных препаратов разная. Это непременно отразиться на результате лечения.

Запомните главное — нельзя сочетать две лекарственные формы с одним МНН, но произведенные разными фирмами,— это разные препараты. Любой дженерик отличается от оригинального препарата, и все дженерики различаются между собой.

Делая выбор в пользу аналога, вы должны понимать, что данное лекарственное средство может иметь не только эффективность, отличную от эффективности оригинального препарата, но и массу побочных эффектов, отсутствующих у бренда. Впрочем, за все надо платить. И все-таки не дженерики представляют главную аптечную опасность. Несмотря на множество попыток по ужесточению законодательства и экспертизы, не менее десяти процентов лекарственных препаратов в аптеках по-прежнему оказываются либо пустышками, либо грубыми подделками. Закупайтесь только в крупных аптеках, проверенных временем. Сеть аптек Монастырёв тщательно следит за качеством лекарственных препаратов и не допускает к продаже опасную продукцию.

Дженерики (генерики, женерики, генерические препараты, препараты-генерики) (англ. Generic) — это лекарственные препараты с доказанной фармацевтической, биологической и терапевтической эквива­лент­но­стью с оригиналом. То есть лекарственные средства, имеющее такой же состав действующих веществ, лекарственную форму и эффективность, как и оригинальные препараты, но не обладающее патентной защитой. Могут отличаться от оригинального препарата по составу вспомогательных веществ. Размещаются на рынке после окончания срока действия патентной защиты оригинальных препаратов.

Необходимое требование для продажи дженериков — доказанная фармацевтическая, биологическая и терапевтическая эквивалентность с оригиналом.

Источник: Википедия

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

Использование дженериков имеет большое медико-социальное значение, поскольку делает качественное лечение доступным для широких слоев населения. Например, в США в настоящее время более 60% всех выписываемых лекарственных средств составляют дженерики. Сходная статистика наблюдается и в странах Западной Европы: Германии, Австрии, Швейцарии и др.

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

Возникновение дженериковых препаратов связано с особенностями патентной защиты лекарств. Разработчики оригинальных действующих веществ тратят на их производство огромное количество времени и ресурсов и, конечно, хотят получить с этого дивиденды. С момента открытия лекарства до его попадания к конечному потребителю проходит от 10 до 15 лет, в то время как патентная защита по закону возможна только на протяжении 20 лет. По окончании действия патента воспроизводить лекарственную формулу может не только ее разработчик, но и любое другое фармпроизводство. Изменения не касаются действующего вещества, но могут быть изменены вспомогательные, а также технологии производства. Эффективность дженериковых лекарств должна быть доказана тестами на био- и терапевтическую эффективность в сравнении с оригинальным лекарственным средством. Тесты являются обязательными, и без проведения необходимых исследований препараты-дженерики не выпустят на рынок.

Вернуться на главную страницу Глоссария

Generics

Начиная с JDK 1.5, в Java появляются новые возможности для программирования. Одним из таких нововведений являются Generics.Generics являются аналогией с конструкцией «Шаблонов»(template) в С++, но имеет свои нюансы.Generics позволяют абстрагировать множество типов. Наиболее распространенными примерами являются Коллекции.

Вот типичное использование такого рода (без Generics):

 1. List myIntList = new LinkedList(); 2. myIntList.add(new Integer(0)); 3. Integer x = (Integer) myIntList.iterator().next(); 

Как правило, программист знает, какие данные должны быть в List’e.Тем не менее, стоит обратить особое внимание на Приведение типа («Cast») в строчке 3. Компилятор может лишь гарантировать, что метод next() вернёт Object,но чтобы обеспечить присвоение переменной типа Integer правильным и безопасным, требуется Cast. Cast не только создает беспорядки, но дает возможность появление ошибки «Runtime Error» из-за невнимательности программиста.

И появляется такой вопрос: «Как с этим бороться? «В частности: «Как же зарезервировать List для определенного типа данных?»

Как раз такую проблему решают Generics.

 1. List<Integer> myIntList = new LinkedList<Integer>(); 2. myIntList.add(new Integer(0)); 3. Integer x = myIntList.iterator().next(); 

Обратите внимание на объявления типа для переменной myIntList. Он указывает на то, что это не просто произвольный List, а List<Integer>.Мы говорим, что List является generic-интерфейсом, который принимает параметр типа — в этом случае, Integer.Кроме того, необходимо обратить внимание на то, что теперь Cast выполняется в строчке 3 автоматически.

Некоторые могут задуматься, что беспорядок в коде увеличился, но это не так.Вместо приведения к Integer в строчке 3, у нас теперь есть Integer в качестве параметра в строчке 1.Здесь существенное отличие. Теперь компилятор может проверить этот тип на корректность во время компиляции.

И когда мы говорим, что myIntList объявлен как List<Integer>, это будет справедливо во всем коде и компилятор это гарантирует.

  • На заметку:

Эффект от Generics особенно проявляется в крупных проектах: он улучшает читаемость и надежность кода в целом.

Свойства

  • Строгая типизация
  • Единая реализация
  • Отсутствие информации о типе

Пример реализации Generic-класса

 public interface List<E> { E get(int i); set(int i, E e); add(E e); Iterator<E> iterator(); … }

Для того чтобы использовать класс как Generics, мы должны прописать после имени класса <…>, куда можно подставить любое имя, wildcard и т.д.

После того как было объявлено имя generic-типа его можно использовать как обычный тип внутри метода. И когда в коде будет объявлен, к примеру, List<Integer>, то Е станет Integer для переменной list (как показано ниже).

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

List<E> ─ список элементов E

Раньше :

 List list = new List(); list.add(new Integer(1)); Integer i = (Integer) list.get(0);

Теперь :

 List<Integer> list = new List<Integer>(); list.add(new Integer(1)); Integer i = list.get(0);

Как видите, больше не нужно приводить Integer, так как метод get() возвращает ссылку на объект конкретного типа (в данном случае – Integer).

Несовместимость generic-типов

Это одна из самых важных вещей, которую вы должны узнать о Generics

Как говорится: «В бочке мёда есть ложка дегтя». Для того чтобы сохранить целостности и независимости друг от друга Коллекции, у Generics существует так называемая «Несовместимость generic-типов».

  • Суть такова:
Пусть у нас есть тип Foo, который является подтипом Bar, и еще G - наследник Коллекции. То G<Foo> не является наследником G<Bar>. 
  • Пример:
 List<Integer> li = new ArrayList<Integer>(); List<Object> lo = li;

Иначе — ошибки

 lo.add("hello”); // ClassCastException: String -> int Integer li = lo.get(0);

Проблемы реализации Generics

  • Решение 1 — Wildcard

Пусть мы захотели написать метод, который берет Collection<Object> и выводит на экран. И мы захотели вызвать dump для Integer.

  • Проблема
 void dump(Collection<Object> c) { for (Iterator<Object> i = c.iterator(); i.hasNext(); ) { Object o = i.next(); System.out.println(o); } }
 List<Object> l; dump(l); List<Integer> l; dump(l); // Ошибка

В этом примере List<Integer> не может использовать метод dump, так как он не является подтипом List<Object>.

Проблема в том что эта реализация кода не эффективна, так как Collection<Object> не является полностью родительской коллекцией всех остальных коллекции, грубо говоря Collection<Object> имеет ограничения.

Для решения этой проблемы используется Wildcard («?»). Он не имеет ограничения в использовании(то есть имеет соответствие с любым типом) и в этом его плюсы. И теперь, мы можем назвать это с любым типом коллекции.

  • Решение
 void dump(Collection<?> c) { for (Iterator<?> i = c.iterator(); i.hasNext(); ) { Object o = i.next(); System.out.println(o); } }

  • Решение 2 – Bounded Wildcard

Пусть мы захотели написать метод, который рисует List<Shape>. И у Shape есть наследник Circle. И мы хотим вызвать draw для Circle.

  • Проблема
 void draw(List<Shape> c) { for (Iterator<Shape> i = c.iterator(); i.hasNext(); ) { Shape s = i.next(); s.draw(); } }
 List<Shape> l; draw(l); List<Circle> l; draw(l); // Ошибка

Проблема в том, что у нас не получится из-за несовместимости типов.Предложенное решение используется, если метод который нужно реализовать использовал бы определенный тип и его подтипов. Так называемое «Ограничение сверху». Для этого нужно вместо <Shape> прописать <? extends Shape>.

  • Решение
 void draw(List<? extends Shape> c) { for (Iterator<? extends Shape> i = c.iterator(); i.hasNext(); ) { Shape s = i.next(); s.draw(); } }
  • Решение 3 – Generic-Метод

Пусть вы захотели сделать метод, который берет массив Object и переносить их в коллекцию.

  • Проблема
 void addAll(Object a, Collection<?> c) { for (int i = 0; i < a.length; i++) { c.add(a); } }
 addAll(new String, new ArrayList<String>()); addAll(new Object, new ArrayList<Object>()); addAll(new Object, new ArrayList<String>()); // Ошибка addAll(new String, new ArrayList<Object>()); // Ошибка

Напомним, что вы не можете просто засунуть Object в коллекции неизвестного типа. Способ решения этой проблемы является использование «Generic-Метод» Для этого перед методом нужно объявить <T> и использовать его.

  • Решение
 <T> void addAll(T a, Collection<T> c) { for (int i = 0; i < a.length; i++) { c.add(a); } }

Но все равно после выполнение останется ошибка в третьей строчке :

 addAll(new Object, new ArrayList<String>()); // Ошибка

  • Решение 4 – Bounded type argument

Реализуем метод копирование из одной коллекции в другую

  • Проблема
<M> void addAll(Collection<M> c, Collection<M> c2) { for (Iterator<M> i = c.iterator(); i.hasNext(); ) { M o = i.next(); c2.add(o); }}
addAll(new AL<Integer>(), new AL<Integer>());addAll(new AL<Integer>(), new AL<Object>()); //Ошибка

Проблема в том что две Коллекции могут быть разных типов (несовместимость generic-типов). Для таких случаев было придуман Bounded type argument. Он нужен если метод ,который мы пишем использовал бы определенный тип данных. Для этого нужно ввести <N extends M> (N принимает только значения M).Также можно корректно писать <T extends A & B & C>. (Принимает значения нескольких переменных)

  • Решение
<M, N extends M> void addAll(Collection<N> c, Collection<M> c2) { for (Iterator<N> i = c.iterator(); i.hasNext(); ) { N o = i.next(); c2.add(o); }}
  • Решение 5 – Lower bounded wcard

Реализуем метод нахождение максимума в коллекции.

  • Проблема
<T extends Comparable<T>> T max(Collection<T> c) { … }
List<Integer> il; Integer I = max(il);class Test implements Comparable<Object> {…} List<Test> tl; Test t = max(tl); // Ошибка
  • <T extends Comparable<T>> обозначает что Т обязан реализовывать интерфейс Comparable<T>.

Ошибка возникает из за того что Test реализует интерфейс Comparable<Object>. Решение этой проблемы — Lower bounded wcard(«Ограничение снизу»). Суть в том что мы будет реализовывать метод не только для Т, но и для его Супер-типов(Родительских типов). Например: Если мы напишем

List<T super Integer> list;

Мы можем заполнить его List<Integer>, List<Number> или List<Object>.

  • Решение
<T extends Comparable<? super T>> T max(Collection<T> c) { … }
  • Решение 6 – Wildcard Capture

Реализуем метод Swap в List<?>

  • Проблема
void swap(List<?> list, int i, int j) { list.set(i, list.get(j)); // Ошибка}

Проблема в том, что метод List.set() не может работать с List<?>, так как ему не известно какой он List. Для решение этой проблемы используют «Wildcard Capture» (или «Capture helpers»). Суть заключается в том, чтобы обмануть компилятор. Напишем еще один метод с параметризованной переменной и будем его использовать внутри нашего метода.

  • Решение
void swap(List<?> list, int i, int j) { swapImpl(list, i, j);}<T> void swapImpl(List<T> list, int i, int j) { T temp = list.get(i); list.set(i, list.get(j)); list.set(j, temp);}

Ограничения Generic

Также нужно запомнить простые правила для работы с Generics.

  • Невозможно создать массив параметра типа
Collection<T> c;T ta;new T; // Ошибка !!
  • Невозможно создать массив Generic-классов
new ArrayList<List<Integer>>();List<?> la = new List<?>; // Ошибка !!

Преобразование типов

В Generics также можно манипулировать с информацией, хранящийся в переменных.

  • Уничтожение информации о типе
List l = new ArrayList<String>();
  • Добавление информации о типе
List<String> l = (List<String>) new ArrayList();List<String> l1 = new ArrayList();

Примеры кода

  • Первый пример:
List<String> ls;List<Integer> li;ls.getClass() == li.getClass() // Truels instanceof List // Truels instanceof List<String> // Запрещено
  • Второй пример:

Нахождение максимума в Коллекции Integer.

  • Без Generics:
Collection c;Iterator i = c.iterator();Integer max = (Integer) i.next();while(i.hasNext()) { Integer next = (Integer) i.next(); if (next.compareTo(max) > 0) { max = next; }}
  • С помощью Generics