Нюансы обработки ошибок в completion-коллбеке
В практике программирования Swift часто можно встретить следующий формат completion-коллбеков, которые могут возвращать либо результат без ошибки, либо ошибку:
func doSomething(_ completion: (data: Data?, error: Error?) -> Void())
Проблема таких completion-коллбеков в опционалах которые должны разрешить проблемы возвращения nil
на месте параметра data
в случае ошибки и nil
в параметре error
. Но кроме этих двух состояния возникают ещё два непредусмотренных логикой - когда оба параметра nil
, или когда оба параметра установлены. В этой заметке я хотел бы порассуждать о том как правильно обрабатывать такие вызовы, т.к. это проблема встречается часто при работе со старыми методами из CocoaTouch
, при разработке кода с обратной совместимостью API, а так же при работе с библиотеками третьих сторон.
Адаптер интерфейса в Go
Так получилось, что в Go нет общепринятого подхода для написания обобщенных алгоритмов, типа темплейтов на которых строится STL в C++. Видимо, поэтому алгоритмические возможности стандартной библиотеки Go довольно ограничены. Для того что бы к коллекции применить какой-то алгоритм обычно требуется определять некоторый интерфейс, например, как это происходит при использовании сортировки sort.Sort
из стандартной библиотеки. На примере этого интерфейса sort.Interface
можно создать структуру-адаптер которая позволит применять функцию без явного определения новых методов.
Uploading video to Twitter with Go
Уже почти год на Twitter можно заливать короткие видеоролики, более того возможность загрузки видео доступна из официального API. Конечно, Twitter и раньше позволял отображать ролики из видеохостингов как Youtube и Vimeo, но нужно иметь ввиду, что в отличии от встроенных медиа эти ролики не воспроизводятся автоматически при прокрутке, что привлекает пользователь в меньшей степени.
В этой заметке я опишу как загруждать видео прямиком на Twitter.
Абстрактная фабрика на Haskell
К функциональным языкам программирования я уже давно испытываю неподдельный интерес, особенно к ML-семейству и в частности к Haskell. Пожалуй такой же трепет я испытываю только к LISP-языкам. Но к сожалению практических книг по созданию приложений на Haskell очень и очень мало, поэтому я решил разбираться самостоятельно. На данный момент сделал набросок реализации абстрактной фабрики на Haskell. Потом попробую реализовать и другие ООП-паттерны в таком же виде как я сделал это для Go при написании хабростатьи Язык Go: реабилитация императивного программирования.
Программирование, искусственный интеллект и тезис Тьюринга-Чёрча
Поучаствовал недавно в дискуссии на хабре по поводу инженерности в программировании и будущего самого программирования. Конечно предсказывать будущее дело неблагодарное, тем не менее, что касается ценности программирования есть чёткие доводы, что в будущем это будет стольже актуально как и сейчас. Так же как и латинский алфавит подходит для письма не хуже чем 2к+ лет назад.
Обработка ошибок в RESTful — приложениях
За последнее время очень многие веб-фреймворки обзавелись RESTful роутингом. Более того, REST стал де-факто стандартом проектирования архитектуры веб-приложений. Практически все более-менее значимые сервисы обзавелись RESTful API с представлением данных через xml и json форматы. Такой популярности REST помогло как появление большого количества руководств, так и горячие обсуждения REST среди специалистов.
Вместе с тем, REST до сих пор воспринимается скорее как некоторый набор правил роутинга, а всё что не связано в прямую с роутингом решается произвольным путём, в частности это касается обработки ошибок в RESTful-приложениях.
Хорошие верстальщики отправляются на небеса, а плохие куда захотят. Или — почему БЭМ не приносит счастья?
Все мы привыкли слышать поучительные разговоры о том "как надо верстать", или о том "как не надо". Иногда понятие "как надо" строится на объективных фактах, иногда на фактах которые скрыты где-то в глубине проблемы. Всё вместе это образует некоторые правила вёрстки, которыми и руководствуется верстальщик в своей повседневной работе.
Первоначально правила вёрстки были сродни искусству - ты мог делать что угодно, и никто тебя не останавливал, кроме возможностей веб-браузеров естественно. Потом эти п
Статическая и динамическая композиции в c++
Возможность метапрограммирования в c++ позволяет расширить тривиальные способы композиции классов, варьируя сцепленность и зависимость объектов.
Зависимость (dependency) и сцепленность (cohesion) на примере MVC-архитектуры
В объектно-ориентированном проектировании широко используются термины зависимость и сцепленность. Однако мало кто использует для оценки этих величин количественные показатели, несмотря на то что методы расчёта таких показателей хорошо описаны в литературе, например здесь. Но видимо, дело упирается в то, что существующие показатели не заслужили должного доверия, т.к. качество той или иной единицы проектирования зависит не только от объективных показателей, но и от ряда субъективных — аккуратности названия классов, их методов и переменных, компакности и чистоты логики, соответсвия общепринятым подходам.
Тем не менее, полезно представлять, какие проектные решения повышают сцепленность (что хорошо), а какие увеличивают зависимость (что плохо).
Подключение c/c++ кода к haskell-проекту!
Haskell один из быстроразвивающихся функциональных языков программирования. Возможно это один из тех функциональных языков которому вы хотите отдать предпочтение практического использования в ближайшее время.
Эта статья для тех, кто хотел бы опробовать Haskell на деле, но имеет горы полезного C и C++ кода с которым требуется считаться.