Объектно-ориентированное программирование (ооп)

Аналоги

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


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

Алгель

Если сравнивать Алгель с шведским средством от пота Dry Dry, то у него можно найти несколько отличий:

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

Odaban

Одабан является эффективным и действенным средством, которое помогает при повышенной потливости. По своему действию он не уступает шведскому антиперспиранту Драй Драй. У него тот же принцип действия.

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

Выпускается Одабан в разных формах:

  • в виде лосьона для рук;
  • в форме распылителя для области подмышек;
  • в виде присыпке для ног.

Maxim

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

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

Etiaxil

Это эффективное датское средство, которое способно вылечить от гипергидроза. При использовании оно способно снижать потоотделение на длительное время — от 3 до 5 дней. Также как и антиперспирант Драй Драй в составе имеется активный компонент — хлорид алюминия.

К преимуществам дезодоранта Etiaxil относятся:

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

Odorex Deo

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

К преимуществам средства можно отнести следующие качества:

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

Eucerin

Антиперспирант Eucerin является эффективным средством от повышенной потливости, которое производится в Германии. Они обеспечивает защиты от чрезмерного отделения влаги и неприятного запаха сроком на 3 дня.

Важные особенности средства Eucerin:

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

Принцип единственной ответственности (SRP)

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

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

Курс по теме From 0 to 1: Design Patterns — 24 That Matter.

5.3 Инкапсуляция

Цель инкапсуляции — улучшить качество взаимодействия вещей за счет их упрощения.

А лучший способ упростить что-то — скрыть все сложное от посторонних глаз. Например, если вас посадят в кабину Боинга, вы не сразу разберетесь, как им управлять:


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

С точки зрения программирования, инкапсуляция — это «сокрытие реализации». Мне нравится такое определение. Наш класс может содержать сотни методов и реализовывать очень сложное поведение в различных ситуациях. Но мы можем скрыть от посторонних глаз все его методы (пометить модификатором private), а для взаимодействия с другими классами оставить всего пару-тройку методов (пометить их модификатором public). Тогда все остальные классы нашей программы будут видеть в этом классе всего три метода и вызывать именно их. А все сложности будут скрыты внутри класса, как кабина пилотов от счастливых пассажиров.

5.2 Абстракция

В рунете народ до сих пор спорит над определением абстракции в ООП. И проблема даже не в том, что все неправы, а в том, что все правы. Чем программа меньше, тем сильнее абстракция привязана к языку Java, чем больше, тем сильнее привязана к моделированию/упрощению объектов реального мира.

Но вроде бы лучшие умы сошлись на том, что:

Абстракция — это использование только тех характеристик объекта, которые с достаточной точностью представляют его в программе. Основная идея состоит в том, чтобы представить объект минимальным набором полей и методов и при этом с достаточной точностью для решаемой задачи.

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

Абстракция в реальной жизни

Хороший пример абстракции в реальной жизни — описание должностей в компании или организации. Название должности — это одно, а обязанности каждой конкретной должности — это уже совсем другое.

Представьте, что вы проектируете структуру своей будущей компании. Вы можете разделить обязанности секретаря: «расбросать» их по нескольким другим должностям. Можете разбить должность исполнительного директора на несколько независимых должностей: финансовый директор, технический директор, директор по маркетингу, директор по персоналу. Или, например, объединить должности офис-менеджера и рекрутера в одну.

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

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

Итеративный метод

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

  1. План;
  2. Реализация;
  3. Тестирование;
  4. Анализ.

Итеративная модель используется при построении «гибких» (Agile) методов в разработке ПО.

Преимущества итеративного подхода:

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

Недостатки итеративного подхода:

  • при отсутствии четких требований к проекту, возможны проблемы при разработке архитектуры проекта;
  • требуется постоянное вовлечение в процесс заказчика; 
  • отсутствие устойчивых сроков и бюджета.
  • Итерационная модель достаточно универсальна и может использоваться в большинстве проектов, командами разной квалификации, но, при этом, желательно создать «внутренние правила» для работы с данной моделью.

Гибридные решения

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

На ряде задач, например в случае с structured frequent pattern mining гибридные решения имеют существенное преимущество в масштабируемости (см. Paramonov, Sergey; Stepanova, Daria; Miettinen, Pauli: Hybrid ASP-based Approach to Pattern Mining, Theory and Practice of Logic Programming, 2018):

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

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


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

Тестирование и корректность программ

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

И в целом, если вы думали, что научный код обычно необычайного качества, покрыт тестами и легко поддерживается, то вот кусочек кода из LCM-k:

Одной из важных особенностей программ с формальной семантикой является доказуемость их корректности, точнее говоря, вы смещаете фокус вопроса корректности на «ASP solver», т.е. систему которая может работать с языком Answer Set Programming. Вы можете показать, что программа и правила математически корректно моделируют вашу задачу — и вопросы по верному выполнению переходят в сообщество разработчиков. У систем, как правило, открытый код — так же они хорошо покрыты тестами и ими пользуются немалая группа юзеров. В среднем, мы достаточно уверены, что с ASP системами все хорошо в плане правильного выполнения кода.

