Цепочка ответственности с частичными функциями Scala

от автора

Частичные функции

В этой статье мы рассмотрим фундаментальную, и вместе с тем очень полезную фичу Scala: частичные функции.

Частичная функция (в отличие от полной) — это функция, которая определена не для всех возможных входных данных. Частичная функция g: A => B — это функция, для которой существуют некоторые значения a в области A такие, что g(a) не определена. Scala имеет хорошую поддержку частичных функций.

Цепочка ответственности

На Devoxx France 2023 Эдсон Янага (Edson Yanaga) выступил с докладом, в котором он пересмотрел паттерны проектирования GoF, используя новые возможности Java. Вот его реализация паттерна «Цепочка ответственности». По ходу доклада я подумал, что в Scala это еще проще.

Для иллюстрации возьмем пример ката FizzBuzz.

Вот реализация на языке Scala:

object FizzBuzz extends App {   val multipleOfThree: PartialFunction[Int, String] = {     case i if i % 3 == 0 => "Fizz"   }   val multipleOfFive: PartialFunction[Int, String] = {     case i if i % 5 == 0 => "Buzz"   }   val multipleOfBoth: PartialFunction[Int, String] = {     case i if i % 3 == 0 && i % 5 == 0 => "FizzBuzz"   }   val default: PartialFunction[Int, String] = {     case i => i.toString   }    val fizzBuzz = List(multipleOfBoth, multipleOfThree, multipleOfFive, default)     .reduce(_ orElse _)    (1 to 100).foreach(i => println(fizzBuzz(i))) }

Цепочка ответственности реализуется с помощью метода orElse для цепочки вызовов.

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

Ссылки


Как скрестить http4s и ZIO? Поговорим об этом 22 июня на открытом уроке, который пройдет в рамках курса «Scala-разработчик». На этой встрече мы:
— узнаем oб основных компонентах REST-сервиса;
— сформируем представление о http4s (http-библиотека) и ZIO (библиотека асинхронного функционального эффекта);
— попрактикуемся в создании полноценного простого http-сервиса (сервер, эндпоинты, логика).

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


ссылка на оригинал статьи https://habr.com/ru/companies/otus/articles/741704/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *