Pull to refresh
32
0

Разработчик

Send message

Неявный вывод в Scala

Reading time3 min
Views2.1K

Многие начинающие и не очень Scala разработчики принимают implicits как умеренно полезную возможность. Использование обычно ограничивается передачей ExecutionContext  во Future. Другие же избегают неявного и считают возможность вредной.

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

Читать далее
Total votes 5: ↑5 and ↓0+5
Comments0

Еще раз про try и Try

Reading time4 min
Views6K

По вопросу обработки ошибок уже множество статей написано и все равно возникают вопросы и споры. Я не стану рассматривать все способы и языки, но хотел бы остановится на исключениях в JVM и сравнить их с функциональным подходом (`Try`/`Either`) на примере Scala.

Эта статья так же не про сравнение ФП с ООП – совсем не обязательно бросать одно ради другого. Но посмотреть и сравнить всегда полезно.

Читать далее
Total votes 7: ↑6 and ↓1+5
Comments24

SOLID == ООП?

Reading time5 min
Views21K

Наверное я не ошибусь, если скажу, что чаще всего на собеседованиях спрашивают о SOLID принципах. Технологии, языки и фреймворки разные, но принципы написания кода в целом похожи: SOLID, KISS, DRY, YAGNI, GRASP и подобные стоит знать всем.


В современной индустрии уже много десятков лет доминирует парадигма ООП и у многих разработчиков складывается впечатление, что она лучшая или и того хуже — единственная. На эту тему есть прекрасное видео Why Isn't Functional Programming the Norm? про развитие языков/парадигм и корни их популярности.


SOLID изначально были описаны Робертом Мартином для ООП и многими воспринимаются как относящиеся только к ООП, даже википедия говорит нам об этом, давайте же рассмотрим так ли эти принципы привязаны к ООП?

Читать дальше →
Total votes 17: ↑14 and ↓3+11
Comments93

Functional FizzBuzz на Scala

Reading time3 min
Views5.5K

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


Предлагаю вашему вниманию еще один вариант, не совсем пятничный, а скорее субботний: FizzBuzz на Scala, functional style.

Читать дальше →
Total votes 17: ↑15 and ↓2+13
Comments14

Функциональный подход к транзакциям на Scala или пишем свою полезную монаду

Reading time8 min
Views4.2K

Если вы работаете с одной базой данных которая поддерживает транзакции вы даже не задумываетесь о консистентности — база все делает за вас. Если же у вас несколько баз, распределенная система или даже к примеру MongoDB до 4 версии — все не так радужно.


Рассмотрим пример — мы хотим сохранить файл в хранилище и добавить ссылку на него в два документа. Конечно же мы хотим атомарности — либо файл сохранен и добавлен в документы либо ни то ни другое (тут и далее используется cats-effects IO):


saveDataToFile(data) // (1)
  .flatMap { file =>
    addFileRef(documentId, file) // (2)
      .flatMap { result =>
        addFileRef(fileRegistry, file) // (3)
          .flatMap { result =>
            ??? // (4, 5, ...)
          }
          .handleErrorWith { error =>
            // revert (2)
            removeFileRef(documentId, file).attempt >> IO.raiseError(error)
          }
      }
      .handleErrorWith { error =>
        // revert (1)
        removeFile(file).attempt >> IO.raiseError(error)
      }
  }

Уже непросто? Легко представить как количество операций растет и образуется Pyramid of doom.


Но мы же программисты! Давайте обобщим проблему и напишем код, который позволит избежать ненужной сложности и возможных ошибок.

Читать дальше →
Total votes 17: ↑17 and ↓0+17
Comments1

Как обрабатывать ошибки на JVM быстрее

Reading time5 min
Views5.5K

Существуют различные способы обработки ошибок в языках программирования:


  • стандартные для многих языков исключения (Java, Scala и прочий JVM, python и многие другие)
  • коды статуса или флаги (Go, bash)
  • различные алгебраические структуры данных, значениями которых могут быть как успешные результаты так и описания ошибок (Scala, haskell и другие функциональные языки)

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


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