Обычно, когда на свет выходит новый алгоритм (и статья вместе с ним), мы как бы просто верим в часть помеченную «?» на схеме:

В случае с ASP — algorithm и implementation являются одним и тем же (ну если вы не обернете ASP в процедурные вызовы в алгоритме), а значит можно показать формальную корректность самого кода.

Например, это можно использовать в качестве:

  • прототипа решения
  • baseline алгоритма
  • тестирования более быстрой версии на корректность

Заключение

Сегодня мы многое поняли (с) — и прикоснулись к вершине айсберга логического программирования. Тезисно (tl;dr) статья умещается в несколько пунктов:

  • современное логическое программирование != Пролог;
  • ASP хорош для решения комбинаторных задач;
  • вероятностное логическое программирование подходит для моделей вида: правила + вероятность;
  • лучше всего использовать ASP и ЛП для создания прототипов и тестирования идей: «а нам вообще что-то даст это дополнительное ограничение?», «против чего тестировать будем?», etc;
  • если у вас нет хороших идей, как написать быстрый поиск к трудной задаче с ограничениями, скорее всего вам пригодится ASP и это будет быстрее и надежнее лобового решения.

Основные понятия объектно-ориентированного программирования

Любая функция в программе представляет собой метод для объекта некоторого класса. Класс должен формироваться в программе естественным образом, как только в ней возникает необходимость описания новых объектов программирования. Каждый новый шаг в разработке алгоритма должен представлять собой разработку нового класса на основе уже существующих. Вся программа в таком виде представляет собой объект некоторого класса с единственным методом run (выполнить). Программирование «от класса к классу» включает в себя ряд новых понятий. Основными понятиями ООП являются

  • инкапсуляция;
  • наследование;
  • полиморфизм.

Инкапсуляция данных (от «капсула») – это механизм, который объединяет данные и код, манипулирующий с этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. В ООП код и данные могут быть объединены вместе (в так называемый «черный ящик») при создании объекта. Внутри объекта коды и данные могут быть закрытыми или открытыми. Закрытые коды или данные доступны только для других частей того же самого объекта и, соответственно, недоступны для тех частей программы, которые существуют вне объекта. Открытые коды и данные, напротив, доступны для всех частей программы, в том числе и для других частей того же самого объекта.Наследование. Новый, или производный класс может быть определен на основе уже имеющегося, или базового класса. При этом новый класс сохраняет все свойства старого: данные объекта базового класса включаются в данные объекта производного, а методы базового класса могут быть вызваны для объекта производного класса, причем они будут выполняться над данными включенного в него объекта базового класса. Иначе говоря, новый класс наследует как данные старого класса, так и методы их обработки. Если объект наследует свои свойства от одного родителя, то говорят об одиночном наследовании. Если объект наследует данные и методы от нескольких базовых классов, то говорят о множественном наследовании. Пример наследования – определение структуры, отдельный член которой является ранее определенной структурой.Полиморфизм – это свойство, которое позволяет один и тот же идентификатор (одно и то же имя) использовать для решения двух и более схожих, но технически разных задач. Целью полиморфизма, применительно к ООП, является использование одного имени для задания действий, общих для ряда классов объектов. Такой полиморфизм основывается на возможности включения в данные объекта также и информации о методах их обработки (в виде указателей на функции). Будучи доступным в некоторой точке программы, объект , даже при отсутствии полной информации о его типе, всегда может корректно вызвать свойственные ему методы.Полиморфная функция – это семейство функций с одним и тем же именем, но выполняющие различные действия в зависимости от условий вызова. Например, нахождение абсолютной величины в языке Си требует трех разных функций с разными именами:

123

int abs(int);long int labs(long int);double fabs(double);

Язык C++

Что не так с процедурным программированием

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

Тут при­хо­дит продакт-менеджер и гово­рит: «Хочу, что­бы поль­зо­ва­тель точ­но знал, в чём ошиб­ка при вво­де элек­трон­но­го адре­са». Теперь вам нуж­но научить функ­цию выда­вать не про­сто true — false, а ещё и код ошиб­ки: напри­мер, если в адре­се опе­чат­ка, то код 01, если адрес спа­мер­ский — код 02 и так далее. Это неслож­но реа­ли­зо­вать.

Вы зале­за­е­те внутрь этой функ­ции и меня­е­те её пове­де­ние: теперь она вме­сто true — false выда­ёт код ошиб­ки, а если ошиб­ки нет — пишет «ОК».

И тут ваш код лома­ет­ся: все десять мест, кото­рые ожи­да­ли от про­ве­ряль­щи­ка true или false, теперь полу­ча­ют «ОК» и из-за это­го лома­ют­ся.

Теперь вам нуж­но:

  • либо пере­пи­сы­вать все функ­ции, что­бы научить их пони­мать новые отве­ты про­ве­ряль­щи­ка адре­сов;
  • либо пере­де­лать сам про­ве­ряль­щик адре­сов, что­бы он остал­ся сов­ме­сти­мым со ста­ры­ми места­ми, но в нуж­ном вам месте как-то ещё выда­вал коды оши­бок;
  • либо напи­сать новый про­ве­ряль­щик, кото­рый выда­ёт коды оши­бок, а в ста­рых местах исполь­зо­вать ста­рый про­ве­ряль­щик.

