Как реактивное программирование помогает писать лучший код

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

То, что когда-то считалось стандартной практикой, часто заменяется другими методологиями и технологиями.

Из-за этого вы всегда должны быть осторожны, чтобы не запрыгнуть на подножку слишком быстро. Тот факт, что многие люди используют определенную практику программирования или новый модный инструмент, не означает, что вы должны следовать за толпой. Приняв новую практику, сначала постарайтесь ее тщательно изучить. Убедитесь, что вы понимаете проблему, которую он решает, и все новые проблемы, которые он создает.



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

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

Делает ваш код более читаемым

Все мы знаем о кошмаре закрытия в Swift. Из-за природы мобильной разработки асинхронные процессы необходимо запускать постоянно. Раньше это делалось в основном за счет закрытия. Некоторые из вас могут по-прежнему использовать для этого в основном замыкания, и это нормально.

Но как только вы начинаете иметь многовложенные замыкания. Кошмар начинается. Чтение и изменение вложенных замыканий - это боль. Боль, которую мы все испытали.

Так как же реактивное программирование помогает уменьшить эту боль?

С помощью таких функций, как map, flatMap и flatMapLatest, вы можете связывать наблюдаемые объекты. Таким образом, вы можете обрабатывать запросы одновременно без сложного для чтения синтаксиса вложенного закрытия.

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

«Действительно, соотношение времени, затрачиваемого на чтение и на написание [кода], намного превышает 10: 1. Мы постоянно читаем старый код в рамках усилий по написанию нового кода. … [Следовательно,] облегчая чтение, легче писать ».

- Роберт С. Мартин, Чистый код: руководство по созданию гибкого программного обеспечения

Поэтому очень полезно тратить время на упрощение чтения и понимания кода.

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

Помогает при обработке событий

Распространенный сценарий в разработке для iOS - это необходимость реагировать на события, исходящие из разных частей приложения. Например, возможно, кто-то изменил свое имя пользователя в SettingsViewController, и нам нужно обновить его имя пользователя в их ProfileViewController.

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

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

Синтаксис будет примерно таким.

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

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

Если вы рассматриваете возможность связывания, вы можете использовать протокол и получить доступ к теме через протокол. Что-то вроде этого.



Делает код более модульным

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

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

У вас могут быть контроллеры, которым требуется только наблюдатель определенного типа. Затем вы можете отправить любой сетевой запрос этому контроллеру, пока наблюдатель излучает нужный тип. Я использую это все время, когда у меня есть многоразовые контроллеры, отображающие контент для пользователя.

Например, что-то вроде Instagram, где у вас есть объект, такой как объект Post, и у вас есть один экран, отвечающий за отображение объектов Post для пользователя. Возможно, вы захотите отобразить сообщения текущего пользователя или другого пользователя. Или сообщения, которые понравились текущему пользователю. Или сообщения тех, на кого подписан пользователь.

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

Этот фрагмент кода должен дать вам общее представление о том, что я имею в виду.

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

Последние мысли

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

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

Цель вашей кодовой базы - не быть красивым, а следовать хорошим принципам дизайна. Если разработчикам легче читать ваш код, вы сократите технический долг за счет уменьшения когнитивной перегрузки. (Мы напишем о когнитивной перегрузке в будущей статье.)

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

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



Если вам понравилась эта статья, то похлопайте по ней. Некоторые люди не знают, что по одной и той же статье можно хлопать до 50 раз. Попытайся!