что такое solid в химии

solid

Смотреть что такое «solid» в других словарях:

solid — [säl′id] adj. [ME solide < MFr < L solidus < sollus, whole: see SOLEMN] 1. tending to keep its form rather than to flow or spread out like a liquid or gas; relatively firm or compact 2. filled with matter throughout; not hollow 3. a)… … English World dictionary

Solid — bezeichnet: Linksjugend solid, einen parteinahen Jugendverband der Partei Die Linke solid – die sozialistische Jugend, einen ehemaligen Jugendverband, der der PDS nahe stand Solid (Fürth), das Solarenergie Informations und Demonstrationszentrum… … Deutsch Wikipedia

Solid — Solid: Solid фреймворк интеграции оборудования в KDE 4. SOLID аббревиатура пяти основных принципов дизайна классов в объектно ориентированном проектировании. Solid студийный альбом группы U.D.O. (1997) … Википедия

solid — (adj.) late 14c., from O.Fr. solide firm, dense, compact, from L. solidus firm, whole, entire (related to salvus safe ), from PIE root *sol whole (Cf. Gk. holos whole, L. salus health; see SAFE (Cf. safe) (adj.)). Slang … Etymology dictionary

solid — [adj1] hard, dimensional brick wall*, close, compact, compacted, concentrated, concrete, consolidated, dense, firm, fixed, heavy, hefty, hulk, hunk, husky, massed, material, physical, rock, rocklike, rooted, secure, set, sound, stable, strong,… … New thesaurus

Solid — Sol id, n. 1. A substance that is held in a fixed form by cohesion among its particles; a substance not fluid. [1913 Webster] 2. (Geom.) A magnitude which has length, breadth, and thickness; a part of space bounded on all sides. [1913 Webster]… … The Collaborative International Dictionary of English

solid — UK US /ˈsɒlɪd/ adjective ► of a good standard: »The bank has reported solid earnings for the year … Financial and business terms

solid — solid[e]:1.⇨gediegen(1)–2.⇨haltbar(1)–3.⇨rechtschaffen–4.⇨anständig(1) solid 1.→fest 2.→gediegen 3.→rechtschaffen … Das Wörterbuch der Synonyme

solid — ► ADJECTIVE (solider, solidest) 1) firm and stable in shape; not liquid or fluid. 2) strongly built or made. 3) not hollow or having spaces or gaps. 4) consisting of the same substance throughout. 5) (of time) continuous. 6) … English terms dictionary

Solid — (v. lat.), 1) fest, im Gegensatz vom Flüssigen; 2) gediegen, gründlich, echt, zuverlässig, wahr, gültig; 3) rechtschaffen in der Denkungsart; 4) streng sittlich lebend; 5) in Handelsverhältnissen reell, bes. zu Lösung von Schuldverbindlichkeiten… … Pierer’s Universal-Lexikon

Источник

Простое объяснение принципов SOLID

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

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

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

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

Я буду объяснять SOLID самым простым способом, так что новичкам легче будет разобраться. Будем рассматривать принципы один за другим.

Принцип единственной ответственности (Single Responsibility Principle)

Существует лишь одна причина, приводящая к изменению класса.

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

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

Также данный класс не должен отвечать за формат следующего метода, потому что нам могут понадобиться данные другого формата, например, XML, JSON, HTML и т.д.

Код после рефакторинга будет выглядеть так:

Принцип открытости/закрытости (Open-closed Principle)

Программные сущности должны быть открыты для расширения, но закрыты для модификации.

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

Как же можно решить поставленную задачу? Смотрите:

Принцип подстановки Барбары Лисков (Liskov Substitution Principle)

Пусть φ(x) — доказуемое свойство объекта x типа T. Тогда φ(y) должно быть верным для объектов y типа S, где S — подтип T.

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

Попросту говоря: подкласс/производный класс должен быть взаимозаменяем с базовым/родительским классом.

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

В этом коде нарушен обсуждаемый принцип и показан способ исправления:

Принцип разделения интерфейса (Interface Segregation Principle)

Нельзя заставлять клиента реализовать интерфейс, которым он не пользуется.

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

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