Сразу отбросим использование кодов и флагов, так как этот подход не принят в JVM языках и по моему мнению слишком подвержен ошибкам (прошу прощения за каламбур). Поэтому будем сравнивать исключения и разные виды АТД. Кроме того АТД можно рассматривать как использование кодов ошибок в функциональном стиле.


UPDATE: к сравнению добавлены исключения без стек-трейсов

Читать дальше →
Total votes 15: ↑15 and ↓0+15
Comments17

Функции высших порядков и монады для PHP`шников

Reading time10 min
Views23K

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


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


$jNumber = _do(function() {
    $number  = yield literal('-')->orElse( literal('+') )->orElse( just('') );
    $number .= yield takeOf('[0-9]')->onlyIf( notEmpty() );
    if ( yield literal('.')->orElse( just(false) ) ) {
        $number .= '.'. yield takeOf('[0-9]');
    }
    return +$number;
});

Кроме собственно функционального подхода можно обратить внимание на использование классов для создания DSL-подобного синтаксиса и на использование генераторов для упрощения синтаксиса комбинаторов.


UPDATE само-собой парсинг JSON уже давно решенная задача и конечно готовая и протестированная функция на C будет работать лучше. Статья использует эту задачу как пример для объяснения функционального подхода. Так же не пропагандируется использование именно такого кода в продакшене, каждый может почерпнуть себе какие-то идеи, которые могут упростить код и жизнь.


Полный код находится на github.

Читать дальше →
Total votes 24: ↑23 and ↓1+22
Comments45

Еще одна история про домашний сервер, или операция «silence»

Reading time14 min
Views52K
Добрый день, хабраюзеры!

imageНаверняка каждый разработчик, рано или поздно, сталкивается с проблемой тестового окружения. Не очень удобно держать ПК включенным 24х7, да еще и заваливать его софтом для экспериментов под завязку. С другой стороны найти хостинг по собственному вкусу, да еще и не дорогой — тоже задача не из легких. Что же делать? Выход есть — развернуть песочницу дома. Как я убедился, об этом детальнее ниже, это не дорого, это удобно и очень увлекательно.
Подробности
Total votes 50: ↑36 and ↓14+22
Comments52

Динамическое программирование и ленивые вычисления

Reading time4 min
Views5.1K
Динамическое программирование является довольно важным подходом в решении многих сложных задач, основанным на разбиении задачи на подзадачи и решении этих подзадач единожды, даже если они являются частью нескольких других подзадач. Перед людьми, которые только начинают овладевать функциональным программированием часто возникает вопрос: «как избежать повторного решения подзадач, если не использовать переменные для сохранения результатов?». В этом вопросе одна особенность функционального программирования — отсутствие переменных — мешает кешировать результаты решения подзадач, но другая особенность поможет — ленивые вычисления.
Читать дальше →
Total votes 26: ↑26 and ↓0+26
Comments14

Решение загадки Эйнштейна на Haskell

Reading time7 min
Views7.6K

Прелюдия

Albert_Einstein
Не так давно я прочитал на Хабре статью, которая напомнила мне про интересную головоломку, которую называют «Загадкой Эйнштейна» или «Zebra puzzle». Вероятно многие из вас решали эту задачку на листке бумаги и гордились тем, что входят в несколько процентов населения земли, способных на это.

Прочитав статью, я задумался над программным решением этой задачи. Подход, приведенный в статье был интересен и вполне оправдал название блога, но показался мне не совсем понятным. В данный момент я интересуюсь языком программирования Haskell, который прекрасно подходит и сам по себе для разминки мозгов, решение же головоломки на нем показалось мне прекрасным вызовом.
Читать дальше →
Total votes 47: ↑44 and ↓3+41
Comments39

На кого ориентироваться, разрабатывая сайт

Reading time2 min
Views534

Разрабатываем сайт?


Итак, вы решили разработать супер-мега-крутой сайт для русскоязычной аудитории. Вы определились с тематикой, дизайном и прочая-прочая. Но вот интересный вопрос — под какие браузеры писать, использовать ли JavaScript и Cookies и т.д. Конечно же для этого есть статистика.
Вот решил сделать небольшую выборку статистики за последние несколько месяцев, любезно предоставленную SpyLog'ом
Читать дальше →
Total votes 15: ↑9 and ↓6+3
Comments17

Разделение вида и контроллера

Reading time2 min
Views926

Что это?


Думаю многие из программистов понимают необходимость разделять контроллеры (или, как еще говорят, бизнес-логику) от вида (или логики отображения). Это упрощает поддержку, редизайн и реализацию скинов. Реализаций этого безобразия существует огромное количество и я хотел бы и свои пять копеек вставить :)
Вы можете найти огромное количество топиков на эту тему, но в основном они касаются «вида», точнее всяческих шаблонизаторов. Я не буду сейчас об этом, иначе это превратится в очередной холивар. Темя этой статьи — контроллер, а точнее моя его реализация, хотя отображения это тоже касается :).
Если где-то есть нечто похожее буду благодарен за указание источников.
Читать дальше →
Total votes 17: ↑6 and ↓11-5
Comments18

Идеальный WYSIWYG редактор

Reading time1 min
Views1.9K
Практически любому сайту в наше время не обойтись без формы ввода всяческих статей, комментариев и прочего контента. Естественно хочеться, чтобы контент был богатый (форматирование, ссылки, таблицы, картинки, даже видео) и в сети давно уже появилось безумное множество всяческих яваскриптовых он-лайн редакторов, но все они обеспечивают сходный функционал (одни более, другие менее, но принцип один).
Но все они похожи на WordPad. Проблема в том, что в основном они ориентированы на визуальное а не смысловое оформление теста да и юзабилити пока еще не на высоте.
Вот не так давно я начал пользоваться MS Word'ом 2007, там есть такая фича как панель быстрого доступа к стилям — там сразу видно как выглядят стили и понятно для чего они нужны (Или как в старом ворде — в панели стилей).
Мне кажется было бы неплохо сделать такой редактор, чтобы сбоку, например, была панель стилей с их визуальным отображением, причем чтобы там были разделы семантические — например заголовки, цитаты и т.д. Тогда пользователь будет сразу видеть чем он располагает, причем визуально информация усваивается быстрее чем просто текстом.

В заключение


Хотелось бы также узнать какие javascript WYSIWYG редакторы вы предпочитаете.

UPD


Набрел тут на сравнительную таблицу некоторых редакторов. Может кому будет интересно ;)
Total votes 13: ↑11 and ↓2+9
Comments30

PHP: производлительность шаблонов

Reading time3 min
Views1K

О чем это я?


Ах да, я хотел вам рассказать о небольшом тесте, который я проводил на досуге. Дело в том, что я люблю изобретать велосипеды (не бейте меня ногами за это невинное хобби). Поэтому в бытность программистом-похапешником я думал над реализацией шаблонизатора (а кто не думал — пусть кинет в меня камнем).
Если вы хотите сравнения производительности известных шаблонизаторов — простите, в другой раз
Темой этой статьи является исследование производительности некоторых частных случаев использования простых шаблонов
Читать дальше →
Total votes 18: ↑11 and ↓7+4
Comments20

Почему я не люблю PHP

Reading time1 min
Views971

Дисклеймер


Заранее хочу предупредить что это не тема для очередного холивара — я работаю на PHP уже довольно давно и довольно успешно. Но все это только потому что этот язык очень распространен да и наверное по привычке ;) Но очень часто бывают моменты в моей практике когда понимаешь, что язык этот далеко не совершенен.
Так что ждем с нетерпением PHP6 :)
Читать дальше →
Total votes 25: ↑16 and ↓9+7
Comments40

Information

Rating
Does not participate
Location
Украина
Date of birth
Registered
Activity