учебник

SOLID каковы 5 принципов объектно-ориентированного программирования

SOLID - это аббревиатура, обозначающая пять принципов объектно-ориентированного проектирования (OOD или OOP). Это рекомендации, которые разработчики могут использовать для создания программного обеспечения, которым легко управлять, поддерживать и расширять. Понимание этих концепций сделает вас лучшим разработчиком и поможет избежать проблем с управлением программным обеспечением. Что значит быть хорошим программистом?

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

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

  • Простота чтения кода;
  • Насколько вероятно, что их код будет работать и развиваться со временем.

К счастью, есть некоторые основы или принципы, которые позволяют легко научиться программировать лучше.

аббревиатура SOLID означает:
S: принцип единоличной ответственности
O: принцип открыт-закрыт
L: Принцип подстановки Лисков
I: Принцип разделения интерфейса
D: Принцип инверсии зависимостей

Начнем с первого принципа SOLID, а именно

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

У класса (или модуля) должна быть только одна причина для изменения - для развития.

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

Но почему? 

Почему так важно иметь только одну причину для изменений?

Например, если есть две разные причины для изменения, вполне возможно, что две разные команды могут работать над одним и тем же кодом по двум разным причинам. Каждый должен будет реализовать собственное решение, которое в случае компилируемого языка (такого как C ++, C # или Java) может привести к модулям, несовместимым с другими командами или другими частями приложения.

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

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

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

Некоторые примеры модулей и их использования:

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

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

Кажется более разумным определять роли, а не людей или пользователей.

Тогда:

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

Посмотрим несколько примеров

Предположим, у нас есть класс Book, который инкапсулирует концепцию книги и ее функциональные возможности.

учебник {

    function getTitle () {

        вернуть «Великую книгу»;

    }

    function getAuthor () {

        вернуть «Алессандро Барикко»;

    }

    function nextpage () {

        // Следующая страница

    }

    function printCurrentPage () {

        echo «содержимое текущей страницы»;

    }

}

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

Однако есть небольшая проблема. 

Если подумать об акторах, участвующих в управлении объектом "Книга", кем они могут быть? 

Здесь мы можем легко представить себе двух разных действующих лиц: Управление книгами (придет il библиотекарь) И Механизм предоставления данных (например, как мы хотим доставлять контент пользователю: экранный, графический пользовательский интерфейс, текстовый пользовательский интерфейс, возможно, печать). 

Таким образом, у нас есть два очень разных участника, которые взаимодействуют с классом.

Вкратце, этот класс смешивает:

  • бизнес-логика с 
  • презентация 

это может быть проблемой, поскольку нарушает принцип единой ответственности (SRP). 

Как мы можем изменить, как мы можем улучшить этот код, чтобы соблюсти принцип единоличной ответственности?

Взгляните на следующий код:

учебник {

    function getTitle () {

        вернуть «Oceano Mare»;

    }

    function getAuthor () {

        вернуть «Алессандро Барикко»;

    }

    function turn page () {

        // Следующая страница

    }

    function getCurrentPage () {

        echo «содержимое текущей страницы»;

    }

}

интерфейс Принтер {

    функция printPage ($ page);

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

}

class StampaLibro реализует Printer {

    function printPages ($ page) {

        echo $ page;

    }

}

 

class HtmlPrinter реализует Printer {

    function printPages ($ page) {

        эхо ' '. $ page. ' ';

    }

}

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

Посмотрим на другой пример:

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

учебник {

    function getTitle () {

        вернуть «Oceano Mare»;

    }

    function getAuthor () {

        вернуть «Алессандро Барикко»;

    }

    function turn page () {

        // Следующая страница

    }

    function getCurrentPage () {

        вернуть «содержимое текущей страницы»;

    }

    function save () {

        $ filename = '/ документы /'. $ this-> getTitolo (). '-'. $ this-> getAuthor ();

        file_put_contents ($ filename, сериализовать ($ this));

    }

}

Как и раньше, здесь мы также можем идентифицировать различных участников, таких как Управление книгами (придет il библиотекарь) И упорство. Каждый раз, когда мы хотим изменить способ перехода от страницы к странице, нам нужно изменить этот класс. У нас может быть несколько причин для перемен.

учебник {

    function getTitle () {

        вернуть «Oceano Mare»;

    }

    function getAuthor () {

        вернуть «Алессандро Барикко»;

    }

    function turn page () {

        // Следующая страница

    }

    function getCurrentPage () {

        вернуть «содержимое текущей страницы»;

    }

}

класс SimpleFilePersistence {

    функция save (книга $ книга) {

        $ filename = '/ документы /'. $ book-> getTitle (). '-'. $ book-> getAuthor ();

        file_put_contents ($ filename, сериализовать ($ book));

    }

}

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

Продолжайте читать второй принцип Открыто / Закрыто ->

Ercole Palmeri

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

АРТИКОЛИ recenti

Издатели и OpenAI подписывают соглашения, регулирующие поток информации, обрабатываемой искусственным интеллектом.

В прошлый понедельник Financial Times объявила о сделке с OpenAI. FT лицензирует свою журналистику мирового уровня…

Апрель 30 2024

Онлайн-платежи: вот как потоковые сервисы заставляют вас платить вечно

Миллионы людей платят за стриминговые сервисы, выплачивая ежемесячную абонентскую плату. Распространено мнение, что вы…

Апрель 29 2024

Veeam предлагает наиболее полную поддержку программ-вымогателей: от защиты до реагирования и восстановления.

Coveware от Veeam продолжит предоставлять услуги по реагированию на инциденты, связанные с кибер-вымогательством. Coveware предложит возможности криминалистики и исправления…

Апрель 23 2024

Зеленая и цифровая революция: как прогнозируемое обслуживание меняет нефтегазовую отрасль

Прогнозируемое техническое обслуживание производит революцию в нефтегазовом секторе благодаря инновационному и упреждающему подходу к управлению предприятием…

Апрель 22 2024

Читайте «Инновации» на вашем языке

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

Следуйте за нами