Написание лучших приложений на машинописном тексте

Предисловие

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



Что такое наследование?

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

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

В объектно-ориентированном программировании наследование - это механизм создания объекта или класса на основе другого объекта (наследование на основе прототипов) или класса (наследование на основе классов). , сохранив аналогичную реализацию.



Отношения базового класса и подкласса

Разбивая различные части наследования, думайте о базовых классах и подклассах, когда подклассы являются объектами, предваряющими действие расширения , а базовые классы - это расширяемые объекты. Считайте подклассы имеющими отношение IS-A к своему базовому классу.

Быстрый пример

Очень распространенный пример, иллюстрирующий наследование, - это животные. Возьмем, к примеру, собаку, кошку или птицу. Что они имеют общего? Ну, все они животные. Таким образом, для нашего приложения было бы полезно обобщить некоторые общие действия животных, такие как еда, ходьба и издавать звуки, в общий базовый класс с именем animal, который собака, кошка и птица все могут распространяться, потому что все они связаны отношениями Я-А-животных. Затем внутри классов собак, кошек и птиц мы можем продолжить и сделать их реализации более конкретными, например, определив их метод makeSound () вокруг фактических звуков, которые эти конкретных животных делают. При этом лают собаки, мяукают кошки и щебечут птицы.

Воплощая в жизнь мечты наших заинтересованных сторон!

Сбор требований к проекту

Как нам намекали в наш последний день в офисе, мы планируем выпустить довольно крупное обновление нашей текущей банковской системы, которое сделает нас более конкурентоспособными на банковской арене. Вот список требований, которые нам необходимо выполнить, прежде чем мы сможем опубликовать наше новое обновление.

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

Начало работы

Для начала давайте создадим наш класс текущих счетов с учетом лимита снятия, указанного выше.

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

Перейдем к нашему классу BankMember и создадим его с новым текущим счетом.

Идеально! Здесь мы движемся очень эффективно. Большое обновление уже не кажется таким уж большим, да? Вы не поверите, но мы уже выполнили первые два пункта нашего нового списка требований, поэтому давайте не будем останавливаться на достигнутом, давайте реализуем пункты третий и четвертый, быстро обновив файл нашего сберегательного счета.

Большой! Сегодня дела идут очень хорошо, и мы даже не встали на 15-минутную утреннюю вставку! Но я не могу не заметить, что наш код не очень DRY -совместим, и он немного теряет свою модульность.

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

В поисках общих черт

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

  • _memberId: число
  • _balance: число
  • депозит (сумма: число): недействителен
  • вывод (сумма: число): недействительно

Поскольку эти четыре метода и свойства одинаковы для обоих классов, поэтому ранее я говорил, что мы не очень совместимы с DRY. Но как это исправить, спросите вы; Исправим это с помощью наследования! Мы возьмем четыре общих свойства и метода account и поместим их в базовый класс, который наш конкретный чековые и сберегательные счета можно затем расширить, предоставив свои собственные более конкретные реализации.

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

Создание базового класса учетной записи

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

Здесь нужно отметить несколько моментов. Для начала, видите ли вы, что все четыре основных элемента информации теперь находятся в этом новом базовом классе Account? Также мы изменили наши _memberId и _balance с частных на защищенные, чтобы наши расширяющиеся классы могли использовать свои значения. Теперь, наконец, вы увидите здесь слово abstract пару раз, один перед ключевым словом class в верхней части файла и один прямо перед takew () определение метода. Мы не собираемся здесь подробно останавливаться на ключевом слове abstract, но пока просто знайте, что, поскольку класс объявлен как абстрактный, мы не можем new создайте версию базового класса Account. И мы не можем определить реализацию абстрактного метода takew (), мы предоставим подклассам возможность предоставить свою собственную реализацию.

Расширение базового класса учетной записи

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

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

Давайте продолжим и протестируем наше приложение, прежде чем мы отправим его в QA.

Тест приложения Выполнить

Все работает как положено! Идеально 👍!

Выход

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

Чего-то не хватает..

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

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



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

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



Ссылка на файлы на Github