Принцип инверсии зависимостей (Dependency Inversion Principle)

Высокоуровневые модули не должны зависеть от низкоуровневых. Оба вида модулей должны зависеть от абстракций.

Абстракции не должны зависеть от подробностей. Подробности должны зависеть от абстракций.

Проще говоря: зависьте от абстракций, а не от чего-то конкретного.

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

Есть распространённое заблуждение, что «инверсия зависимостей» является синонимом «внедрения зависимостей». Но это разные вещи.

Класс PasswordReminder должен зависеть от абстракций, а не от чего-то конкретного. Но как это сделать? Рассмотрим пример:

Источник

Принципы SOLID, о которых должен знать каждый разработчик

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Объектно-ориентированное программирование принесло в разработку ПО новые подходы к проектированию приложений. В частности, ООП позволило программистам комбинировать сущности, объединённые некоей общей целью или функционалом, в отдельных классах, рассчитанных на решение самостоятельных задач и независимых от других частей приложения. Однако само по себе применение ООП не означает, что разработчик застрахован от возможности создания непонятного, запутанного кода, который тяжело поддерживать. Роберт Мартин, для того, чтобы помочь всем желающим разрабатывать качественные ООП-приложения, разработал пять принципов объектно-ориентированного программирования и проектирования, говоря о которых, с подачи Майкла Фэзерса, используют акроним SOLID.

Что такое SOLID?

Вот как расшифровывается акроним SOLID:

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

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

«Одно поручение. Всего одно.» — Локи говорит Скурджу в фильме «Тор: Рагнарёк».
Каждый класс должен решать лишь одну задачу.

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

Обратите внимание на то, что этот принцип применим не только к классам, но и к компонентам программного обеспечения в более широком смысле.

Например, рассмотрим этот код:

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Как такая структура класса может привести к проблемам?

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

Для того чтобы привести вышеприведённый код в соответствие с принципом единственной ответственности, создадим ещё один класс, единственной задачей которого является работа с хранилищем, в частности — сохранение в нём объектов класса Animal :

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

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

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

Принцип открытости-закрытости

Программные сущности (классы, модули, функции) должны быть открыты для расширения, но не для модификации.

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

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

Добавим в массив новый элемент:

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

После этого нам придётся поменять код функции AnimalSound :

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Как привести функцию AnimalSound в соответствие с принципом открытости-закрытости? Например — так:

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Если теперь добавить в массив объект, описывающий новое животное, функцию AnimalSound менять не придётся. Мы привели её в соответствие с принципом открытости-закрытости.

Рассмотрим ещё один пример.

Представим, что у нас есть магазин. Мы даём клиентам скидку в 20%, используя такой класс:

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Теперь решено разделить клиентов на две группы. Любимым ( fav ) клиентам даётся скидка в 20%, а VIP-клиентам ( vip ) — удвоенная скидка, то есть — 40%. Для того, чтобы реализовать эту логику, было решено модифицировать класс следующим образом:

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

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

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Если решено дать скидку в 80% «супер-VIP» клиентам, выглядеть это должно так:

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Как видите, тут используется расширение возможностей классов, а не их модификация.

Принцип подстановки Барбары Лисков

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

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

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Функция нарушает принцип подстановки (и принцип открытости-закрытости). Этот код должен знать о типах всех обрабатываемых им объектов и, в зависимости от типа, обращаться к соответствующей функции для подсчёта конечностей конкретного животного. Как результат, при создании нового типа животного функцию придётся переписывать:

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

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

Вооружившись этими соображениями мы можем переделать функцию AnimalLegCount :

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Теперь в классе Animal должен появиться метод LegCount :

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

А его подклассам нужно реализовать этот метод:

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

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

Принцип разделения интерфейса

Создавайте узкоспециализированные интерфейсы, предназначенные для конкретного клиента. Клиенты не должны зависеть от интерфейсов, которые они не используют.

Этот принцип направлен на устранение недостатков, связанных с реализацией больших интерфейсов.