Зада­ча, конеч­но, реша­е­мая за час-другой.

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

Это назы­ва­ет­ся спагетти-код, и для борь­бы с ним как раз при­ду­ма­ли объектно-ориентированное про­грам­ми­ро­ва­ние.

Iterative Model


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

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

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

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

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

Применение итеративной модели оправдано в следующих случаях:

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

Наследование и полиморфизм подтипов

Часто наследование отождествляют с полиморфизмом подтипов (англ. subtyping):

  • Концептуально, полиморфизм подтипов устанавливает отношение: «является» (англ. is-a relationship), — тем самым имитируя семантическое отношение наследования;
  • В свою очередь наследование в большей степени относится к повторному использованию кода, то есть определяет синтаксическое отношение.

Несмотря на приведённое выше замечание, наследование является широко используемым механизмом установки отношения «является» (англ. is-a relationship). Некоторые языки программирования согласуют наследование и полиморфизм подтипов (в основном, это относится к языкам со статической типизацией: C++, C#, Java и Scala) — в то время как другие разделяют вышеописанные концепции.

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

3 Что учить дальше?

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

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

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

3.1 Список использованных источников

  1. Рейтинг популярности языков программирования TIOBE. URL: https://tiobe.com/tiobe-index/
  2. SOLID принципы. Рефакторинг. URL: https://pro-prof.com/archives/1914
  3. Почему мне кажется, что студентов учат ООП неправильно. URL: https://habr.com/ru/post/345658/
  4. C++ Russia 2018: Фёдор Короткий, Память – идеальная абстракция. URL: https://vk.com/wall-105242702_701
  5. Мейер Б. Объектно-ориентированное конструирование программных систем. М.: Издательско-торговый дом «Русская Редакция», «Интернет-университет информационных технологий», 2005. 1232 с.: ил.
  6. Мартин Р. Чистый код. Создание, анализ и рефакторинг. Библиотека программиста. – СПб.: Питер, 2014. – 464 с.
  7. Джейсон Мак-Колм Смит Элементарные шаблоны проектирования : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2013. — 304 с.
  8. Диаграммы классов UML. URL: https://pro-prof.com/archives/3212
  9. Юнит-тестирование. Пример. Boost Unit Test. URL: https://pro-prof.com/archives/1549
  10. Э. Гамма Приемы объектно-ориентированного проектирования. Паттерны проектирования / Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. – СПб.: Питер, 2009. – 366 с.

Сайты с задачами для программистов

практику применения английского

  1. Один из самых популярных англоязычных ресурсов с задачами для программистов. На нем можно найти более 200 задач разного уровня сложности, решать которые можно прямо на сайте онлайн с помощью одного из 10 доступных языков программирования (включая и Java).

  2. Programming Praxis — это популярный блог, в котором на регулярной основе публикуются различные интересные и, главное, актуальные задачи для программистов. Обычно для целого ряда языков программирования. Задачи призваны помочь кодерам освоиться с последними изменениями в технологиях и подходах к программированию на практике.

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

  4. CodeKata — блог с большим количеством довольно оригинальных и остроумных задач для программистов, придуманных Дэйвом Томасом (Dave Thomas), одним из авторов известной книги Pragmatic Programmer (“Программист-прагматик. Путь от подмастерья к мастеру”). Задачи на сайте CodeKata отличаются разнообразием, а решения — актуальностью по отношению к реальной программистской работе.

  5. Peking University JudgeOnline for ACIP/ICPC — это страничка Пекинского университета, на которой собраны задачи для программистов с разных соревнований и конкурсов. Сайт регулярно обновляется, решать задачи можно в реальном времени, а оценивает решения комиссия из экспертов Пекинского университета.

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

  7. The Daily WTF — это еще одно популярное сообщество программистов, которое устроено по принципу Bring Your Own Code (BYOC), то есть разработчики делятся на нем собственным исходным кодом для решения различных оригинальных задач. “Цель BYOC проста: предоставить вам, как разработчику программного обеспечения, возможность повысить свои навыки программирования в решении проблемы, немного более интересной, чем обычные, скучные вещи,” — говорится на сайте.

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

  9. Известный авторский сайт, где “безумные программисты соревнуются за славу и крутые призы.” Соревнования проводятся раз или два в год, а имена отличившихся программистов публикуются на главной странице ресурса, что наверняка привлекает к ним интерес со стороны перспективных работодателей.

  10. Один из крупнейших русскоязычных архивов задач по программированию с автоматической проверяющей системой. Основной источник задач для архива — соревнования Уральского федерального университета, Чемпионаты Урала и прочие региональные программистские мероприятия. Также Timus Online Judge позволяет принять участие в онлайн-версиях большинства соревнований, которые регулярно проходят в Уральском федеральном университете.


С этим читают