Giter VIP home page Giter VIP logo

elixir-basic-patterns's Introduction

Стиль

Говнокод

Условный пример: bad_looking_code.ex. Код, выглядящий так даже издалека, всегда плох. В нем:

  • смешаны разные уровни абстракции;
  • копипаста;
  • перегрузка обязанностей;
  • непрозрачное переопредееление переменных;
  • ...

В таком коде всегда будут плодиться ошибки.

Возврат Ok/Error

Возврат {:ok, ok_result} и {:error, error} -- это стандарт. Положительный и отрицательный результаты должны легко матчиться для возможности просто использовать эмуляцию монады Maybe или Either через with.

Примеры: error_return.ex.

Exceptions vs errors

Не стоит использовать Exceptions для контроля бизнес логики. Это усложняет тип функций, лишает возможности его описать.

Exceptions -- это возможность нормально сообщить, почему код все бросает и падает.

exceptions.ex

Dependency Injection

Два фетчера:

В первом изпользуемый HTTP клиент захардкожен, во втором передается.

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

Тест второго модуля специфицирует реальный контракт с модулем.

Dependency Injection времени

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

Для некритичных к идеальной точности таймеров удобно использовать tick, посылку текущего времени самому себе с указанным интервалом: rotating_file_writer.ex.

Тогда state таймеров превращается в обыкновенный конечный автомат, который легко тестировать извне.

Пример: smpp_timers.ex -- сложная композиция из четырех таймеров SMPP. В oserl реализована с багами через установку и отмену таймеров.

Простейшие паттерны/антипаттерны параллельности

  • Антипаттерн: синхронные операции в "общем" GenServer: good_fetcher.ex. При глобальном использовании представляет из себя бутылочное горлышко.
  • Антипаттерн: возможная неявная синхронизация во внешней либе (HTTPoison) даже при наличии пула. Бутылочное горлышко может быть спрятано и во внешней либе.

Организация последовательной обработки

  • chain_flow_procs.ex -- Плохо. Event кидается от процесса к процессу. Неконтролируемая нагрузка, низкая/неконтролируемая параллелность, неконтролируемая емкость системы.
  • chain_flow_funs.ex -- Не так плохо, но тоже плохо. Event кидается из функции в функцию, сложно отслеживать и расширять поток.
  • direct_flow.ex -- Хорошо. Свой поток выполнения для каждого Event'а, неважно, что из себя представляют обработчики, можно легко измерить статистику по каждой стадии обработки, легко управлять стадиями.

elixir-basic-patterns's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.