Пора положить конец спагетти-коду.

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

1. Используйте TypeScript

Для некоторых это может вызвать раздражение, но TypeScript устраняет многие проблемы, которые в некоторых случаях делают JavaScript небезопасным языком. Это также проясняет намерения вашего кода. Давайте посмотрим на пример JavaScript простого компонента React People:

Здесь мы видим, что People принимает peopleList в качестве реквизита, который представляет собой список объектов, каждый из которых представляет человека, который будет отображаться как <ListItem />. Все это нормально, но что, если собственность отсутствует у кого-то из людей? Что делать, если человек имеет undefined в качестве профессии или зарплаты? Многие из вас могут подумать, что мы можем просто использовать prop-types, чтобы справиться с этим, но, на мой взгляд, TypeScript предоставляет более элегантное решение. Давайте посмотрим на тот же People компонент, написанный на TypeScript:

В этом примере мы определили интерфейс Person с необязательными свойствами (, обозначенными?), Чтобы сообщить компилятору, что человек в peopleList может содержать только подмножество свойств в Person. Мы также определили PeopleProps интерфейс, который определяет тип опоры, которую People должен получить, то есть массив Person. В результате компонент People стал более гибким и надежным.

2. Используйте IIFE

Если вы знакомы с выражениями мгновенно вызываемых функций (IIFE), то вы определенно знаете, насколько они могут быть полезны как простой способ объединить два оператора в один. Допустим, вы хотели инициализировать массив некоторыми внешними данными:

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

Здесь мы экономим несколько строк, назначая dataList анонимной функции, которая вызывается немедленно.

3. Разделение проблем

Всегда важно разделять проблемы функциональности в кодовой базе, особенно при работе с проектами возрастающей сложности. Обычно не идеально, когда функция выполняет несколько задач одновременно, особенно если они не связаны друг с другом. Давайте проанализируем плохой пример React компонента Example, который зависит от некоторых внешних данных API:

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

Теперь, когда вся логика для вызова API находится в этом настраиваемом хуке, наш компонент Example теперь выглядит так:

С usePost абстрагированием логики почтового запроса компонент Example теперь отвечает только за отображение данных. Благодаря этому изменению кодовая база стала намного более удобной в обслуживании.

Если вы сделали это здесь, спасибо за чтение! Надеюсь, вы нашли этот пост поучительным. Наслаждайтесь остатком дня.

Больше контента на plainenglish.io