Как стать автором
Обновить
-1
0
Артём @arte0s

Программист

Отправить сообщение

Почему наследование всегда было бессмысленным

Время на прочтение4 мин
Количество просмотров31K
Есть три типа наследования.

  1. Онтологическое наследование указывает на специализацию: вот эта штука — специфическая разновидность той штуки (футбольный мяч — это сфера и у неё такой-то радиус).
  2. Наследование абстрактного типа данных указывает на замещение: у этой штуки такие же свойства, как у той штуки, и такое-то поведение (это принцип подстановки Барбары Лисков).
  3. Наследование реализации связано с совместным использованием кода: эта штука принимает некоторые свойства той штуки и переопределяет или дополняет их таким-то образом. Наследование в моей статье «О наследовании» именно такого и только такого типа.

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

Часто для наследования в ООП приводят контрпример отношений между квадратом и прямоугольником. Геометрически квадрат — это специализация прямоугольника: все квадраты — прямоугольники, но не все прямоугольники — квадраты. Все s в классе «Квадрат» являются прямоугольниками s, у которых длина равна ширине. Но в иерархии типов это отношение обратное: вы можете использовать прямоугольник везде, где используется квадрат (указав прямоугольник с одинаковой шириной и высотой), но нельзя использовать квадрат везде, где используется прямоугольник (например, вы не можете изменить длину и ширину).
Читать дальше →
Всего голосов 51: ↑43 и ↓8+35
Комментарии65

Ленивые функции в JavaScript

Время на прочтение3 мин
Количество просмотров12K

Привет!


Подумал я тут рассказать вам о том, как в JavaScript с помощью библиотеки Fluture можно создавать и использовать ленивые функции. Это будет краткий обзор на то, как создавать функции, как обрабатывать ошибки и чуть-чуть про параллелизм. Функциональным программированием мозги парить не буду! Обещаю!

Читать дальше →
Всего голосов 16: ↑12 и ↓4+8
Комментарии41

Жаргон функционального программирования

Время на прочтение10 мин
Количество просмотров93K


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


В примерах используется JavaScript ES2015). (Почему JavaScript?)


Работа над материалом продолжается; присылайте свои пулл-реквесты в оригинальный репозиторий на английском языке.


В документе используются термины из спецификации Fantasy Land spec по мере необходимости.


Arity (арность)


Количество аргументов функции. От слов унарный, бинарный, тернарный (unary, binary, ternary) и так далее. Это необычное слово, потому что состоит из двух суффиксов: "-ary" и "-ity.". Сложение, к примеру, принимает два аргумента, поэтому это бинарная функция, или функция, у которой арность равна двум. Иногда используют термин "диадный" (dyadic), если предпочитают греческие корни вместо латинских. Функция, которая принимает произвольное количество аргументов называется, соответственно, вариативной (variadic). Но бинарная функция может принимать два и только два аргумента, без учета каррирования или частичного применения.

Читать дальше →
Всего голосов 91: ↑87 и ↓4+83
Комментарии113

Эти токсичные, токсичные собеседования

Время на прочтение8 мин
Количество просмотров104K


Всё началось, когда автор Ruby on Rails признался миру:

Всего голосов 205: ↑197 и ↓8+189
Комментарии734

Элегантная обработка ошибок в JavaScript с помощью монады Either

Время на прочтение18 мин
Количество просмотров23K
Давайте немного поговорим о том, как мы обрабатываем ошибки. В JavaScript у нас есть встроенная функция языка для работы с исключениями. Проблемный код мы заключаем в конструкцию try...catch. Это позволяет прописать нормальный путь выполнения в разделе try, а затем разобраться со всеми исключениями в разделе catch. Неплохой вариант. Это позволяет сосредоточиться на текущей задаче, не думая о каждой возможной ошибке. Определённо лучше, чем засорять код бесконечными if.

Без try...catch трудно проверять результаты каждого вызова функции для неожиданных значений. Это полезная конструкция. Но у неё есть определённые проблемы. И это не единственный способ обрабатывать ошибки. В статье мы рассмотрим использование монады Either в качестве альтернативы try...catch.

Прежде чем продолжить, отмечу пару моментов. Статья предполагает, что вы уже знаете о композиции функций и каррировании. И предупреждение. Если вы раньше не сталкивались с монадами, они могут показаться действительно… странными. Работа с такими инструментами требует изменить мышление. Поначалу это бывает тяжело.

Не волнуйтесь, если сразу запутались. У всех так. В конце статьи я перечислил несколько ссылок, которые могут помочь. Не сдавайтесь. Эти штуки опьяняют, как только проникают в мозг.
Читать дальше →
Всего голосов 26: ↑24 и ↓2+22
Комментарии12

Практика функционального программирования на JavaScript с использованием Ramda

