Перейти к содержанию

Думаем как Solid

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

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

1. Декларативное программирование

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

Императивное программирование объясняет компьютеру, как сделать что-то шаг за шагом. Это все равно, что сказать кому-то, как приготовить омлет: "Сначала возьмите два яйца. Затем взбейте яйца в миске вилкой. Растопите немного масла на сковороде, затем добавьте яйца". Вы даете конкретные инструкции по приготовлению омлета.

Давайте кратко рассмотрим каждый из этих подходов.

Декларативный

1
2
let numbers = [1, 2, 3, 4, 5];
let double = numbers.map((value, i) => value * 2);

В приведенном выше коде мы имеем массив чисел numbers. Затем с помощью функции map мы создаем новый массив double, содержащий значения numbers, умноженные на 2.

Функция map является декларативной функцией, поскольку она позволяет указать преобразование, которое будет применено к каждому элементу массива, не указывая при этом, как это преобразование будет реализовано.

Императивный

1
2
3
4
5
6
let numbers = [1, 2, 3, 4, 5];
let double = [];

for (let i = 0; i < numbers.length; i++) {
    double.push(numbers[i] * 2);
}

В приведенном выше коде мы используем цикл for для поочередного перебора всех элементов массива. Внутри цикла мы используем метод push для добавления результата удвоения каждого числа в новый массив double.

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

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

2. Исчезающие компоненты

Без учета обновлений структурировать компоненты достаточно сложно. Обновления в Solid обрабатываются независимо от компонентов. Функции компонентов вызываются только один раз, после чего исчезают. Компоненты существуют для организации кода, а не для работы с обновлениями или рендерингом. Вот краткая диаграмма того, как выглядит этот процесс:

Визуальное представление шагов, предпринимаемых Solid при обновлении состояния Визуальное представление шагов, предпринимаемых Solid при обновлении состояния

3. Разделение чтения и записи

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

Solid делает это с помощью реализации своих примитивов. Примерами таких примитивов являются createStore, createSignal и другие.

Рассмотрим пример того, что мы понимаем под разграничением чтения и записи.

1
2
3
4
5
6
7
const [name, setName] = createSignal('');

const valueOfName = name(); // 👈 getting

function setValueOfName(text) {
    setName(text); // 👈 setting
}

В приведенном выше фрагменте кода мы используем один из примитивов Solids - createSignal. Вкратце, вызов этого примитива создает реактивное значение, а в ответ на вызов этого примитива возвращаются два параметра: геттер и сеттер. Обратите внимание, что name (геттер) отделен от setName (сеттер). Это лишь один из способов, которым Solid разделяет вещи.

4. Простота лучше, чем легкость

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

Ссылки

Комментарии