Hexlet 2-3 Flashcards
Модули 2 и 3
Зачем нужны типы ?
В общем для защиты программы от трудноотловимых ошибок.
Типы определяют две вещи:
- возможные (допустимые) значения.
- набор операций, которые можно выполнять над этим типом.
Неизменяемость примитивных типов.
Неизменяемость примитивных типов важна по многим причинам, ключевая - производительность.
Примитивные типы в JS поменять нельзя, а заменить значение переменной - без проблем.
Слабая типизация.
JS - это язык со слабой типизацией. Он знает о существовании разных типов, но относится к их использованию не очень строго, пытаясь, преобразовать информацию, когда это кажется разумным.
Поэтому как пример возможные ситуации складывание строки с числом.
В строгой типизации такое не прокатит.
Детерминированная функция.
Преимущества детерминированной функции.
Функция называется детерминированной тогда, когда для одних и тех же входных параметров она возвращает один и тот же результат.
Детерминированные функции удобны в работе, их легко оптимизировать, легко тестировать.
Так же стоит отметить, что если функция зависит от глобальных переменных или переменных окружения, она перестает быть детерминированной, так как эти значения в любой момент могут поменяться.
Побочный эффект.
Побочным эффектом называют действия, которые изменяют внешнее окружение (среду выполнения). К таким действия относятся любые сетевые взаимодействия, взаимодействия с файловой системой, вывод информации на экран или печать на принтере и так далее.
Кроме того, побочными эффектами считаются изменения внешних переменных (глобальных) или входных параметров, в случае если они переданы по ссылке.
Такие функции сложно тестировать и делать надежными.
Что такое стандартная библиотека ?
Набор функций. которые поставляются вместе с JS.
Сокращенная запись стрелочной функции.
Для это опускаются {} скобки и тогда не нужно писать return.
const sum = (a, b) => a + b;
Какая функция может называться предикатом ?
Варианты именования.
Функция может считаться предикатом только если она возвращает boolean.
isText;
hasText;
canText.
Какие значения при преобразовании будут false, а какие true.
0, ‘’, undefined, NaN, null - false;
Все остальное будет true.
Разница между постфиксной и префиксной нотации при использовании инкремента и декремента.
При использовании префиксной нотации сначала происходит изменение переменной, а потом возврат. При использовании постфиксной нотации - наоборот: можно считать, что сначала происходит возврат, а потом изменение переменной.
Почему конкатенация строк в цикле - это плохая идея ?
В большинстве языков это приводит к повышенному потреблению памяти.
Поэтому такую операцию лучше всего делать через массив и приведение этого массива к строке.
Что такое структура данных ?
Какие понятия стоит разделать, когда мы говорим про структуру данных ?
Структура данных - это конкретный способ хранения и организации данных.
Стоит разделять три понятия:
- Структура данных;
- Конкретный тип данных;
- Абстрактный тип данных.
Что такое объект ?
Объект - это тип данный в js, с помощью которого представляют связанный набор данных.
Печать на экран объекта, у которого есть другие объекты на глубине больше второго уровня.
В console.log() встроено одно ограничение. Если в объекте есть другие объекты глубже второго уровня, то при выводе на экран отобразиться вместо них [Object] или [Array].
Чтобы обойти это можно воспользоваться JSON.
Стандарты именования.
Функция - глагол;
Переменная - существительное;
Предикат - is, has, can.
Количество - сущность + count.
Самый простой способ клонирования объекта.
В JS нет встроенной функции для выполнения клонирования, но его можно эмулировать с помощью Object.assign(). Для этого достаточно первым параметром передать пустой объект, а вторым тот, который нужно клонировать.
Самый простой способ клонирования объекта.
Альтернативный способ клонирования.
В JS нет встроенной функции для выполнения клонирования, но его можно эмулировать с помощью Object.assign(). Для этого достаточно первым параметром передать пустой объект, а вторым тот, который нужно клонировать.
Альтернативным способом клонирования является оператор spread.
Он выполняет простое поверхностное копирование.
const copyOfUser = { …user };
Чистая функция.
Чистая функция - это детерминировання функция, которая не производит побочных эффектов.
CQS
Command-qeury Separation - принцип программирования, изобретенный Бертраном Мейером, создателем языка Eiffel. Соглано этому принципу, каждая фукнция является либо командой, которая выполняет действие (action), либо запросом (query), который извлекает данные.
Команда всегда связана с выполнение побочных эффектов, а чистые функции возможны только для запросов.
Что проиходит с аргументами при вызове функции.
Значение аргумента присваивается параметру функции.
Это неявное присвоение.
Объект первого рода (или класса).
Объекты первого рода - это элементы, которые могут быть переданы в функции, возвращены из функций и присвоены переменным (или константам).
К таким элементам относятся любые данные, в том числе функции.
Функции высшего порядка.
Функции высшего порядка - это функции, которые либо принимают, либо возвращают другие функции, либо делают все сразу.
Разница итеративного и рекурсивного процессов.
Суть рекурсивного процесса в откладывании вычислений до самого конца, то есть пока мы не дойдем до базового случая.
Суть итеративного вычисления не откладывать вычисления на потом, а делать прямо сейчас и здесь.
Итеративный процесс намного эффективнее, но он более усложненный.
За какие тесты отвечают программисты.
Как принято делить эти тесты по степени изолированности.
Программисты, в первую очередь, отвечают за функциональные тесты. Эти тесты проверяют, что код выполняет свою прямую задачу с точки зрения пользователей программы.
По степени изолированности тестируемых частей кода функциональные тесты принято делить на:
* Модульные;
* Интеграционные;
* Системные.
Что проверяют тесты ?
Как и где хранят тесты ?
Тесты проверяют, что код (или приложение) работает корректно. И не заботятся о том, как конкретно написан код, который они проверяют.
В коде тесты, как правило, складываются в специальную директорию в корне проекта, обычно это директория tests.
Утверждения в тестах.
Каждую проверку, которую пишет программист, в тестировании принято называть утверждением (assert).
Утверждения - это ключевая чать тестов, которые проверяют функциональность тестов.
В самом простом случае, утврежденя проверяются через цикл и генерацию исключения.
Но есть библиотека assert встроенная в Node.js, которая помогает писать более простые тесты. Вся дальнейшая информация по работе с библиотекой в официальной документации.
Так же есть библиотека power-assert, которая обладает подробным выводом об ошибках. Работа с ней полностью совпадает со встроенной библиотекой.
Но для интеграция потребтуются дополнительные инструменты описанные в документации.
Известный фреймворк тестирования в JS.
Самый популярный фреймворк тестирования в JS - это Jest.
Он отлично структурирует и оптимизирует тесты.
Так же в его состав идут матчеры, под разные проверки.
С разновидностью матчеров можно ознакомиться в официальной документации библиотки.
Так же немаловажно понимать работу с хуками.