Время на прочтение3 мин
Количество просмотров21K
Мы в rangle.io давно увлекаемся функциональным программированием, и уже опробовали Underscore и Lodash. Но недавно мы наткнулись на библиотеку Ramda, которая на первый взгляд похожа на Underscore, но отличается в небольшой, но важной области. Ramda предлагает примерно тот же набор методов, что и Underscore, но так организовывает работу с ними, что функциональная композиция становится легче.

Разница между Ramda и Underscore – в двух ключевых местах – каррирование и композиция.
Читать дальше →
Всего голосов 32: ↑31 и ↓1+30
Комментарии34

Мышление в стиле Ramda: Первые шаги

Время на прочтение6 мин
Количество просмотров23K
Недавно я познакомился с замечательной серией статей "Thinking in Ramda", которые проясняют на простых и ясных примерах способы написания кода в функциональном стиле с использованием библиотеки Ramda. Эти статьи показались мне настолько прекрасными, что я не смог удержаться от того, чтобы не перевести их на русский язык. Надеюсь, что в этом будет польза для многих людей :) Давайте начнём перевод с первой вступительной статьи.

1. Первые шаги
2. Сочетаем функции
3. Частичное применение (каррирование)
4. Декларативное программирование
5. Бесточечная нотация
6. Неизменяемость и объекты
7. Неизменяемость и массивы
8. Линзы
9. Заключение

Данный пост — это начало серии статей «Мышление в стиле Ramda» о функциональном программировании.

Я буду использовать библиотеку Ramda в этих статьях, хотя многие из обсуждаемых идей применимы также к множеству других библиотек, таких как Underscore и Lodash, а также к другим языкам программирования.

Я буду придерживаться лёгкой, менее академической стороны функционального программирования. Это в основном потому что я хочу, чтобы серия была доступна большему числу людей, но также частично и потому что я сам не так близок к истинно функциональной дороге.
Читать дальше →
Всего голосов 19: ↑16 и ↓3+13
Комментарии6

Почему Ramda?

Время на прочтение8 мин
Количество просмотров31K

Пост содержит перевод статьи «Why Ramda?», которую подготовил один из контрибьютеров Скот Сайет. Статья была опубликована 10 Июня 2014 года на сайте и рассказывает о том почему стоит обратить своё внимание на библиотеку Ramda и функциональное программирование в целом.


Примечание переводчика

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

Почему Ramda?


Когда-то давно buzzdecafe представил миру Ramda, в тот же момент сообщество поделилось на два лагеря.

Читать дальше →
Всего голосов 36: ↑34 и ↓2+32
Комментарии9

Green server для PET-проектов на базе Raspberry Pi – часть вторая(большой брат)

Время на прочтение6 мин
Количество просмотров9.6K

После не самого удачного опыта с Raspberry Pi 2 B в качестве домашнего сервера, я на пару лет бросил идею с домашним хостингом. Но количество PET проектов только увеличивалось. Тогда я раздобыл старенькую рабочую лошадку - полноразмерный HP сервер 1U с 8gb оперативной памяти, intel xeon. Разместил этот юнит в колокейшине и платил 35$/месяц за размещение. Помимо Ubuntu Server, там ещё стоял Windows Server для разработки и тестирования ASP.NET сервера. Пока один из проектов приносил прибыль, мне было выгодно размещать сервер в колокейшине. Через год, проект приносящий прибыль - заморозили, а привычка иметь собственный DEV сервер - осталась. Тогда я решил запустить этот сервер дома, даже не задумываясь о том, сколько шума он будет издавать. Чтобы вы понимали, я жил в панельном многоквартирном доме. И ко мне иногда приходили соседи с вопросом: «А чего у вас так долго пылесос работает?». Конечно же, мне это быстро надоело и я отключил сервер, положив на полку как сувенир. А без сервера было скучно…

Через некоторое время, один из моих проектов заинтересовал Швейцарскую компанию, которая занимается продажей золота. Если вкратце, это сервис, который выполняет работу ERP системы(учёт клиентов, контрактов, хранение документов, pdf сервис и всяческие отчёты). Этот проект необходимо было адаптировать под потенциально клиента, попутно переписать с устаревшей версии ASP.NET и всего стека Microsoft, на что-то быстрее и проще. В этот момент я выбрал GoLang, PostgreSQL, S3, Docker и парочку вспомогательных технологий, так как имел опыт работы с ними. Так вот, это эксперимент и клиент может в любой момент сказать, что ему это решение не подходит. Было решено, что хостить буду его - дома, дабы избежать лишних расходов и не тратить время на настройку облачных служб. Ну и хотелось попробовать решить проблему с предыдущей версией малинки.

Читать далее
Всего голосов 7: ↑6 и ↓1+6
Комментарии37

