Уровни абстракции в языках высокого уровня - это способы организации информации и операций в программировании. Если мыслить масштабно, не на уровне конкретного языка, то можно четко выделить уровни.
Конкретные примеры уровней абстракции в коде включают в себя:
- Машинный код и язык ассемблера - это низкий уровень абстракции, который представляет команды, понятные компьютеру, и их мнемоники, более понятные для человека;
- Языки высокого уровня - такие, как Python или JavaScript, предлагают более абстрактное представление кода, что делает его более понятным и легким для написания;
- Язык SQL и Database Abstraction Layer (DAL) - предоставляют абстракцию базы данных, позволяя программистам работать с базами данных без необходимости знать специфические детали их реализации;
- Принципы SOLID - предоставляют абстракции для организации кода, такие как Dependency Inversion Principle (DIP), которые помогают создавать более гибкие и расширяемые системы.
Каждый из этих уровней абстракции предоставляет разные инструменты и возможности для программиста, влияя на удобство написания кода, его читаемость и производительность. Но нас сегодня интересует не такое масштабное представление, а более конкретное.
В частности нас интересует 2 уровень, т.е. языки программирования высокого уровня. Предлагаю разбирать на примере JavaScript. Если быть точнее, то какие бывают и как выглядят уровни абстракции относительно языка JavaScript.
Уровни абстракции в JavaScript могут быть проиллюстрированы следующим образом:
- Машинный код и язык ассемблера (низкий уровень): JavaScript, как и другие языки программирования, в конечном итоге выполняется на уровне машинного кода. Однако, разработчики JavaScript редко взаимодействуют с машинным кодом напрямую, но иногда бывает, например, можно использовать встроенные функции JavaScript для выполнения кода на Assembler, например, через WebAssembly;
- Языки высокого уровня (текущий уровень): JavaScript сам по себе является языком высокого уровня, следовательно, с точки зрения программирования на нем программист находится на текущем уровне абстракции;
- Библиотеки и фреймворки (высокий уровень): написание кода на JavaScript также включает использование библиотек и фреймворков, такие, как: React, Angular или Vue.js. Эти инструменты предоставляют дополнительные уровни абстракции для управления пользовательским интерфейсом и другими аспектами разработки веб-приложений. Этот уровень с точки зрения программиста, который пишет программу на JavaScript является следующим по уровню абстракции, поэтому библиотеки и фреймворки относятся к высокому уровню;
- Архитектурные принципы и паттерны (сверхвысокий уровень): Применение архитектурных принципов, таких как SOLID, и использование паттернов проектирования, таких как MVC (Model-View-Controller), также добавляют уровни абстракции к разработке на JavaScript, помогая организовать код и упростить его поддержку. Это самый высокий уровень абстракции относительно программирования на языке JavaScript.
И в этот момент вы думаете, а зачем мне эта информация? Я ведь просто пишу код и не задумываюсь об этом. Так-то оно так, но в этом и состоит проблема плохо читаемого кода.
Дело в том, что код мы пишем один раз, а читаем его много раз и не одни. А для того, чтобы код был чистым, в первую очередь необходимо следить за уровнями абстракции в вашем коде. На данный момент мы добрались до абстракций на уровне языка JavaScript, а теперь перейдем к более частному случаю, это программирование на уровне функции. Давай разберемся, а какие могут быть уровни абстракции, если вы пишете функцию.
Список уровней абстракции в функциях на JavaScript включает в себя:
- Простые функции, которые выполняют конкретную задачу без использования сложных алгоритмов или внешних библиотек;
2. Функции, использующие встроенные методы и стандартные библиотеки JavaScript для выполнения более сложных операций, таких как работа с массивами, объектами, математическими вычислениями и т. д;
3. Функции, взаимодействующие с внешними библиотеками или фреймворками для выполнения расширенных задач, таких как работа с сетью, базами данных, пользовательским интерфейсом и другими аспектами разработки.
Наверняка вы опять задаете себе вопрос “Ну узнал я эти уровни абстракции, а как мне это может помочь писать чистый код?”. Сложно сказать, что это знание позволит писать полностью чистый код ваших приложений, но писать правильный и чистый код функций, эти знания помогут однозначно. Просто вновь полученные знания нужно обрамить правилами написания чистых функций и тогда все станет понятным.
Правильно написанная функцию предполагает выполнение одной операции. Да, вы прочитали все верно. Функция должна выполнять одну операцию. Речь конечно же не идет об одной строчке кода или использовании одной команды в функции.
Речь идет о том, что все команды функции должны находиться на одном уровне абстракции и ни при каких условиях не допускать их смешивания. Ниже приведу вариант функции, которая использует смешанные уровни абстракции и это абсолютно плохо.
Если глядя на эту функцию вы задаетесь вопросом “А что тут такого? Нормальная функция”.
Вопрос не в нормальности, а в её читаемости. Напоминаю, все команды функции должны состоять из одного уровня абстракции. В таком случае, читать функцию будет гораздо удобнее всем, кто будет с ней работать. Главный лозунг чистого кода - это его четкость, что означает устранение лишнего. Другими словами один уровень абстракции является четким, а смешанный предполагает разные примеси, которые в дальнейшем будут разрастаться.
В результате эту функцию можно разбить на три разные, где в каждой функции будет использоваться один уровень абстракции, а в этой функции, т.е. в sendMessageAndResult вызывать созданные функции. В результате в этой функции будет использоваться лишь второй уровень абстракции. Вот пример:
Так у нас получилось, что функция первого уровня и третьего абстрактного уровня вызываются из функции sendMessageAndResul. Процесс вызова этих функций является вторым абстрактным уровнем, т.к. метод reduce и созданные вами функции находятся на одном уровне абстракции.
Пиши чистый код и подписывайся на канал. Спасибо за прочтение!