SOLID — принципы объектно-ориентированного программирования
SOLID — это аббревиатура пяти основных принципов проектирования в объектно-ориентированном программировании — Single responsibility, Open-closed, Liskov substitution, Interface segregation и Dependency inversion. В переводе на русский: принципы единственной ответственности, открытости / закрытости, подстановки Барбары Лисков, разделения интерфейса и инверсии зависимостей)
Аббревиатура SOLID была предложена Робертом Мартином, автором нескольких книг, широко известных в сообществе разработчиков. Эти принципы позволяют строить на базе ООП масштабируемые и сопровождаемые программные продукты с понятной бизнес-логикой.
Расшифровка:
- Single responsibility — принцип единственной ответственности
- Open-closed — принцип открытости / закрытости
- Liskov substitution — принцип подстановки Барбары Лисков
- Interface segregation — принцип разделения интерфейса
- Dependency inversion — принцип инверсии зависимостей
Принцип единственной обязанности / ответственности (single responsibility principle / SRP) обозначает, что каждый объект должен иметь одну обязанность и эта обязанность должна быть полностью инкапсулирована в класс. Все его сервисы должны быть направлены исключительно на обеспечение этой обязанности. Подробнее про SRP…
Принцип открытости / закрытости (open-closed principle / OCP) декларирует, что программные сущности (классы, модули, функции и т. п.) должны быть открыты для расширения, но закрыты для изменения. Это означает, что эти сущности могут менять свое поведение без изменения их исходного кода. Подробнее про OCP…
Принцип подстановки Барбары Лисков (Liskov substitution principle / LSP) в формулировке Роберта Мартина: «функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа не зная об этом». Подробнее про LSP…
Принцип разделения интерфейса (interface segregation principle / ISP) в формулировке Роберта Мартина: «клиенты не должны зависеть от методов, которые они не используют». Принцип разделения интерфейсов говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более маленькие и специфические, чтобы клиенты маленьких интерфейсов знали только о методах, которые необходимы им в работе. В итоге, при изменении метода интерфейса не должны меняться клиенты, которые этот метод не используют. Подробнее про ISP…
Принцип инверсии зависимостей (dependency inversion principle / DIP) — модули верхних уровней не должны зависеть от модулей нижних уровней, а оба типа модулей должны зависеть от абстракций; сами абстракции не должны зависеть от деталей, а вот детали должны зависеть от абстракций. Подробнее про DIP…
Принципы SOLID, о которых должен знать каждый разработчик | by Nikita | WebbDEV
Еще больше полезной информации для программистов вы найдете на нашем сайте.
Объектно-ориентированное программирование принесло в разработку ПО новые подходы к проектированию приложений. В частности, ООП позволило программистам комбинировать сущности, объединённые некоей общей целью или функционалом, в отдельных классах, рассчитанных на решение самостоятельных задач и независимых от других частей приложения. Однако само по себе применение ООП не означает, что разработчик застрахован от возможности создания непонятного, запутанного кода, который тяжело поддерживать. Роберт Мартин, для того, чтобы помочь всем желающим разрабатывать качественные ООП-приложения, разработал пять принципов объектно-ориентированного программирования и проектирования, говоря о которых, с подачи Майкла Фэзерса, используют акроним SOLID.
Вот как расшифровывается акроним SOLID:
- S: Single Responsibility Principle (Принцип единственной ответственности).
- O: Open-Closed Principle (Принцип открытости-закрытости).
- L: Liskov Substitution Principle (Принцип подстановки Барбары Лисков).
- I: Interface Segregation Principle (Принцип разделения интерфейса).
- D: Dependency Inversion Principle (Принцип инверсии зависимостей).
Сейчас мы рассмотрим эти принципы на схематичных примерах. Обратите внимание на то, что главная цель примеров заключается в том, чтобы помочь читателю понять принципы SOLID, узнать, как их применять и как следовать им, проектируя приложения. Автор материала не стремился к тому, чтобы выйти на работающий код, который можно было бы использовать в реальных проектах.
«Одно поручение. Всего одно.» — Локи говорит Скурджу в фильме «Тор: Рагнарёк».
Каждый класс должен решать лишь одну задачу.
Класс должен быть ответственен лишь за что-то одно. Если класс отвечает за решение нескольких задач, его подсистемы, реализующие решение этих задач, оказываются связанными друг с другом. Изменения в одной такой подсистеме ведут к изменениям в другой.
Обратите внимание на то, что этот принцип применим не только к классам, но и к компонентам программного обеспечения в более широком смысле.
Например, рассмотрим этот код:
Класс Animal
, представленный здесь, описывает какое-то животное. Этот класс нарушает принцип единственной ответственности. Как именно нарушается этот принцип?
В соответствии с принципом единственной ответственности класс должен решать лишь какую-то одну задачу. Он же решает две, занимаясь работой с хранилищем данных в методе saveAnimal
и манипулируя свойствами объекта в конструкторе и в методе getAnimalName
.
Как такая структура класса может привести к проблемам?
Если изменится порядок работы с хранилищем данных, используемым приложением, то придётся вносить изменения во все классы, работающие с хранилищем. Такая архитектура не отличается гибкостью, изменения одних подсистем затрагивают другие, что напоминает эффект домино.
Для того чтобы привести вышеприведённый код в соответствие с принципом единственной ответственности, создадим ещё один класс, единственной задачей которого является работа с хранилищем, в частности — сохранение в нём объектов класса Animal
:
Вот что по этому поводу говорит Стив Фентон: «Проектируя классы, мы должны стремиться к тому, чтобы объединять родственные компоненты, то есть такие, изменения в которых происходят по одним и тем же причинам. Нам следует стараться разделять компоненты, изменения в которых вызывают различные причины».
Правильное применение принципа единственной ответственности приводит к высокой степени связности элементов внутри модуля, то есть к тому, что задачи, решаемые внутри него, хорошо соответствуют его главной цели.
Программные сущности (классы, модули, функции) должны быть открыты для расширения, но не для модификации.
Продолжим работу над классом Animal
.
Мы хотим перебрать список животных, каждое из которых представлено объектом класса Animal
, и узнать о том, какие звуки они издают. Представим, что мы решаем эту задачу с помощью функции AnimalSounds
:
Самая главная проблема такой архитектуры заключается в том, что функция определяет то, какой звук издаёт то или иное животное, анализируя конкретные объекты. Функция AnimalSound
не соответствует принципу открытости-закрытости, так как, например, при появлении новых видов животных, нам, для того, чтобы с её помощью можно было бы узнавать звуки, издаваемые ими, придётся её изменить.
Добавим в массив новый элемент:
После этого нам придётся поменять код функции AnimalSound
:
Как видите, при добавлении в массив нового животного придётся дополнять код функции. Пример это очень простой, но если подобная архитектура используется в реальном проекте, функцию придётся постоянно расширять, добавляя в неё новые выражения if
.
Как привести функцию AnimalSound
в соответствие с принципом открытости-закрытости? Например — так:
Можно заметить, что у класса Animal
теперь есть виртуальный метод makeSound
. При таком подходе нужно, чтобы классы, предназначенные для описания конкретных животных, расширяли бы класс Animal
и реализовывали бы этот метод.
В результате у каждого класса, описывающего животного, будет собственный метод makeSound
, а при переборе массива с животными в функции AnimalSound
достаточно будет вызвать этот метод для каждого элемента массива.
Если теперь добавить в массив объект, описывающий новое животное, функцию AnimalSound
менять не придётся. Мы привели её в соответствие с принципом открытости-закрытости.
Рассмотрим ещё один пример.
Представим, что у нас есть магазин. Мы даём клиентам скидку в 20%, используя такой класс:
Теперь решено разделить клиентов на две группы. Любимым (fav
) клиентам даётся скидка в 20%, а VIP-клиентам (vip
) — удвоенная скидка, то есть — 40%. Для того, чтобы реализовать эту логику, было решено модифицировать класс следующим образом:
Такой подход нарушает принцип открытости-закрытости. Как видно, здесь, если нам надо дать некоей группе клиентов особую скидку, приходится добавлять в класс новый код.
Для того чтобы переработать этот код в соответствии с принципом открытости-закрытости, добавим в проект новый класс, расширяющий класс Discount
. В этом новом классе мы и реализуем новый механизм:
Если решено дать скидку в 80% «супер-VIP» клиентам, выглядеть это должно так:
Как видите, тут используется расширение возможностей классов, а не их модификация.
Необходимо, чтобы подклассы могли бы служить заменой для своих суперклассов.
Цель этого принципа заключаются в том, чтобы классы-наследники могли бы использоваться вместо родительских классов, от которых они образованы, не нарушая работу программы. Если оказывается, что в коде проверяется тип класса, значит принцип подстановки нарушается.
Рассмотрим применение этого принципа, вернувшись к примеру с классом Animal
. Напишем функцию, предназначенную для возврата информации о количествах конечностей животного.
Функция нарушает принцип подстановки (и принцип открытости-закрытости). Этот код должен знать о типах всех обрабатываемых им объектов и, в зависимости от типа, обращаться к соответствующей функции для подсчёта конечностей конкретного животного. Как результат, при создании нового типа животного функцию придётся переписывать:
Для того чтобы эта функция не нарушала принцип подстановки, преобразуем её с использованием требований, сформулированных Стивом Фентоном. Они заключаются в том, что методы, принимающие или возвращающие значения с типом некоего суперкласса (Animal
в нашем случае) должны также принимать и возвращать значения, типами которых являются его подклассы (Pigeon
).
Вооружившись этими соображениями мы можем переделать функцию AnimalLegCount
:
Теперь эта функция не интересуется типами передаваемых ей объектов. Она просто вызывает их методы LegCount
. Всё, что она знает о типах — это то, что обрабатываемые ей объекты должны принадлежать классу Animal
или его подклассам.
Теперь в классе Animal
должен появиться метод LegCount
:
А его подклассам нужно реализовать этот метод:
В результате, например, при обращении к методу LegCount
для экземпляра класса Lion
производится вызов метода, реализованного в этом классе, и возвращается именно то, что можно ожидать от вызова подобного метода.
Теперь функции AnimalLegCount
не нужно знать о том, объект какого именно подкласса класса Animal
она обрабатывает для того, чтобы узнать сведения о количестве конечностей у животного, представленного этим объектом. Функция просто вызывает метод LegCount
класса Animal
, так как подклассы этого класса должны реализовывать этот метод для того, чтобы их можно было бы использовать вместо него, не нарушая правильность работы программы.
Создавайте узкоспециализированные интерфейсы, предназначенные для конкретного клиента. Клиенты не должны зависеть от интерфейсов, которые они не используют.
Этот принцип направлен на устранение недостатков, связанных с реализацией больших интерфейсов.
Рассмотрим интерфейс Shape
:
Он описывает методы для рисования кругов (drawCircle
), квадратов (drawSquare
) и прямоугольников (drawRectangle
). В результате классы, реализующие этот интерфейс и представляющие отдельные геометрические фигуры, такие, как круг (Circle), квадрат (Square) и прямоугольник (Rectangle), должны содержать реализацию всех этих методов. Выглядит это так:
Странный у нас получился код. Например, класс Rectangle
, представляющий прямоугольник, реализует методы (drawCircle
и drawSquare
), которые ему совершенно не нужны. То же самое можно заметить и при анализе кода двух других классов.
Предположим, мы решим добавить в интерфейс Shape
ещё один метод, drawTriangle
, предназначенный для рисования треугольников:
Это приведёт к тому, что классам, представляющим конкретные геометрические фигуры, придётся реализовывать ещё и метод drawTriangle
. В противном случае возникнет ошибка.
Как видно, при таком подходе невозможно создать класс, который реализует метод для вывода круга, но не реализует методы для вывода квадрата, прямоугольника и треугольника. Такие методы можно реализовать так, чтобы при их выводе выбрасывалась бы ошибка, указывающая на то, что подобную операцию выполнить невозможно.
Принцип разделения интерфейса предостерегает нас от создания интерфейсов, подобных Shape
из нашего примера. Клиенты (у нас это классы Circle
, Square
и Rectangle
) не должны реализовывать методы, которые им не нужно использовать. Кроме того, этот принцип указывает на то, что интерфейс должен решать лишь какую-то одну задачу (в этом он похож на принцип единственной ответственности), поэтому всё, что выходит за рамки этой задачи, должно быть вынесено в другой интерфейс или интерфейсы.
В нашем же случае интерфейс Shape
решает задачи, для решения которых необходимо создать отдельные интерфейсы. Следуя этой идее, переработаем код, создав отдельные интерфейсы для решения различных узкоспециализированных задач:
Теперь интерфейс ICircle
используется лишь для рисования кругов, равно как и другие специализированные интерфейсы — для рисования других фигур. Интерфейс Shape
может применяться в качестве универсального интерфейса.
Объектом зависимости должна быть абстракция, а не что-то конкретное.
- Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
В процессе разработки программного обеспечения существует момент, когда функционал приложения перестаёт помещаться в рамках одного модуля. Когда это происходит, нам приходится решать проблему зависимостей модулей. В результате, например, может оказаться так, что высокоуровневые компоненты зависят от низкоуровневых компонентов.
Здесь класс Http
представляет собой высокоуровневый компонент, а XMLHttpService
— низкоуровневый. Такая архитектура нарушает пункт A принципа инверсии зависимостей: «Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций».
Класс Http
вынужденно зависит от класса XMLHttpService
. Если мы решим изменить механизм, используемый классом Http
для взаимодействия с сетью — скажем, это будет Node.js-сервис или, например, сервис-заглушка, применяемый для целей тестирования, нам придётся отредактировать все экземпляры класса Http
, изменив соответствующий код. Это нарушает принцип открытости-закрытости.
Класс Http
не должен знать о том, что именно используется для организации сетевого соединения. Поэтому мы создадим интерфейс Connection
:
Интерфейс Connection
содержит описание метода request
и мы передаём классу Http
аргумент типа Connection
:
Теперь, вне зависимости от того, что именно используется для организации взаимодействия с сетью, класс Http
может пользоваться тем, что ему передали, не заботясь о том, что скрывается за интерфейсом Connection
.
Перепишем класс XMLHttpService
таким образом, чтобы он реализовывал этот интерфейс:
В результате мы можем создать множество классов, реализующих интерфейс Connection
и подходящих для использования в классе Http
для организации обмена данными по сети:
Как можно заметить, здесь высокоуровневые и низкоуровневые модули зависят от абстракций. Класс Http
(высокоуровневый модуль) зависит от интерфейса Connection
(абстракция). Классы XMLHttpService
, NodeHttpService
и MockHttpService
(низкоуровневые модули) также зависят от интерфейса Connection
.
Кроме того, стоит отметить, что следуя принципу инверсии зависимостей, мы соблюдаем и принцип подстановки Барбары Лисков. А именно, оказывается, что типы XMLHttpService
, NodeHttpService
и MockHttpService
могут служить заменой базовому типу Connection
.
Здесь мы рассмотрели пять принципов SOLID, которых следует придерживаться каждому ООП-разработчику. Поначалу это может оказаться непросто, но если к этому стремиться, подкрепляя желания практикой, данные принципы становятся естественной частью рабочего процесса, что оказывает огромное положительное воздействие на качество приложений и значительно облегчает их поддержку.
Еще больше полезной информации для программистов вы найдете на нашем сайте.
Солид — это… Что такое Солид?
Солид (Римская империя) | |
---|---|
Номинал: | |
Масса: | 1/72 римского фунта (4,55 г) г |
Металл: | золото |
Годы чеканки: | |
Аверс | |
Реверс | |
Солид (от лат. solidus — твердый, прочный, массивный) — римская золотая монета, выпущенная в 309 году н. э. императором Константином. Весила 1/72 римского фунта (4,55 г). Она заменила в качестве основной золотой монеты ауреус. В 314 году введена в западной части Римской империи, а в 324 году — на всей территории империи. Длительное время оставалась основной монетой и денежно-счетной единицей Римской империи, затем Византии. Греческое название византийского солида — «номизма», в Европе его чаще называли «безант» или «бизантин
Кроме солида, чеканились также золотые монеты в 1/2 солида (семис или семиссис) и 1/3 солида («триенс», вес 1,52 г; в Византии больше известна как тремисс или тремиссис).
Распространение солидов
В V—VI веках солиды получили распространение в балтийском регионе (в основном, как плата за меха и янтарь), в VI—VII веках — на Балканах, во Франции, в Нидерландах, в Скандинавии, в Германии, на Руси, в Леванте и Северной Африке (с VII века в двух последних регионах солиды стали вытесняться арабскими динарами).
Из-за высокой пробы, которая до 1453 года (вплоть до падения Константинополя) оставалась почти неизменной (небольшие колебания имели место в 1071—1078 годах), солид оказал значительное влияние на чеканку золотых монет в соседних странах — в Восточном Средиземноморье, в государстве Сасанидов, в арабском мире, а также у варваров и в раннефеодальных государствах эпохи великого переселения народов и позже во всей Западной Европе.
В конце IX — начале X века была отчеканена первая известная золотая монета на Руси, которая внешним видом и весом (4,2 г) напоминала византийский солид. В науке эта монета получила название златник (подлинное название денежной единицы неизвестно).В Европе недоступность источников золота и упадок торговли привели к почти полному прекращению чеканки собственной золотой монеты в IX—XII веках. Основным монетным металлом стало серебро. Солид остался денежно-счетной единицей. Он приравнивался к 12 денариям; в Германии — 12 пфеннигам (германизированное название солида — шиллинг), во Франции — 12 денье (здесь название солид претерпело изменение и дало название солю, позже — су). В Италии солид стал называться сольдо, в Испании — суэльдо.
Оживление торговли в Европе привело к возобновлению чеканки солида в XIII веке, но в связи с ухудшением качества лежащих в основе солида денариев (смотри порча монет) он стал серебряной монетой (основной золотой европейской монетой на долгое время стал дукат). Во Франции впервые серебряная монета стоимостью солид была отчеканена в 1266 году — это было подражание итальянскому «гроссо» гро турнуа.
К середине XV века биллонные солиды чеканили многие соседние с Речью Посполитой государства, в том числе герцогство Пруссия и Ливонская конфедерация.
В 1547 году биллонный солид был чеканен в Гданьске. Король Сигизмунд I определил качество монеты: она весила 1,24 г и содержала 0,23 г серебра. Солид был приравнен к 6 денариям и составлял 1/3 гроша. На польском языке монета получила название «шелёнг», на белорусском — «шеляг».
В 1650 году при короле Яне Казимире бит первый медный солид = 1/4 гроша (77 штук из краковской гривны, вес монеты 2,6 г). С 1659 года в течение десятилетия чеканились новые медные солиды (так называемые «боратинки») = 1/3 гроша, но из расчета 150 штук из гривны (весом 1,35 г). Их было выпущено огромное количество.
В 1755 году король Август III в последний раз выпустил медные солиды для пополнения своей казны.
Галерея
Принципы SOLID в картинках / Блог компании Productivity Inside / Хабр
Если вы знакомы с объектно-ориентированным программированием, то наверняка слышали и о принципах SOLID. Эти пять правил разработки ПО задают траекторию, по которой нужно следовать, когда пишешь программы, чтобы их проще было масштабировать и поддерживать. Они получили известность благодаря программисту Роберту Мартину.
В Сети множество отличных статей, где рассказывается о принципах SOLID, но иллюстрированных среди них мне практически не попадалось. Из-за этого таким людям со склонностью к визуальному восприятию информации – таким, как я – бывает сложно схватывать суть и не отвлекаться.
Основная цель этой статьи – лучше усвоить принципы SOLID через отрисовку иллюстраций, а также определить назначение каждого принципа. Дело в том, что некоторые из принципов кажутся похожими, но функции выполняют разные. Может получиться так, что одному принципу следуешь, а другой при этом нарушаешь, хотя с виду особой разницы между ними нет.
Чтобы проще читалось, я упоминаю здесь только классы, однако всё сказанное в статье применимо также к функциям, методам и модулям, так что имейте это в виду.
Ну, приступим.
Принципы SOLID
S – Single Responsibility (Принцип единственной ответственности)
Каждый класс должен отвечать только за одну операцию.
Если класс отвечает за несколько операций сразу, вероятность возникновения багов возрастает – внося изменения, касающиеся одной из операций вы, сами того не подозревая, можете затронуть и другие.
Назначение
Принцип служит для разделения типов поведения, благодаря которому ошибки, вызванные модификациями в одном поведении, не распространялись на прочие, не связанные с ним типы.
O — Open-Closed (Принцип открытости-закрытости)
Классы должны быть открыты для расширения, но закрыты для модификации.
Когда вы меняете текущее поведение класса, эти изменения сказываются на всех системах, работающих с данным классом. Если хотите, чтобы класс выполнял больше операций, то идеальный вариант – не заменять старые на новые, а добавлять новые к уже существующим.
Назначение
Принцип служит для того, чтобы делать поведение класса более разнообразным, не вмешиваясь в текущие операции, которые он выполняет. Благодаря этому вы избегаете ошибок в тех фрагментах кода, где задействован этот класс.
L — Liskov Substitution (Принцип подстановки Барбары Лисков)
Если П является подтипом Т, то любые объекты типа Т, присутствующие в программе, могут заменяться объектами типа П без негативных последствий для функциональности программы.
В случаях, когда класс-потомок не способен выполнять те же действия, что и класс-родитель, возникает риск появления ошибок.
Если у вас имеется класс и вы создаете на его базе другой класс, исходный класс становится родителем, а новый – его потомком. Класс-потомок должен производить такие же операции, как и класс-родитель. Это называется наследственностью.
Необходимо, чтобы класс-потомок был способен обрабатывать те же запросы, что и родитель, и выдавать тот же результат. Или же результат может отличаться, но при этом относиться к тому же типу. На картинке это показано так: класс-родитель подаёт кофе (в любых видах), значит, для класса-потомка приемлемо подавать капучино (разновидность кофе), но неприемлемо подавать воду.
Если класс-потомок не удовлетворяет этим требованиям, значит, он слишком сильно отличается от родителя и нарушает принцип.
Назначение
Принцип служит для того, чтобы обеспечить постоянство: класс-родитель и класс-потомок могут использоваться одинаковым образом без нарушения работы программы.
I — Interface Segregation (Принцип разделения интерфейсов)
Не следует ставить клиент в зависимость от методов, которые он не использует.
Когда классу приходится производить действия, не несущие никакой реальной пользы, это выливается в пустую трату ресурса, а в случае, если класс выполнять эти действия не способен, ведёт к возникновению багов.
Класс должен производить только те операции, которые необходимы для осуществления его функций. Все другие действия следует либо удалить совсем, либо переместить, если есть вероятность, что они понадобятся другому классу в будущем.
Назначение
Принцип служит для того, чтобы раздробить единый набор действий на ряд наборов поменьше – таким образом, каждый класс делает то, что от него действительно требуется, и ничего больше.
D — Dependency Inversion (Принцип инверсии зависимостей)
Модули верхнего уровня не должны зависеть от модулей нижнего уровня. И те, и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Для начала объясню термины, которые здесь применяются, простыми словами.
Модули (или классы) верхнего уровня = классы, которые выполняют операцию при помощи инструмента
Модули (или классы) нижнего уровня = инструменты, которые нужны для выполнения операций
Детали = специфические характеристики работы инструмента
Согласно данному принципу, класс не должен соединяться с инструментом, который применяет для выполнения операции. Вместо этого он должен быть соединён с интерфейсом, который поможет установить связь между инструментом и классом.
Кроме того, принцип гласит, что ни интерфейс, ни класс, не обязаны вникать в специфику работы инструмента. Напротив, это инструмент должен подходить под требования интерфейса.
Назначение
Этот принцип служит для того, чтобы устранить зависимость классов верхнего уровня от классов нижнего уровня за счёт введения интерфейсов.
Обобщая сказанное
Мы разобрали все пять принципов и сформулировали для каждого назначение. Всё это призвано помочь вам писать код, который можно модифицировать, расширять и тестировать с минимумом проблем. Спасибо, что прочитали; надеюсь, вы получили не меньше удовольствия, чем я в процессе работы над статьёй.
Введение
Хороший код адекватно отражает систему, которую описывает, он устойчив к изменениям в этой системе. Плохой код запутанный, хрупкий и непонятный — он замедляет разработку.
Код становится плохим, когда он перестаёт соответствовать реальности — бизнес-требованиям, правилам поведения частей системы, их отношениям друг с другом.
Бизнес-правила — это территория. Код — карта этой территории. Чем точнее карта, тем проще справляться с изменениями в требованиях и даже предвидеть их.
В этой книге мы хотим рассказать и показать на примерах, как принципы объектно-ориентированного программирования могут помочь спроектировать устойчивую систему.
Почему
ООП?ООП вызывает споры.
Война парадигм может создать впечатление, что подход ООП устарел и плох. Но как минимум в одном он хорош — с ним проще выделять сущности и проводить параллели с частями системы из реальности, которую мы собираемся моделировать.
Понятия из ООП помогают проектировать систему на языке, более близком к языку бизнес-правил. Это снижает вероятность ошибки при переводе с «языка бизнеса» на «язык разработки» и наоборот.
О каких принципах пойдёт речь?
Мы рассмотрим 5 принципов, а именно:
Каждый из них — это лишь рекомендация, все они имеют область и границы применения. Но чтобы увидеть эти границы, необходимо понять, в чём польза и издержки каждого.
Зная пользу и ограничения, можно оценить, насколько конкретный принцип помогает решить задачу, стоящую перед вами.
Какой план?
Каждый раздел будет описывать один из принципов и показывать, как им пользоваться в повседневной работе.
Мы будем рассматривать примеры на TypeScript, так как в нём есть понятия, которые нам пригодятся по ходу повествования. Если вы чувствуете себя неуверенно с
TypeScript, попробуйте прочесть книгу
В конце разделов вы найдёте проверочные вопросы. Каждый правильно отвеченный вопрос увеличивает количество очков на вашем счету. Максимально-возможный счёт — 100 очков. Отвечайте аккуратно — вопросы с подвохом. Обратите внимание, вариантов ответа может быть больше одного.
Материалы к разделу
О релевантности принципов объектно-ориентированного…
Примечание — Это адаптированный перевод статьи Роберта Мартина Solid Relevance. Повествование ведётся от лица автора оригинала.
Недавно я получил письмо, автор которого интересовался релевантностью принципов SOLID. Вот что он написал:
Многие годы вопросы о принципах SOLID были стандартными на собеседованиях в нашей компании. Мы ожидали от кандидатов хорошего понимания этих принципов. В какой-то момент один из наших менеджеров, который не полностью погружён в программирование, спросил, актуально ли говорить с кандидатами о SOLID. Он сказал, что принцип открытости-закрытости стал не таким важным, как раньше. Это связано с переходом от монолитов к микросервисной архитектуре. Принцип подстановки Лисков давно устарел, потому что мы уже не уделяем столько же внимания наследованию, как 20 лет назад. Думаю, нам стоит учитывать позицию Дэна Норта в отношении SOLID, которую он выразил в рекомендации: «Пишите простой код».
В ответном письме я написал следующее.
Сегодня принципы SOLID остаются такими же релевантными, как в 90-е годы и раньше. Это связано с тем, что программы практически не изменились за эти годы. Более того, программы сильно не изменились с 1945 года, когда Алан Тьюринг написал первые строки кода для электронного компьютера. Программы всё ещё состоят из операторов if
, циклов while
и операторов присваивания. Это всё ещё последовательность, перебор и итерация.
Каждому новому поколению нравится думать, что его мир сильно отличается от мира, в котором жили предыдущие поколения. Это ошибка, которую совершает каждое поколение. Оно осознаёт эту ошибку, когда появляется следующее поколение, которое приходит и рассказывает, как сильно всё вокруг изменилось.
Давайте рассмотрим каждый принцип и оценим его актуальность.
Принцип единственной ответственности
Держите вместе сущности, которые меняются по одной причине. Разделяйте сущности, которые меняются по разным причинам.
Сложно представить, что этот принцип стал нерелевантным. Мы не смешиваем код, который отвечает за бизнес-логику, с кодом, который отвечает за интерфейсы. Мы не смешиваем SQL-запросы с протоколами передачи данных. Мы разделяем код, который меняется по разным причинам, благодаря чему изменения в одной подсистеме не влияют на другие подсистемы. Мы следим, чтобы модули, которые меняются по разным причинам, не влияли друг на друга.
Микросервисы не решают эту проблему. Если вы смешиваете код, который меняется по разным причинам, то можете получить запутанные микросервисы или даже наборы запутанных микросервисов.
Слайды Дэна Норта, ссылка на которые приводится выше, не учитывают этого момента. Из-за этого мне кажется, что он вообще не понимает принцип единственной ответственности, или что он иронизировал. Насколько я знаю Дэна, последнее очень вероятно. В ответ на упоминание принципа единственной ответственности он предлагает писать простой код. Я согласен с этим. Принцип единственной ответственности — один из способов писать простой код.
Принцип открытости-закрытости
Модуль должен быть открыт для расширения, но закрыт для модификации.
Когда кто-то сомневается в релевантности именно этого принципа, я сильнее всего беспокоюсь за будущее программирования. Конечно, мы хотим создавать модули, которые можно расширять без модификации. Вы можете представить себе работу с системой, в которой не реализована независимость от типа девайса, например, в которой запись файла на диск фундаментально отличается от печати файла на принтере? Мы же не хотим видеть отдельные инструкции для каждого типа девайса в коде?
Или… Хотим ли мы отделять абстрактные концепции от конкретных понятий? Хотим ли мы отделять бизнес-логику от небольших деталей, связанных с интерфейсами, или от протоколов передачи данных, или произвольного поведения базы данных? Конечно да!
И снова в слайдах Дэна Норта есть ошибка. При изменении требований только часть существующего кода становится неактуальной. Но значительная часть кода остаётся актуальной. И мы хотим знать, что нам не придётся менять работающую часть кода только для того, чтобы неработающий код снова заработал. Дэн снова предлагает писать простой код. И я снова соглашаюсь. Соблюдение принципа открытости-закрытости помогает писать простой код.
Принцип подстановки Лисков
Если программа использует интерфейс, она не должна знать о реализации этого интерфейса.
Люди, и я в том числе, долгое время ошибались, думая, что принцип подстановки Лисков применим только к наследованию. Это не так. Этот принцип определяет использование подтипов.
Все реализации интерфейса являются подтипами этого интерфейса. Все утиные типы относятся к подтипам подразумеваемого интерфейса. А каждый пользователь базового интерфейса должен принимать значение этого интерфейса. Если реализация мешает пользователю базового типа, количество конструкций if/switch
в коде растёт.
Принцип подстановки Лисков говорит о необходимости чётко определять абстракции. Невозможно поверить, что этот принцип устарел.
В этом случае Дэн и его слайды правы. Он просто упустил из виду детали: простой код — это код, в котором чётко выделены абстракции.
Принцип разделения интерфейса
Делайте интерфейсы маленькими, чтобы клиенты не зависели от вещей, которыми они не пользуются.
Мы всё ещё работаем с компилируемыми языками. Мы всё ещё зависим от дат модификации, с помощью которых определяем, какие модули нужно перекомпилировать и повторно задеплоить. Пока это так, придётся сталкиваться с проблемой зависимости модуля A от модуля B во время компиляции, а не во время выполнения, поскольку изменения в модуле B приведут к перекомпиляции и повторному деплою модуля A.
Эта проблема стоит особенно остро в языках со статической типизацией, например, Java, C#, C++, Go, Swift и так далее. Языки с динамической типизацией подвержены этому в гораздо меньшей степени, но всё-таки полностью не защищены от этой проблемы. Это доказывает существование таких инструментов, как Maven и Leiningen.
Читайте также: Системы типов в языке — какие бывают и чем отличаются
Слайд Дэна, посвящённый этому принципу, содержит явно неправильную информацию. Клиенты однозначно зависят от методов, которые не используют, если они нуждаются в перекомпиляции и повторном деплое, когда эти методы меняются. Финальное замечание Дэна здравое, насколько это возможно. Да, если вы можете разделить класс с двумя интерфейсами на два класса, сделайте это. Это соответствует принципу единой ответственности. Но такое разделение часто невозможно и даже нежелательно.
Принцип инверсии зависимостей
Модули верхнего уровня не должны зависеть от деталей реализации модулей нижнего уровня.
Трудно представить архитектуру, в которой не используется этот принцип. Мы не хотим, чтобы высокоуровневая бизнес-логика зависела от деталей реализации на нижних уровнях. Я надеюсь, что это очевидно. Мы не хотим, чтобы вычисления, которые приносят нам деньги, смешивались с SQL-запросами, низкоуровневой валидацией или форматированием.
Мы хотим изолировать высокоуровневые абстракции от низкоуровневых деталей. Это разделение возможно благодаря корректному управлению зависимостями внутри системы. Это управление позволяет всем зависимостям в исходном коде, особенно пересекающим архитектурные границы, указывать на высокоуровневые абстракции, а не на низкоуровневые детали.
Слайды Дэна каждый раз заканчиваются призывом писать простой код. Это хороший совет. Но если годы развития индустрии чему-то нас научили, так это тому, что простота требует дисциплины, которая возможна благодаря принципам. Это те самые принципы, которые определяют простоту. Это та дисциплина, которая заставляет программистов писать простой код.
Лучший способ всё усложнить и устроить беспорядок — просто посоветовать людям писать простой код и ничего больше им не объяснить.
Написание JavaScript в соответствии с SOLID
Использовал ли кто-нибудь принцип программирования SOLID (или какие-либо его части) при разработке JavaScript?
Я только начал читать об этом, но, похоже, не могу найти никого, кто использовал бы его для JS. Единственная часть, которую я нахожу простой в реализации/использовании, — это «Single responsibility principle».
То, что я ищу, — это статьи или примеры, где используются эти принципы. И есть ли какие-то аргументы, почему нельзя использовать некоторые части?
Например, «Interface segregation principle» говорит, что » представление о том, что многие клиентские интерфейсы лучше, чем один интерфейс общего назначения.»
Но, насколько мне известно, в JS нет такой вещи, как интерфейсы (хорошо, если бы это было так).
javascript solid-principlesПоделиться Источник fredrik 17 января 2011 в 09:54
5 ответов
- Избыточность в соответствии с SOLID
Согласно SOLID , вы должны устранить избыточность по функциональности или по категориям? Например, если бы у нас было 3 класса, каждый из которых содержал String filepath = … в качестве переменной-члена, было бы лучше создать новый класс, то есть Settings.java с filepath в качестве…
- Javascript цвет ячейки в соответствии с математикой
У меня есть html table с номерами. Например: Col1 Col2 Col3 5 3 1 1 2 1 10 3 2 И я хочу использовать Javascript для того, чтобы каждая ячейка имела определенный цветовой фон в соответствии со следующей математикой: если один из трех столбцов (для каждой строки) больше, чем сумма других 2 столбцов…
Поделиться Ryan Ransford 16 декабря 2011 в 16:59
14
JavaScript иногда получает плохую репутацию как субпаритет к таким, как C++, C#, и Java, когда на самом деле это очень мощный функциональный язык программирования, который также имеет объектно-ориентированные возможности (хотя на самом деле он не классифицируется как объектно-ориентированный)
Возможно, многие разработчики смотрят на это свысока, потому что многие из них привыкли видеть плохие методы программирования и, следовательно, ошибочное поведение в JavaScript. По какой-то неизвестной причине кажется более приемлемым быть небрежным на стороне клиента. Это то, что я хотел бы изменить.
Я считаю, что эти 30 принципов прочны. (Без каламбура). Если вы будете следовать этим соглашениям, у вас будет меньше шансов накопить технический долг, созданный небрежным кодом, ярлыками и отсутствием архитектуры. Ваш код будет более ремонтопригодным, более многоразовым, более модульным, менее тесно связанным, масштабируемым и расширяемым. Вы также внесете свой вклад в демонстрацию всей мощи JavaScript, когда ваш продукт будет спроектирован, а не просто безрассудно сшит вместе.
Этот документ описывает основы SOLID. Одни и те же правила применяются независимо от того, ссылаетесь ли вы на C++, Java, JavaScript или любой другой объектно-ориентированный язык.
Проект кода-твердые принципы объектно-ориентированного программирования
Вот еще немного информации о концепциях JavaScript на colourcoding.net .
Поделиться jmort253 17 января 2011 в 10:06
4
Этот принятый ответ ошибочен. Я рекомендую прочитать пять статей, связанных с Райаном Ренсфордом ниже. Последняя статья приходит к следующему выводу, который я не смог донести (Курсив мой):
Хотя в ходе нашего исследования мы видели различия в том, как принципы проектирования SOLID применяются к JavaScript по сравнению с другими языками, было показано, что каждый из принципов имеет некоторую степень применимости в рамках разработки JavaScript.
SOLID предназначен для объектно-ориентированного программирования. JavaScript-это язык, основанный на прототипах, но позволяющий программировать в манере OOP (если вы действительно очень стараетесь это сделать). Многие люди считают, что вы не должны пытаться навязать парадигмы языков, которые вы изучили (например, C++/C#/Java)), другим (JavaScript). Вот статья о OOP в JS , которая также приходит к такому выводу.
Есть несколько подходов к OOP в Prototype.js, CoffeeScript, и Джон отказывается от простого наследования JavaScript (каждый со своими собственными ловушками).
Но терминологию (интерфейсы, абстракция) SOLID трудно правильно применить к ванильному JavaScript. Вы сможете применить «S» и, возможно, «L» (которые являются хорошими концепциями). Но если идти дальше, то потребуются такие конструкции, как интерфейсы (которые в любом случае трудно найти в динамических языках, контракты могут работать) и способность ограничивать inheritance/modification.
Поделиться Marcel Jackwerth 17 января 2011 в 10:08
- Написание тестов, которые не проваливаются первыми
TDD лучшие практики говорят, что новый тест должен провалиться. Тем не менее, я думаю, что возможно, что тест необходим, хотя он не терпит неудачи, когда он только что был написан. Пример рабочего процесса: Написать тест, который проверяет, идет ли дата окончания до даты начала-тест не проходит;…
- Android-отделить асинхронный код http от действия в соответствии с принципами SOLID
Я хочу отделить асинхронный код http от действий, когда я повторно использую этот код. Именно этим я сейчас и занимаюсь: Я хочу получить список проектов формы a REST API и сохранить его в массиве. (Предположим, что я не использую локальное кэширование, так как хочу загружать их каждый раз)…
2
Эта презентация: SOLID JavaScript In a Wobbly (World Wide Web) от Derick Bailey демонстрирует, как использовать принципы программирования SOLID при разработке javascript.
Он явно обращается к проблеме интерфейсов в javascript несколько раз. В javascript интерфейсы-это скорее условность, так что вам решать, как их определить. Вы можете написать пустое определение объекта (думайте о нем как об абстрактном классе или интерфейсе). Или вы можете положиться на документацию для вашего protocols/contracts.
На более концептуальном уровне сигнатуры методов объекта неявно определяют его интерфейс, поэтому в javascript вы часто можете обойтись «duck-typing» и все еще придерживаться SOLID. (!) вот пример «interface segregation principle» из презентации, который демонстрирует это:
// Copyright 2014 Muted Solutions, LLC, and freely distributable and re-usable under the MIT License
// JavaScript has no interface construct ...
// sooooooo..... use inheritance instead? o_O
// Rectangle
// ---------
function Rectangle(){}
Rectangle.prototype.area = function(){
return this.height * this.width;
};
Rectangle.prototype.setHeight = function(height){
this.height = height;
};
Rectangle.prototype.setWidth = function(width){
this.width = width;
};
// Square
// ------
function Square(){}
Square.prototype.area = function(){
return this.size * this.size;
};
Square.prototype.setSize = function(size){
this.height = size;
this.width = size;
};
Этот код и все rest примера кода из доклада размещены на GitHub: https://github.com/derickbailey/solid-javascript
Поделиться wxactly 25 января 2015 в 23:00
0
Большинство принципов SOLID зависят от абстракции, в других языках, таких как Java, мы можем делать абстракции с помощью интерфейсов, а Javascript не имеет интерфейсов, означает ли это, что мы не можем достичь принципов SOLID в Javascript? Ответ-Нет. Это отличная статья, чтобы прояснить ситуацию.
Achieving Abstraction In JavaScriptСледовательно, JavaScript является слабо типизированным языком и не имеет классической поддержки абстракции. Мы попытались достичь абстракции в JavaScript, определив интерфейсы и используя их. Тем не менее, интерфейсы никак не влияют на наш код. Они-не что иное, как способ документирования кода для людей. Все примеры, которые мы показали выше, будут работать точно так же, даже если мы полностью удалим интерфейсы. Однако речь идет о том, чтобы сделать роли явными. Это повышает читабельность, понятность и ремонтопригодность кода.
В общем, основная цель принципов SOLID — сделать код читабельным и легким для изменения, применение SOLID к вашему коду-это попытка не повторяться и сделать ваш код лучше и чище.
Поделиться Maysara Alhindi 04 июля 2017 в 19:31
Похожие вопросы:
Как получить местоположение объекта с javascript в соответствии с его родительским div
Как получить местоположение объекта с javascript в соответствии с его родительским div Например : <div id=ExampleDiv> // bla bla position at the page <img id=MyImage/> </div> Если…
Изменение высоты div в соответствии с разрешением экрана javascript
Вот в чем проблема. У меня есть <div id=main></div> Я хочу проверить разрешение пользователя и изменить его высоту в соответствии с разрешением пользователя, используя javascript?…
Написание скрипта внутри тега head в javascript-лучший вариант, почему?
Я знаю, что задаю очень простой и глупый вопрос, но я хочу знать все и вся в сценарии java. Мы можем написать тег сценария в разделе головы или тела. но, написание скрипта внутри тега head в…
Избыточность в соответствии с SOLID
Согласно SOLID , вы должны устранить избыточность по функциональности или по категориям? Например, если бы у нас было 3 класса, каждый из которых содержал String filepath = … в качестве…
Javascript цвет ячейки в соответствии с математикой
У меня есть html table с номерами. Например: Col1 Col2 Col3 5 3 1 1 2 1 10 3 2 И я хочу использовать Javascript для того, чтобы каждая ячейка имела определенный цветовой фон в соответствии со…
Написание тестов, которые не проваливаются первыми
TDD лучшие практики говорят, что новый тест должен провалиться. Тем не менее, я думаю, что возможно, что тест необходим, хотя он не терпит неудачи, когда он только что был написан. Пример рабочего…
Android-отделить асинхронный код http от действия в соответствии с принципами SOLID
Я хочу отделить асинхронный код http от действий, когда я повторно использую этот код. Именно этим я сейчас и занимаюсь: Я хочу получить список проектов формы a REST API и сохранить его в массиве….
Написание сценария формы Angular с помощью Vanilla JavaScript
Каждый год у меня есть электронная таблица из ~100 строк, которые мне нужно отправить на сайт через неуклюжую форму по одной строке за раз. Вместо того чтобы тратить свое время на заполнение формы…
Переупорядочить массив в соответствии с заданным индексом в javaScript
Я столкнулся с проблемой изменения значений индекса массива в соответствии с заданным индексом в javaScript. я искал на StackOverflow и нашел какое-то решение, но те, которые не работают для меня,…
Настройка контурной границы в соответствии с основной границей
Как установить границу контура в соответствии с исходной границей, которая в данный момент является прямоугольником при наведении курсора? Я хотел бы установить это в соответствии с его границей…..
Свойства вещества: твердые тела | Живая наука
Твердое тело — одно из трех основных состояний материи, наряду с жидкостью и газом. Материя — это «вещество» Вселенной, атомы, молекулы и ионы, из которых состоят все физические вещества. В твердом теле эти частицы плотно упакованы вместе и не могут свободно перемещаться внутри вещества. Молекулярное движение частиц в твердом теле ограничивается очень небольшими колебаниями атомов вокруг их фиксированных положений; поэтому твердые тела имеют фиксированную форму, которую трудно изменить.Твердые тела тоже имеют определенный объем; то есть они сохраняют свой размер, как бы вы их ни пытались изменить.
Твердые вещества делятся на две основные категории, кристаллические твердые вещества и аморфные твердые вещества, в зависимости от того, как расположены частицы.
Кристаллические твердые тела
Кристаллические твердые тела или кристаллы считаются «истинными твердыми телами». Минералы представляют собой твердые кристаллические вещества. Поваренная соль является одним из примеров такого твердого вещества. В кристаллических твердых телах атомы, ионы или молекулы расположены упорядоченным и симметричным образом, который повторяется по всему кристаллу.Самая маленькая повторяющаяся структура твердого тела называется элементарной ячейкой, которая похожа на кирпич в стене. Элементарные ячейки объединяются, образуя сеть, называемую кристаллической решеткой. Существует 14 типов решеток, называемых решетками Браве (названных в честь Огюста Браве, французского физика 19-го века), и они подразделяются на семь кристаллических систем в зависимости от расположения атомов. На странице ChemWiki в Калифорнийском университете в Дэвисе эти системы перечислены как кубические, гексагональные, тетрагональные, ромбоэдрические, ромбические, моноклинные и триклинические.
Помимо регулярного расположения частиц, твердые кристаллические вещества обладают рядом других характерных свойств. Как правило, они несжимаемы, то есть их нельзя сжать до более мелких форм. Из-за повторяющейся геометрической структуры кристалла все связи между частицами имеют одинаковую прочность. Это означает, что кристаллическое твердое вещество будет иметь определенную температуру плавления, потому что нагревание разорвет все связи одновременно.
Кристаллические твердые тела также обладают анизотропией .Это означает, что такие свойства, как показатель преломления (насколько свет изгибается при прохождении через вещество), проводимость (насколько хорошо он проводит электричество) и прочность на разрыв (сила, необходимая для его разрыва), будут варьироваться в зависимости от направления, с которого действует сила. применяется. Кристаллические твердые вещества также демонстрируют расщепление ; в случае разрушения части будут иметь строганную поверхность или прямые края.
Типы кристаллических твердых веществ
Существует четыре типа кристаллических твердых веществ: ионные твердые вещества, молекулярные твердые частицы, сетчатые ковалентные твердые тела и металлические твердые тела.
Ионные твердые вещества
Ионные соединения образуют кристаллы, состоящие из противоположно заряженных ионов: положительно заряженного катиона и отрицательно заряженного аниона . Из-за сильного притяжения между противоположными зарядами для преодоления ионных связей требуется много энергии. Это означает, что ионные соединения имеют очень высокие температуры плавления, часто от 300 до 1000 градусов по Цельсию (от 572 до 1832 градусов по Фаренгейту).
Хотя сами кристаллы твердые, хрупкие и непроводящие, большинство ионных соединений могут растворяться в воде, образуя раствор свободных ионов, который будет проводить электричество.Это могут быть простые бинарные соли, такие как хлорид натрия (NaCl) или поваренная соль, где один атом металлического элемента (натрия) связан с одним атомом неметаллического элемента (хлора). Они также могут состоять из многоатомных ионов, таких как NH 4 NO 3 (нитрат аммония). Многоатомные ионы — это группы атомов, которые имеют общие электроны (называемые ковалентными связями ) и функционируют в соединении, как если бы они составляли один заряженный ион.
Молекулярные твердые тела
Молекулярные твердые тела состоят из ковалентно связанных молекул, притягиваемых друг к другу электростатическими силами (называемыми силами Ван-дер-Ваальса, согласно веб-сайту HyperPhysics).Поскольку ковалентная связь предполагает совместное использование электронов, а не прямой перенос этих частиц, общие электроны могут проводить больше времени в электронном облаке более крупного атома, вызывая слабую или смещающуюся полярность. Это электростатическое притяжение между двумя полюсами (диполями) намного слабее, чем ионная или ковалентная связь, поэтому молекулярные твердые частицы, как правило, мягче, чем ионные кристаллы, и имеют более низкие температуры плавления (многие будут плавиться при температуре менее 100 C или 212 F). Большинство твердых веществ неполярны. Эти неполярные молекулярные твердые вещества не растворяются в воде, но растворяются в неполярном растворителе, таком как бензол и октан.Полярные молекулярные твердые вещества, такие как сахар, легко растворяются в воде. Молекулярные твердые вещества не проводят ток.
Примеры твердых молекулярных веществ включают лед, сахар, галогены, такие как твердый хлор (Cl 2 ), и соединения, состоящие из галогена и водорода, такие как хлористый водород (HCl). «Бакиболлы» фуллерена также являются твердыми молекулярными телами.
Сетчатые ковалентные твердые тела
В сетчатых твердых телах нет отдельных молекул. Атомы ковалентно связаны в непрерывную сеть, в результате чего образуются огромные кристаллы.В сетчатом твердом теле каждый атом ковалентно связан со всеми окружающими атомами. Сетевые твердые тела имеют свойства, аналогичные свойствам ионных твердых тел. Это очень твердые, несколько хрупкие твердые вещества с чрезвычайно высокими температурами плавления (выше 1000 C или 1800 F). В отличие от ионных соединений они не растворяются в воде и не проводят электричество.
Примеры сетчатых тел включают алмазы, аметисты и рубины.
Металлы представляют собой непрозрачные блестящие твердые вещества, которые являются ковкими и пластичными.Под податливостью подразумевается, что они мягкие, и их можно формовать или прессовать в тонкие листы, а под пластичностью — их можно вытягивать в проволоку. В металлической связи валентные электроны не передаются и не разделяются, как при ионной и ковалентной связи. Скорее, электронные облака соседних атомов перекрываются, так что электроны становятся делокализованными. Электроны относительно свободно перемещаются от одного атома к другому по всему кристаллу.
Металл можно описать как решетку положительных катионов в «море» отрицательных электронов.Эта подвижность электронов означает, что металлы обладают высокой проводимостью тепла и электричества. Металлы, как правило, имеют высокие температуры плавления, хотя заметным исключением являются ртуть с температурой плавления минус 37,84 градусов по Фаренгейту (минус 38,8 по Цельсию) и фосфор с температурой плавления 111,2 F (44 ° C).
Сплав — это твердая смесь металлического элемента с другим веществом. В то время как чистые металлы могут быть слишком ковкими и тяжелыми, сплавы более податливы. Бронза — это сплав меди и олова, а сталь — это сплав железа, углерода и других добавок.
Аморфные твердые вещества
В аморфных твердых телах (буквально «твердые тела без формы») частицы не имеют повторяющегося узора решетки. Их еще называют «псевдотвердыми телами». Примеры аморфных твердых веществ включают стекло, резину, гели и большинство пластиков. Аморфное твердое вещество не имеет определенной температуры плавления; вместо этого он плавится постепенно в диапазоне температур, потому что связи не разрываются сразу. Это означает, что аморфное твердое вещество будет плавиться в мягкое, податливое состояние (например, воск свечи или расплавленное стекло), прежде чем полностью превратиться в жидкость.
Аморфные твердые тела не обладают характерной симметрией, поэтому они не имеют правильных плоскостей спайности при разрезании; края могут быть изогнутыми. Их называют изотропными , потому что такие свойства, как показатель преломления, проводимость и прочность на разрыв, равны независимо от направления приложения силы.
Дополнительные ресурсы
Твердое, жидкое и газовое | Химия для неосновных специалистов
Цели обучения
- Определить, твердое тело, жидкость и газ.
- Объясните различия между этими тремя фазами материи.
Почему состояние воды на каждой картинке разное?
Почему состояние воды на каждой картинке разное?
Вода может принимать разные формы. При низких температурах (ниже 0 ° C) он твердый. При «нормальной» температуре (от 0 ° C до 100 ° C) это жидкость. В то время как при температуре выше 100 ° C вода представляет собой газ (пар).
Состояние воды зависит от температуры.Каждое состояние (твердое, жидкое и газообразное) имеет свой уникальный набор физических свойств.
Материя и ее состояния
Материя обычно находится в одном из трех состояний: твердое , жидкое или газовое . Состояние данного вещества также является физическим свойством. Некоторые вещества существуют в виде газов при комнатной температуре (кислород и углекислый газ), в то время как другие, такие как вода и металлическая ртуть, существуют в виде жидкостей. Большинство металлов существует в твердом виде при комнатной температуре.Все вещества могут существовать в любом из этих трех состояний. Помимо существования в одном из трех состояний, материя может также претерпеть изменений состояния. Изменение состояния происходит, когда материя преобразуется из одного состояния в другое, например, когда жидкость превращается в газ или твердое тело превращается в жидкость.
Примечание: Технически говоря, четвертое состояние материи, называемое плазмой, существует, но на Земле оно не встречается в природе, поэтому мы опускаем его из нашего исследования.
Жидкость
Жидкости имеют следующие характеристики:
- не имеет определенной формы (принимает форму контейнера)
- имеет определенный объем
- частиц могут свободно перемещаться друг над другом, но по-прежнему притягиваются друг к другу
Знакомая жидкость — металлическая ртуть. Меркурий — это аномалия. Это единственный известный нам металл, который находится в жидком состоянии при комнатной температуре. Ртуть также имеет способность прилипать к себе (поверхностное натяжение) — свойство, присущее всем жидкостям.Ртуть имеет относительно высокое поверхностное натяжение, что делает ее уникальной. Здесь вы видите ртуть в ее обычной жидкой форме.
Рисунок 2.6
Меркурий.
Если бы мы нагревали жидкую ртуть до ее точки кипения 357 ° C и при правильном давлении, мы бы заметили, что все частицы в жидком состоянии переходят в газовое состояние.
Газ
Газы имеют следующие характеристики:
- не имеет определенной формы (принимает форму контейнера)
- без определенного объема
- частиц движутся случайным образом с незначительным притяжением друг к другу или без него
- сильно сжимаемый
Цельный
Твердые вещества имеют следующие характеристики:
- определенной формы (жесткая)
- определенного объема
- частиц колеблются вокруг фиксированных осей
Если бы мы охладили жидкую ртуть до точки замерзания -39 ° C и при правильном давлении, мы бы заметили, что все жидкие частицы перешли бы в твердое состояние.
На видео ниже показан этот процесс.
Как вы можете видеть на видео, ртуть может затвердеть, когда ее температура будет доведена до точки замерзания. Однако при возвращении к условиям комнатной температуры ртуть недолго находится в твердом состоянии и возвращается в свою более распространенную жидкую форму.
Сводка
- Существует три состояния материи — твердое, жидкое и газообразное.
- Твердые тела имеют определенную форму и объем.
- Жидкости имеют определенный объем, но имеют форму емкости.
- Газы не имеют определенной формы или объема.
Практика
Вопросы
Используйте этот веб-сайт, чтобы ответить на следующие вопросы:
http://www.miamisci.org/af/sln/phases/nitrogensolid.html
- Какой материал является газом при комнатной температуре (25 ° C)?
- Какой материал твердый при комнатной температуре?
- Какой материал является жидкостью при комнатной температуре?
- Что происходит с движением частиц при повышении температуры?
- Что происходит с движением частиц при понижении температуры?
Обзор
Вопросы
- Сколько существует состояний материи?
- Что такое твердое тело?
- Что такое жидкость?
- Что такое газ?
Глоссарий
- сплошной: Имеет определенную форму и объем.
- жидкость: Имеет определенный объем, но имеет форму емкости.
- газ: Не имеет определенной формы или объема.
- изменение состояния: Когда материя преобразуется из одного из трех состояний (например, твердое, жидкое или газообразное) в другое состояние.
Газы, жидкости и твердые вещества
Газы, жидкости и твердые вещества Газы, жидкости и твердые веществаГазы, жидкости и твердые тела состоят из атомов, молекул и / или ионы, но поведение этих частиц различается в трех фазах.На следующем рисунке показаны микроскопические различия.
Вид газа под микроскопом. | Вид жидкости под микроскопом. | Изображение твердого тела под микроскопом. |
Обратите внимание, что:
- Частиц в:
- газ хорошо разделены без штатной договоренности.
- жидкости находятся близко друг к другу, не располагая регулярным расположением.
- solid плотно упакованы, как правило, равномерно.
- Частиц в:
- газ колеблется и свободно перемещается на высоких скоростях.
- жидкости вибрируют, перемещаются и скользят друг мимо друга.
- твердые вибрируют (покачиваются), но обычно не перемещаются с места на место.
В следующей таблице приведены свойства газов, жидкостей и твердых тел. и определяет микроскопическое поведение, отвечающее за каждое свойство.
Некоторые характеристики газов, жидкостей и твердых тел и микроскопического объяснения поведения | ||
---|---|---|
газ | жидкость | цельный |
принимает форму и объем своего контейнера частиц могут перемещаться друг мимо друга | принимает форму той части контейнера, которую он
занимает частиц могут перемещаться / скользить друг мимо друга | сохраняет фиксированный объем и форму жесткий — частицы заблокированы на месте |
сжимаемый много свободного пространства между частицами | не легко сжимается Мало свободного пространства между частицами | не легко сжимается Мало свободного пространства между частицами |
течет легко частиц могут перемещаться друг мимо друга | течет легко частиц могут перемещаться / скользить друг мимо друга | не течет легко жесткий — частицы не могут двигаться / скользить мимо еще |
Chem4Kids.com: Matter: Solids
Что такое одна физическая характеристика твердого тела? Твердые тела могут быть твердыми, как камень, мягкими, как мех, большими камнями, такими как астероид, или маленькими камнями, такими как песчинки. Ключевым моментом является то, что твердых тел сохраняют свою форму и не текут как жидкость. Камень всегда будет выглядеть как камень, если с ним что-то не случится. То же самое и с бриллиантом. Твердые тела могут сохранять свою форму, потому что их молекулы плотно упакованы вместе.
Вы можете спросить: «Baby Power — это твердое вещество? Оно мягкое и пудровое». Бэби-сила тоже солидная. Это просто измельченный кусок талька . Даже если вы измельчите твердое вещество в порошок, вы увидите крошечные кусочки этого твердого вещества под микроскопом. Жидкости потекут и наполняют емкость любой формы. Твердым телам нравится сохранять свою форму.
Точно так же, как большое твердое тело сохраняет свою форму, атомы внутри твердого тела не могут слишком сильно перемещаться. Атомы и молекулы в жидкостях и газах подпрыгивают и плавают, свободно перемещаясь, где хотят.Молекулы в твердом теле застревают в определенной структуре или расположении атомов. Атомы по-прежнему колеблются, а электроны летают по своим орбиталям, но весь атом не изменит своего положения.
Твердые тела могут состоять из многих вещей. В них могут быть как чистые элементы, так и различные соединения. Если у вас есть твердое тело с более чем одним типом соединений, оно называется смесью. Большинство горных пород представляют собой смеси множества различных соединений. Бетон — хороший пример искусственной твердой смеси.Гранит — это смесь, которую вы можете найти, путешествуя по национальному парку. Гранит состоит из маленьких кусочков кварца, слюды и других частиц. Поскольку все маленькие кусочки распределены по породе неравномерно на , ученые называют это неоднородной смесью . Гетерогенные смеси имеют различных концентраций соединений в разных областях смеси. Например, в одной части гранита может быть много кварца и очень мало полевого шпата, но всего в нескольких дюймах от него эти количества могут измениться.
На другом конце спектра находится нечто, называемое кристаллом . Кристалл — это форма твердого тела, в которой атомы расположены в очень определенном порядке. Кристаллы часто являются чистыми веществами, и не все вещества могут образовывать кристаллы, потому что это очень тонкий процесс. Атомы расположены в регулярном повторяющемся узоре, который называется кристаллической решеткой . Поваренная соль (NaCl) — отличный пример кристалла, который вы можете найти в своем доме. Атомы натрия (Na) и хлора (Cl) располагаются определенным образом, образуя кубических кристаллов соли .Алмаз — еще один хороший пример кристалла. Алмазы представляют собой кристаллическую форму чистого углерода (C). Атомы углерода алмаза связаны очень компактно и структурированно. Атомы углерода, обнаруженные в графите (в карандашах), имеют другое кристаллическое расположение. Согласно шкале твердости по шкале Мооса , алмазы очень твердые с показателем 10, а графит очень мягкий со значением 1,5. Две разные структуры атомов углерода ( тетраэдр против шестиугольника ) называются аллотропами .\ text {o} \ text {C} \), вода — это газ (пар). Состояние воды зависит от температуры. Каждое состояние имеет свой уникальный набор физических свойств. Материя обычно находится в одном из трех состояний: твердое , жидкое или газовое . Рисунок \ (\ PageIndex {1} \): Материя обычно подразделяется на три классических состояния, с добавлением плазмы в качестве четвертого состояния. Слева направо: кварц (твердое тело), вода (жидкость), диоксид азота (газ).Состояние, которое демонстрирует данное вещество, также является физическим свойством.Некоторые вещества существуют в виде газов при комнатной температуре (кислород и углекислый газ), в то время как другие, такие как вода и металлическая ртуть, существуют в виде жидкостей. Большинство металлов существует в твердом виде при комнатной температуре. Все вещества могут существовать в любом из этих трех состояний. На рисунке \ (\ PageIndex {2} \) показаны различия между твердыми телами, жидкостями и газами на молекулярном уровне. Твердое тело имеет определенный объем и форму, жидкость имеет определенный объем, но не имеет определенной формы, а газ не имеет определенного объема или формы.
Рисунок \ (\ PageIndex {2} \): представление состояний твердого тела, жидкости и газа.(а) Твердый O 2 имеет фиксированный объем и форму, а молекулы плотно упакованы вместе. b) жидкость O 2 соответствует форме емкости, но имеет фиксированный объем; он содержит относительно плотно упакованные молекулы. c) газообразный O 2 полностью заполняет свой контейнер — независимо от размера или формы контейнера — и состоит из широко разделенных молекул.Плазма: четвертое состояние вещества
С технической точки зрения, существует четвертое состояние материи, называемое плазмой, но оно не встречается в природе на Земле, поэтому мы опускаем его из нашего исследования.
Плазменный шар, действующий в затемненной комнате. (CC BY-SA 3.0; шоколадный дуб).
Твердые вещества
В твердом состоянии отдельные частицы вещества находятся в фиксированных положениях по отношению друг к другу, потому что тепловой энергии недостаточно для преодоления межмолекулярных взаимодействий между частицами. В результате твердые тела имеют определенную форму и объем. Большинство твердых веществ твердые, но некоторые (например, воски) относительно мягкие. Многие твердые тела, состоящие из ионов, также могут быть довольно хрупкими.\ text {o} \ text {C} \), и при правильном давлении мы заметили бы, что все жидкие частицы перейдут в твердое состояние. Ртуть может затвердеть, когда ее температура достигает точки замерзания. Однако при возвращении к условиям комнатной температуры ртуть недолго находится в твердом состоянии и возвращается в свою более распространенную жидкую форму.
Твердые тела обычно имеют составляющие частицы, расположенные в регулярном трехмерном массиве чередующихся положительных и отрицательных ионов, который называется кристаллом .Эффект от такого регулярного расположения частиц иногда виден макроскопически, как показано на рисунке \ (\ PageIndex {3} \). Некоторые твердые тела, особенно состоящие из больших молекул, не могут легко организовать свои частицы в такие правильные кристаллы и существуют как аморфные (буквально «бесформенные») твердые тела. Стекло — один из примеров аморфного твердого тела.
Рисунок \ (\ PageIndex {3} \): (слева) Периодическая структура кристаллической решетки кварца \ (SiO_2 \) в двух измерениях. (справа) Случайная сетевая структура стекловидного \ (SiO_2 \) в двух измерениях.Обратите внимание, что, как и в кристалле, каждый атом кремния связан с 4 атомами кислорода, а четвертый атом кислорода не виден в этой плоскости. Изображения используются с разрешения (общественное достояние).Жидкости
Если частицы вещества обладают достаточной энергией для частичного преодоления межмолекулярных взаимодействий, тогда частицы могут перемещаться друг относительно друга, оставаясь в контакте. Это описывает жидкое состояние. В жидкости частицы все еще находятся в тесном контакте, поэтому жидкости имеют определенный объем.Однако, поскольку частицы могут довольно свободно перемещаться друг относительно друга, жидкость не имеет определенной формы и принимает форму, определяемую ее контейнером.
Жидкости имеют следующие характеристики:
- Нет определенной формы (принимает форму контейнера).
- Имеет определенный объем.
- Частицы могут свободно перемещаться друг над другом, но по-прежнему притягиваются друг к другу.
Знакомая жидкость — металлическая ртуть. Меркурий — это аномалия.\ text {o} \ text {C} \) при правильном давлении мы заметили бы, что все частицы в жидком состоянии переходят в газовое состояние.
Газы
Если у частиц вещества достаточно энергии, чтобы полностью преодолеть межмолекулярные взаимодействия, тогда частицы могут отделяться друг от друга и беспорядочно перемещаться в пространстве. Это описывает состояние газа, которое мы рассмотрим более подробно в другом месте. Как и жидкости, газы не имеют определенной формы, но, в отличие от твердых тел и жидкостей, газы также не имеют определенного объема.Переход от твердого вещества к жидкости обычно не приводит к значительному изменению объема вещества. Однако переход от жидкости к газу значительно увеличивает объем вещества в 1000 и более раз. Газы имеют следующие характеристики:
- Нет определенной формы (принимает форму контейнера)
- Нет определенного объема
- Частицы движутся случайным образом с незначительным притяжением друг к другу или без него
- Сильно сжимаемый
Характеристики | Твердые вещества | Жидкости | Газы |
---|---|---|---|
форма | определенный | неопределенный | неопределенный |
объем | определенный | определенный | неопределенный |
относительная сила межмолекулярного взаимодействия | сильный | умеренный | слабый |
относительное положение частиц | в контакте и фиксируется на месте | в контакте, но не фиксируется | не в контакте, случайные позиции |
Пример \ (\ PageIndex {1} \)
Какое состояние или состояния материи описывает каждое утверждение?
- Это состояние имеет определенный объем, но не имеет определенной формы.
- Это состояние не имеет определенного объема.
- Это состояние позволяет отдельным частицам перемещаться, оставаясь в контакте.
Решение
- Это утверждение описывает жидкое состояние.
- Это заявление описывает состояние газа.
- Это утверждение описывает жидкое состояние.
Упражнение \ (\ PageIndex {1} \)
Какое состояние или состояния материи описывает каждое утверждение?
- В этом состоянии отдельные частицы находятся в фиксированном положении по отношению друг к другу.
- В этом состоянии отдельные частицы находятся далеко друг от друга в космосе.
- Это состояние имеет определенную форму.
- Ответ:
- цельный
- Ответ b:
- газ
- Ответ c:
- цельный
Сводка
- Существуют три состояния материи: твердое, жидкое и газообразное.
- Твердые тела имеют определенную форму и объем.
- Жидкости имеют определенный объем, но имеют форму емкости.
- Газы не имеют определенной формы или объема.
Материалы и авторство
Эта страница была создана на основе содержимого следующими участниками и отредактирована (тематически или широко) командой разработчиков LibreTexts в соответствии со стилем, представлением и качеством платформы:
Твердые тела, жидкости и газы — Science Learning Hub
Вода — единственное распространенное вещество, которое в природе встречается в твердом, жидком или газообразном состоянии.Твердые тела, жидкости и газы известны как состояния материи. Прежде чем мы рассмотрим, почему вещи называются твердыми телами, жидкостями или газами, нам нужно больше узнать о материи.
Материя — это все, что нас окружает.
Материя может сбивать с толку, поскольку имеет несколько значений. Мы часто слышим такие фразы, как «Что случилось?» или «Неважно». Ученые имеют другое значение для материи — материя — это все, что занимает пространство и имеет массу.
Материя состоит из крошечных частиц.Это могут быть атомы или группы атомов, называемые молекулами. Атомы похожи на отдельные блоки LEGO. Это наименьшая единица, на которую можно разбить что-либо, не делая чего-то экстремального (например, ударяя молотком по блоку LEGO или разбивая атомы в Большом адронном коллайдере). Если атомы подобны блокам LEGO, молекулы — это структуры, которые вы строите с их помощью. . Физические характеристики атомов и молекул определяют форму или состояние материи.
Solid
Прямо сейчас вы, вероятно, сидите на стуле, используя мышь или клавиатуру, лежащую на столе — все это твердые тела.Что-то обычно называют твердым, если оно может сохранять свою форму и его трудно сжать (раздавить). В большинстве твердых тел частицы плотно упакованы. Несмотря на то, что частицы заблокированы на месте и не могут двигаться или скользить друг мимо друга, они все равно немного вибрируют.
Лед — это вода в твердой форме или состоянии. Лед сохраняет форму в замороженном состоянии, даже если его вынуть из емкости. Однако лед отличается от большинства твердых тел: его молекулы менее плотно упакованы, чем в жидкой воде.Вот почему лед плавает.
Жидкость
Самый простой способ определить, является ли что-то жидким, — это задать следующий вопрос: если я попытаюсь переместить его из одного контейнера в другой (например, выливанием), будет ли оно соответствовать (принимать форму) новый контейнер?
Если вы возьмете стакан воды и нальете его в другой стакан, он явно соответствует — он приобретет форму стакана. Если вы проливаете воду, она разливается повсюду. Поскольку его нет в контейнере, он повторяет форму пола, образуя большую лужу!
В большинстве жидкостей частицы менее плотно упакованы, что дает им возможность перемещаться и скользить друг мимо друга.Хотя жидкость легче сжимать, чем твердое тело, это все еще довольно сложно — представьте, что вы пытаетесь сжать воду в замкнутом контейнере!
Примером жидкости является вода, молоко, сок и лимонад.
Узнайте больше о воде, просмотрев широкий спектр наших ресурсов по теме «Вода».
Газ
Атомы и молекулы в газах гораздо более разбросаны, чем в твердых телах или жидкостях. Они вибрируют и свободно перемещаются на высоких скоростях. Газ заполнит любую емкость, но если емкость не герметично закрыта, газ улетучится.Газ можно сжать намного легче, чем жидкость или твердое тело. (Представьте себе водолазный баллон — 600 л газа сжимается в 3-литровый баллон.) Прямо сейчас вы вдыхаете воздух — смесь газов, содержащую множество элементов, таких как кислород и азот.
Водяной пар — это газообразная форма или состояние воды. В отличие от льда или воды, водяной пар невидим. При каждом выдохе мы выдыхаем водяной пар. Мы не можем видеть водяной пар при выдохе, но если поднести очки или смартфон ко рту, мы увидим, как водяной пар конденсируется (становится жидким) на этих объектах.
Другие состояния вещества
Мы знаем о твердых телах, жидкостях и газах сотни лет, но ученые открыли и другие состояния. Одно из состояний — это плазма, которая естественным образом возникает при молнии, и мы создаем ее в люминесцентных лампах и плазменных телевизорах. Другое состояние вещества — конденсат Бозе-Эйнштейна, но это состояние возникает только при сверхнизких температурах.
Природа науки
Научные знания меняются по мере обнаружения новых свидетельств. Технологии помогают нам найти это свидетельство.Например, только в 1995 году у ученых было оборудование и средства для создания конденсата Бозе-Эйнштейна.
Определение твердого тела в химии и науке
Твердое тело — это состояние вещества, характеризующееся частицами, расположенными таким образом, что их форма и объем относительно стабильны. Составляющие твердого вещества имеют тенденцию быть упакованы вместе гораздо ближе, чем частицы в газе или жидкости. Причина, по которой твердое тело имеет жесткую форму, заключается в том, что атомы или молекулы прочно связаны химическими связями.Склеивание может образовывать либо правильную решетку (как видно на льду, металлах и кристаллах), так и аморфную форму (как видно на стекле или аморфном углероде). Твердое тело — одно из четырех основных состояний вещества, наряду с жидкостями, газами и плазмой.
Физика твердого тела и химия твердого тела — две области науки, посвященные изучению свойств и синтезу твердых тел.
Примеры твердых тел
Материя определенной формы и объема — твердая.Есть много примеров:
- Кирпич
- Пенни
- Кусок дерева
- Кусок металлического алюминия (или любого металла при комнатной температуре, кроме ртути)
- Алмаз (и большинство других кристаллов)
Примеры вещей, которые являются , а не твердыми телами, включают жидкую воду, воздух, жидкие кристаллы, газообразный водород и дым.
Классы твердых тел
Различные типы химических связей, которые соединяют частицы в твердых телах, создают характерные силы, которые можно использовать для классификации твердых тел.Ионные связи (например, в поваренной соли или NaCl) представляют собой прочные связи, которые часто приводят к кристаллическим структурам, которые могут диссоциировать с образованием ионов в воде. Ковалентные связи (например, в сахаре или сахарозе) включают обмен валентными электронами. Электроны в металлах текут из-за металлических связей. Органические соединения часто содержат ковалентные связи и взаимодействия между отдельными частями молекулы из-за сил Ван-дер-Ваальса.
Основные классы твердых тел включают:
- Минералы: Минералы — это твердые природные вещества, образованные геологическими процессами.Минерал имеет однородную структуру. Примеры включают алмаз, соли и слюду.
- Металлы: твердые металлы включают элементы (например, серебро) и сплавы (например, сталь). Металлы обычно твердые, пластичные, пластичные и отлично проводят тепло и электричество.
- Керамика: керамика — это твердое тело, состоящее из неорганических соединений, обычно оксидов. Керамика обычно бывает твердой, хрупкой и устойчивой к коррозии.
- Органические твердые вещества: К твердым органическим веществам относятся полимеры, воск, пластмассы и дерево.Большинство этих твердых тел являются тепловыми и электрическими изоляторами. Обычно они имеют более низкие температуры плавления и кипения, чем металлы или керамика.
- Композиционные материалы: Композиционные материалы — это материалы, которые содержат две или более фаз. Примером может служить пластик, содержащий углеродные волокна. Эти материалы обладают свойствами, не присущими исходным компонентам.
- Полупроводники: полупроводниковые твердые тела имеют промежуточные электрические свойства между проводниками и изоляторами. Твердые вещества могут быть чистыми элементами, соединениями или легированными материалами.Примеры включают кремний и арсенид галлия.
- Наноматериалы: Наноматериалы представляют собой крошечные твердые частицы нанометрового размера. Эти твердые вещества могут иметь очень разные физические и химические свойства от крупномасштабных версий тех же материалов. Например, наночастицы золота имеют красный цвет и плавятся при более низкой температуре, чем металлическое золото.
- Биоматериалы : Биоматериалы — это натуральные материалы, такие как коллаген и кость, которые часто способны к самосборке.