Язык программирования типов, скрытый в TypeScript. Utility Types

Время на прочтение5 мин
Количество просмотров15K

TypeScript — это язык, расширяющий JavaScript, добавляя в последний типизацию. Правда, так как TypeScript не имеет runtime-а (почти), он транслируется в JavaScript, в процессе чего, вся типизация теряется. Такую типизацию можно назвать лишь инструментом статического анализа кода. Тем не менее — это очень мощный инструмент. К тому же, помимо проверки кода, типизация также и документирует его.

В данной статье я расскажу лишь про типы, объявленные через ключевое слово type, не касаясь интерфейсов и классов. Однако, эта тема шире, чем может показаться, и я надеюсь, что читатель узнает что-то новое для себя. Ведь с помощью type можно писать маленькие программки (далее, утилиты), которые выполняются в процессе статического анализа кода, расширяя его возможности.

Читать далее
Всего голосов 22: ↑21 и ↓1+21
Комментарии3

Дэн Абрамов о замыканиях в JavaScript

Время на прочтение7 мин
Количество просмотров22K
Замыкания вызывают у программистов сложности из-за того, что это — «невидимая» конструкция.

Когда вы используете объект, переменную или функцию, вы делаете это намеренно. Вы думаете: «Тут мне понадобится переменная» — и добавляете её в свой код.



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

Если в двух словах, то замыкание — это когда функция обращается к переменным, объявленным за её пределами. Например, замыкание содержится в этом фрагменте кода:

let users = ['Alice', 'Dan', 'Jessica'];
let query = 'A';
let user = users.filter(user => user.startsWith(query));

Обратите внимание на то, что user => user.startsWith(query) — это функция. Она использует переменную query. А эта переменная объявлена за пределами функции. Это и есть замыкание.

Вы, если хотите, можете дальше не читать. Оставшаяся часть этого материала рассматривает замыкания в другом свете. Вместо того чтобы говорить о том, что такое замыкания, эта часть статьи посвятит вас в подробности методики обнаружения замыканий. Это похоже на то, как, в 1960-х, работали первые программисты.
Читать дальше →
Всего голосов 29: ↑21 и ↓8+25
Комментарии63

Аутентификация в Node.js. Учебные руководства и возможные ошибки

Время на прочтение12 мин
Количество просмотров42K
Однажды я отправился на поиск учебных руководств по аутентификации в Node.js/Express.js, но, к сожалению, не смог найти ни одного, которое меня бы полностью устроило. Некоторые были неполными, некоторые содержали ошибки в сфере безопасности, вполне способные навредить неопытным разработчикам.

Сразу скажу, что я всё ещё нахожусь в поиске надёжного, всеобъемлющего решения для аутентификации в Node/Express, которое способно составить конкуренцию Devise для Rails. Однако, удручающая ситуация в сфере руководств подвигла меня на подготовку этого материала. Тут я разберу некоторые наиболее распространённые ошибки в области аутентификации и расскажу о том, как их избежать.

image
Читать дальше →
Всего голосов 31: ↑25 и ↓6+19
Комментарии3

Руководство по аутентификации в Node.js без passport.js и сторонних сервисов

Время на прочтение8 мин
Количество просмотров64K
Автор статьи, перевод которой мы сегодня публикуем, говорит, что сейчас можно наблюдать рост популярности таких сервисов аутентификации, как Google Firebase Authentication, AWS Cognito и Auth0. Индустриальным стандартом стали универсальные решения наподобие passport.js. Но, учитывая сложившуюся ситуацию, обычным явлением стало то, что разработчики никогда в полной мере не понимают того, какие именно механизмы принимают участие в работе систем аутентификации.

Этот материал посвящён проблеме организации аутентификации пользователей в среде Node.js. В нём на практическом примере рассмотрена организация регистрации пользователей в системе и организация их входа в систему. Здесь будут подняты такие вопросы, как работа с технологией JWT и имперсонация пользователей.



Кроме того, обратите внимание на этот GitHub-репозиторий, в котором содержится код Node.js-проекта, некоторые примеры из которого приведены в этой статье. Этот репозиторий вы можете использовать в качестве основы для собственных экспериментов.
Читать дальше →
Всего голосов 31: ↑28 и ↓3+25
Комментарии9

Тёмная сторона работы в Яндекс.Маркете

Время на прочтение7 мин
Количество просмотров228K

Я уволился из Яндекс.Маркета, отработав там почти 15 месяцев. Сегодня я хочу поделиться своим взглядом на работу в Яндекс.Маркете и рассказать о причинах ухода.


Disclaimer: эта статья бесполезна для тех, кто работает или работал в Маркете; она предназначена в первую очередь для тех, кто лишь планирует туда пойти. А ещё Яндекс.Маркет – это не Яндекс, но очень близко. Поэтому всё, о чём я буду говорить, в первую очередь относится к Маркету, но значительная часть из этого точно так же может быть применена к большому Яндексу.


Я ни в коем случае не претендую на объективность, это моё личное мнение.


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


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


Читать дальше →
Всего голосов 402: ↑371 и ↓31+466
Комментарии806

Веб-компоненты вместо React — очередная попытка

Время на прочтение6 мин
Количество просмотров4.5K
Привет, Хабр!

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

  • DOM — это стейт. Поскольку у нас нет фреймворка, сразу забываем про функциональщину, и возвращаемся к императивному ООП. Веб-компоненты — это долгоживущие узлы DOM, инкапсулирующие свой стейт и имеющие публичное API. Они не пересоздаются, а изменяются. Значит DOM мы должны рассматривать не только как представление, но как хранилище бизнес-объектов, а значит и строить иерерхию компонентов нужно с учетом удобства их взаимодействия.
  • Взаимодействие компонентов. Компоненты могут взаимодействовать посредством прямых вызовов, обмена колбэками, или посредством восходящих / нисходящих пользовательских событий DOM. Последний способ наиболее предпочтителен, так как снижает взаимную зацепленность (coupling), и упорядочивает граф связей (см. пример ниже).
Читать дальше →
Всего голосов 7: ↑7 и ↓0+7
Комментарии3

The Digital Banya: цифровая трансформация™ на примере… общественной бани

Время на прочтение13 мин
Количество просмотров15K
Однажды, дегустируя новое пиво, мы с моим знакомым поспорили о том, что такое цифровая трансформация. Мой знакомый утверждал, что эта цифровая трансформация — просто пустое слово, под которое удобно выделять деньги. Мол, приходят CDTO (Chief Digital Transformation Officer, не смейтесь, это действительно так называется), берут огромные деньги, внедряют пару систем цифровой документации и какое-нибудь новшество на производстве, и все, мы вам трансформировали, давайте, растите.



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

— И что, спрашивает мой знакомый, прям любого бизнеса?
— Да, любого-любого, отвечаю я.
— А, ммм… даже общественной бани?
Читать дальше →
Всего голосов 26: ↑22 и ↓4+25
Комментарии29

Customer Experience Management – что это?

Время на прочтение6 мин
Количество просмотров12K
Привет всем. Я начинаю серию интервью про управление клиентской ценностью и про клиентский опыт. В дальнейшем и про другие темы, связанные с развитием бизнеса и менеджментом. С каждым новым выпуском будем погружаться в ту или иную тему все глубже.

Меня зовут Роман Нохрин (Р), а отвечать на вопросы будет эксперт — Арсен Даллакян (А), управляющий партнер консалтинговой компании Russian Behavioral Unit.

(Р) Итак, переходим сразу к вопросу: хочется понять, чтобы синхронизировать разговор, о чем вообще мы будем говорить. Что такое customer experience (СХ), customer experience management (CEM)? Что я слышу от других: у очень большого количества людей это сводится к слову сервис. И хочется понять: что это на самом деле такое, как управлять и где болит?

(А) Да, это есть боль.
Читать дальше →
Всего голосов 14: ↑14 и ↓0+14
Комментарии8

Создаём игру для самых маленьких на Phaser в Intel XDK

Время на прочтение21 мин
Количество просмотров16K
Дети любят современные технологии. Уверен, все вы наблюдали, или сами, или на видео, как малыши пользуются смартфонами и планшетами. Этих детей метко назвали «поколением мотыльков». Они «слетаются» на свет дисплеев мобильных устройств как бабочки в ночи. Многие игры, в которые играют малыши, очень легко создавать. Но даже столь простые приложения способны вырастать в серьёзные проекты.


Читать дальше →
Всего голосов 22: ↑18 и ↓4+14
Комментарии16

Классы и фабричные функции в JavaScript. Что выбрать?

Время на прочтение8 мин
Количество просмотров34K
В JavaScript существуют разные способы создания объектов. В частности, речь идёт о конструкциях, использующих ключевое слово class и о так называемых фабричных функциях (Factory Function). Автор материала, перевод которого мы публикуем сегодня, исследует и сравнивает эти две концепции в поисках ответа на вопрос о плюсах и минусах каждой из них.

image
Читать дальше →
Всего голосов 26: ↑23 и ↓3+20
Комментарии19

Жизнь на частицах 3D

Время на прочтение4 мин
Количество просмотров9.8K

ПривеТ! Решил поделиться с читателями своими небольшими экспериментами с системами частиц в трехмерном пространстве. За основу взял публикацию на Хабре об экспериментах с частицами в 2D пространстве.


Всего голосов 57: ↑53 и ↓4+49
Комментарии21

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность