Коронавирусная болезнь и парадигма ООП на Java

Цель этой статьи

Я подумывал написать свою первую статью о парадигме ООП в Java, но меня беспокоила тема, по которой я буду создавать примеры. Так как 11 марта 2020 года Всемирная организация здравоохранения (ВОЗ) назвала вспышку коронавируса пандемией, я подумал, что было бы интересно использовать эту возможность, чтобы понять как парадигму ООП, так и болезнь коронавируса. Важно знать и то, и другое, поскольку первое - это шаг вперед в вашей карьере разработчика, а второе может помочь спасти жизни или, по крайней мере, сдержать распространение вируса. Итак, основная цель этой статьи - объяснить ООП на примерах о коронавирусе.

P.S. Не обращайте внимания на неиспользованные предупреждения в примерах

Что такое ООП?

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

Итак, коронавирусную болезнь можно описать следующими характеристиками (это основные характеристики, выбранные для упрощения примеров):

  • название: COVID-19, что означает болезнь COronaVIrus - 2019
  • симптомы: кашель, жар, усталость, насморк и т. д.
  • Уровень смертности: генеральный директор The Who доктор Тедрос Адханом Гебрейесус назвал 3,4%, но это основано на официально зарегистрированных случаях. Если мы посчитаем все легкие случаи, которые не попадают в больницы, то показатель будет 1% или ниже.
  • Краткое описание: Новая коронавирусная болезнь или COVID-19 - это новый тип коронавируса, который ранее не был идентифицирован.

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

  • Распространение: болезнь может передаваться от человека к человеку небольшими капельками из носа или рта, которые распространяются, когда человек с COVID-19 кашляет или выдыхает.
  • аффект: существует 4 уровня заражения. Когда болезнь начинается, слизистая оболочка респираторного дерева повреждается, вызывая воспаление. Это, в свою очередь, раздражает нервы, выстилающие дыхательные пути. Простая пылинка может вызвать кашель (первый уровень). Но если ситуация ухудшается, он проходит только через слизистую оболочку дыхательных путей и попадает в газообменные блоки, которые находятся в конце дыхательных путей. Если они заражаются, они реагируют, выливая воспалительный материал в воздушные мешочки, расположенные на дне наших легких. (второй уровень). Когда воздушные мешки воспаляются, это вызывает «излияние воспалительного материала [жидкости и воспалительных клеток] в легкие, и мы получаем пневмонию (третий уровень). Легкие, наполненные воспалительным материалом, не могут получать достаточное количество кислорода в кровоток, что снижает способность организма поглощать кислород и избавляться от углекислого газа (четвертый уровень). Это основная причина смерти.

На этом простое описание COVID-19 завершено. Легко, правда? Мы можем описать наш объект программно так же просто, как и устно.

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

Возможно, вы задаетесь вопросом, что означают эти частные или общедоступные ключевые слова? Что ж, вы можете узнать в следующем разделе :)

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

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

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

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

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

Теперь давайте применим эти ограничения доступа программно. Вот что мы получим:

Теперь о ключевых словах private и public. Они называются модификаторами доступа. В Java их 4.

  • Частный: это наиболее ограничительный и часто используемый модификатор доступа. К любому атрибуту или методу, имеющему модификатор private, можно получить доступ только в пределах того же класса. Никакие дочерние классы, подклассы или другие классы не могут получить к ним доступ (это относится к любому классу как в том же, так и в другом пакете). Лучше всего использовать этот модификатор со всеми атрибутами и внутренними методами, которые не следует вызывать извне.
  • Без модификатора или частного пакета: всякий раз, когда вы не предоставляете какой-либо модификатор для своего атрибута или метода, он может быть доступен в том же классе и во всех других классах в том же пакете. Вот почему его иногда называют частным пакетом. Вначале это может немного сбивать с толку, но на практике вы встретите множество случаев, когда вам нужно будет реализовать набор логики внутри вашего пакета, а также иметь API, который будет доступен извне вашего пакета. Вот тогда и пригодится модификатор package-private.
  • Защищено: к атрибутам и методам с защищенным модификатором доступа можно получить доступ внутри вашего класса, для всех классов в одном пакете и для всех подклассов в том же или других пакетах. Бывают случаи, когда вам нужно сделать исключение для атрибутов и некоторых методов суперкласса таким образом, чтобы подклассы могли обращаться к ним напрямую. Здесь вы используете модификатор protected.
  • Общедоступный: это наименее ограничительный модификатор доступа. Доступ к методам и атрибутам, использующим модификатор public, можно получить как внутри вашего текущего класса, так и для всех других классов. Этот модификатор почти никогда не подходит для ваших атрибутов, и вы должны хорошо подумать, прежде чем использовать его с методами.

Наследование

Наследование - это механизм, который позволяет одному классу приобретать свойства другого класса, что означает, что класс chid (тот, который наследует) может повторно использовать атрибуты или методы суперкласса (того, который наследуется). Выделяют 4 основных типа наследования:

  • Одиночный: это самый простой вид. Здесь один класс наследует атрибуты и методы второго класса. (А - ›Б)
  • Несколько: это тот случай, когда один класс может наследовать атрибуты и методы одного или нескольких классов (A - ›C && B -› C)
  • Многоуровневый: это тот случай, когда один класс может наследовать атрибуты и методы второго класса, который уже был унаследован от другого класса (A - ›B -› C)
  • Иерархический: это тот случай, когда один или несколько классов наследуют атрибуты и методы одного и того же класса (A - ›B && A -› C && A - ›D).
  • Гибрид: это сочетание одного и нескольких типов (A - ›B && A -› C && B- ›D && C -› D)

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

Например:

класс A расширяет B

класс A реализует InterfaceB

Теперь давайте попробуем разобраться в наследовании с помощью COVID-19. Мы знаем, что COVID-19 вызывается вирусом, который принадлежит к большому семейству коронавирусов. Эти вирусы вызывают у людей заболевания верхних дыхательных путей легкой и средней степени тяжести, например, простуду. Их сотни, большинство из которых циркулирует у животных. Иногда они могут перейти к людям (это называется вторичным явлением) и вызвать болезнь. До сих пор известно 7 коронавирусов, вызывающих заболевания человека: 4 из них легкие (вирусы 229E, OC43, NL63 и HKU1), остальные 3 могут иметь более серьезный исход (SARS (тяжелый острый респираторный синдром: 2002–2004 гг.), MERS (Ближневосточный респираторный синдром: 2012 г. - настоящее время) и COVID-19 (Коронавирусная болезнь 2019: декабрь 2019 г. - настоящее время)).

Можете ли вы определить связь между этими заболеваниями? Верно! Все они являются коронавирусным заболеванием, поэтому находятся в иерархической связи с ним. Программно у нас будет один базовый или суперкласс, а все остальные 7 классов (или болезней) будут расширять этот класс, наследуя его атрибуты и методы. Следующие изображения показывают наш базовый класс и производные.

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

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

В Java есть одно важное ключевое слово, которое поможет вам реализовать наследование: super. Это похоже на ключевое слово this, но вместо текущего объекта оно позволяет вам получить доступ к полям и методам суперкласса или базового класса. Например, мы можем изменить один из наших классов легких заболеваний, чтобы использовать ключевое слово super для вызова методов spread () и impact () базового класса.

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

Полиморфизм

Полиморфизм - это механизм, который позволяет нам выполнять одно и то же действие по-разному. Другими словами, в объектно-ориентированном программировании это способность метода действовать по-разному в зависимости от объекта, на который он воздействует. Есть 2 типа полиморфизма:

  • Статический: это тип полиморфизма, который возникает в том же классе с помощью перегрузки методов. Чтобы перегрузить метод, вам нужно иметь 2 метода с одинаковым именем, но с разной подписью (помните: возвращаемое значение не является частью подписи метода), что в основном означает с разными наборами аргументов. Этот тип иногда называют полиморфизмом времени компиляции, поскольку используемый метод определяется в процессе компиляции.
  • Динамический: это тип полиморфизма, который возникает, когда дочерний класс переопределяет метод, объявленный в суперклассе или базовом классе. Чтобы переопределить метод, вы должны объявить метод в дочернем классе, который будет иметь то же имя и подпись, что и в суперклассе. В Java вы можете использовать аннотацию @Override, чтобы явно объявить, что аннотированный метод переопределяет базовый метод. Но это не обязательно. Компилятор все равно это обнаружит. Этот тип также называется полиморфизмом времени выполнения, поскольку используемый метод определяется во время выполнения.

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

Абстракция

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

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

Это особенности болезней. Теперь о способностях:

  • Все 7 болезней могут распространяться по-разному.
  • Все 7 болезней могут по-разному влиять на человеческий организм.

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

В Java абстракция достигается с помощью абстрактных классов и абстрактных методов. Чтобы объявить абстрактный класс, мы используем ключевое слово abstract. Этот тип классов отличается от обычных классов возможностью иметь абстрактные методы. Метод называется абстрактным, если у него нет тела и в объявлении есть ключевое слово abstract. Этот тип методов не может быть final, поскольку дочерние классы должны реализовывать его тело. Давайте добавим абстрактную версию нашего класса CoronavirusDisease.

Легко, правда?

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

Спасибо за ваше время.

Надеюсь, вам понравилась эта статья, и она послужила повышению осведомленности о COVID-19 и помогла вам понять принципы ООП.

Вы можете найти пример проекта в следующем репозитории GitHub: https://github.com/sedamov/COVID-19-and-OOP

#StayHome #SaveLives

Другие полезные ресурсы для изучения программирования на Java
Дорожная карта Java-разработчика на 2020 год
10 вещей, которые программист на Java должен изучить в 2020 году
10 инструментов, которые должен знать каждый Java-разработчик. Знайте
10 причин изучать языки программирования Java
10 фреймворков, которые Java и веб-разработчики должны изучить в 2020 году
10 советов, чтобы стать лучшим разработчиком Java в 2020 году
5 лучших платформ Java для изучения в 2020 году
10 библиотек тестирования, которые должен знать каждый разработчик Java