Рассмотрим интерфейс Shape :

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Он описывает методы для рисования кругов ( drawCircle ), квадратов ( drawSquare ) и прямоугольников ( drawRectangle ). В результате классы, реализующие этот интерфейс и представляющие отдельные геометрические фигуры, такие, как круг (Circle), квадрат (Square) и прямоугольник (Rectangle), должны содержать реализацию всех этих методов. Выглядит это так:

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

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

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

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

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

Принцип инверсии зависимостей

Объектом зависимости должна быть абстракция, а не что-то конкретное.

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

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Здесь класс Http представляет собой высокоуровневый компонент, а XMLHttpService — низкоуровневый. Такая архитектура нарушает пункт A принципа инверсии зависимостей: «Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций».

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

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Интерфейс Connection содержит описание метода request и мы передаём классу Http аргумент типа Connection :

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Перепишем класс XMLHttpService таким образом, чтобы он реализовывал этот интерфейс:

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

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

что такое solid в химии. Смотреть фото что такое solid в химии. Смотреть картинку что такое solid в химии. Картинка про что такое solid в химии. Фото что такое solid в химии

Итоги

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

Еще больше полезной информации для программистов вы найдете на нашем сайте.

Источник

pavel-loginov-dev / solid_in_python.md

S.O.L.I.D принципы с примерами на Python

Под клиентами подразумеваются программные сущности, использующие другие программные сущности.

Этот файл является переводом статьи с сайта medium.com пользователя DeeKey, ссылка в завершении файла.

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

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

Для понимания SOLID принципов, вы должны хорошо понимать как, используются интерфейсы.

Я попытаюсь объяснить принципы SOLID на примере Python в как можно более простой форме, чтобы даже новички смогли разобраться. Чтобы было очень легко взять представленные примеры и применить их на Python.

Рассмотрим каждый принцип один за другим:

1. Single Responsibility Principle
(Принцип единственной обязанности)

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

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

Мы же просто разделим класс. Мы создадим ещё один класс, который возьмет на себя одну ответственность — управление базой данных пользователя.

Распространённым решением этой проблемы является применение шаблона проектирования Фасад. Ознакомиться с паттерном Фасад вы можете здесь. User класс был бы фасадом для управления базой данных пользователя и управления свойствами пользователя.

2. Open-Closed Principle
(Принцип открытости/закрытости)

Программные сущности (классы, модули, функции) должно быть открыты для расширения, но не модификации.

Давайте представим, что у вас есть магазин, и вы даете скидку в 20% для ваших любимых покупателей используя класс Discount. Если бы вы решаете удвоить 20-ти процентную скидку для VIP клиентов, вы могли бы изменить класс следующим образом:

Но нет, это нарушает OCP. OCP запрещает это. Например, если мы хотим дать новую скидку для другого типа покупателей, то это требует добавления новой логики. Чтобы следовать OCP, мы добавим новый класс, который будет расширять Discount. И в этом новом классе реализуем требуемую логику:

Если вы решите дать скидку супер VIP пользователям, то это будет выглядеть так:

Расширяйте, но не модифицируйте.

3. Liskov Substitution Principle
(Принцип подстановки Лисков)

Главная идея, стоящая за Liskov Substitution Principle в том, что для любого класса клиент должен иметь возможность использовать любой подкласс базового класса, не замечая разницы между ними, и следовательно, без каких-либо изменений поведения программы при выполнении. Это означает, что клиент полностью изолирован и не подозревает об изменениях в иерархии классов.

Более формально: Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.

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

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

Тщательное обдумывание новых классов в соответствии с LSP помогает нам расширять иерархию классов правильно. Также, LSP способствует OCP.

4. Interface Segregation Principle
(Принцип разделения интерфейсов)

Создавайте тонкие интерфейсы, которые ориентированы на клиента. Клиенты не должны зависеть от интерфейсов, которые они не используют. Этот принцип устраняет недостатки реализации больших интерфейсов.

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

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

5. Dependecy Inversion Principle
(Принцип инверсии зависимостей)

Зависимость должна быть от абстракций, а не от конкретики. Модули верхних уровней не должны зависеть от модулей нижних уровней. Классы и верхних, и нижних уровней должны зависеть от одних и тех же абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *