Pull to refresh

Багобезопасный код: шаблон проектирования Null Safe

Reading time9 min
Views8K

Содержание


I. Описание проблемы
II. Обзор существующих решений
III. Вариант решения без применения аспектов.
IV. Решение на AspectJ
V. Динамические аспекты
VI. Послесловие.
VII. Ссылки и литература
Читать дальше →
Total votes 20: ↑19 and ↓1+18
Comments38

Все библиотеки имеют фатальные недостатки, или Как мы изобретали Retrofit-подобный велосипед для JSON-RPC протокола

Reading time23 min
Views3.6K

Привет, Хабр! Меня зовут Юра Кучанов, работаю Android разработчиком в Garage Eight и сегодня хочу рассказать о том, как мы делали Retrofit-подобную библиотеку для JSON-RPC протокола. Началось всё с того, что нам потребовалось для общения сервера и Android приложения использовать протокол JSON-RPC. Что значит “потребовалось”? Если кратко – бэкендеры предложили, а сильных аргументов против, в сущности, не нашлось =) Возможно, тут сработала, например, вот эта статья с хабра про выбор между REST и JSON-RPC. В итоге я пошёл искать библиотеки в сети и… И обнаружил, что готовые решения не подходят (так как там, конечно же, есть хотя бы один фатальный недостаток). В итоге сделал свою библиотеку в стиле Retrofit. Ниже расскажу, почему не подошли готовые решения, как реализовал своё через рефлексию и как копался в исходниках Retrofit и OkHttp для реализации нужного нам функционала.

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

Возможно вам не нужен AutoMapper

Reading time7 min
Views9.9K

Вы знали, что AutoMapper и MediatR создал один и тот же человек?

Джимми Богард создал две крайне обсуждаемые и спорные темы в .NET разработке. Если с MediatR уже разобрались, то c AutoMapper также хотелось бы расставить все точки над "ё".

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

Читать далее
Total votes 14: ↑12 and ↓2+10
Comments34

Порядок полей в соответствии с порядком в коде (C#)

Reading time2 min
Views7.8K
При работе с отражением (Reflection) порядок отраженных полей не гарантируется. Обычно это не имеет значения, но иногда нужен порядок в точном соответствии порядку определенному в коде. Например, это бывает необходимо для частичной сериализации.
Для решения этой надуманной проблемы мы воспользуемся сервисами межъязыкового взаимодействия.

Читать дальше →
Total votes 12: ↑8 and ↓4+4
Comments5

Не заставляйте слушателей рефлексировать

Reading time9 min
Views5.8K

Введение



В процессе разработки очень часто возникает необходимость создать экземпляр класса, имя которого хранится в конфигурационном XML файле, или вызвать метод, название которого написано в виде строки как значение атрибута аннотации. В таких случаях ответ один: “Используй reflection!”.


В новой версии CUBA Platform одной из задач по улучшению фреймворка было избавление от явного создания обработчиков событий в классах-контроллерах UI экранов. В предыдущих версиях объявления обработчиков в методе инициализации контроллера очень захламляли код, так что в седьмой версии мы решительно намерились все оттуда вычистить.

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

Скриптовый язык JavaPath для доступа к сложным структурам данных

Reading time13 min
Views2.7K

В статье рассматривается декларативный скриптовый язык JavaPath как альтернатива использованию Java Reflection и способ избежать "сервисного ада" в обособленных приложениях использующих сложные структуры данных.


Описание проблемы


Рассмотрим глубоко вложенную структуру


class A{
   B b;
}
class B{
   C c;
}
class C{
   String name;
}

Если нам нужно присвоить значение полю name класса C, не имея при этом непосредственного доступа к экземпляру A, то на помощь, обычно, приходит промежуточный слой сервисного API.


private A a;
public void setNameService(String name) {
    a.b.c.name = name;
}

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


private A a;
public void setNameService(String name) {
    if(a == null) {
        a = new A();
    }
    if(a.b == null) {
        a.b = new B();
    }
    if(a.b.c == null) {
        a.b.c = new C();
    }
    a.b.c.name = name;
}
Читать дальше →
Total votes 6: ↑5 and ↓1+4
Comments25

Получаем доступ к приватным свойствам объектов в PHP без рефлексии

Reading time3 min
Views24K
Несколько недель назад я работал над проблемой в ProxyManager. Проблема была проста: ReflectionClass и ReflectionProperty очень, очень, и ооочень медленные!
Причиной этого исследования является моя попытка оптимизировать "hydrator" для работы с большими объемами данных без накладных расходов на инициализацию.
Читать дальше →
Total votes 56: ↑36 and ↓20+16
Comments34

Могучие Typescript Декораторы — как работают, во что компилируются и для каких прикладных задач применимы

Reading time9 min
Views42K

Каждый Ангуляр разработчик видел декораторы в тайпскрипт коде. Их используют, чтобы описать Модули, сконфигурировать Dependency Injection или настроить компонент. Другими словами, декораторы используются, чтобы описать дополнительную информацию, или метаданные, для фреймворка или компилятора (в случае Ангуляра). При чем, Ангуляр лишь один из примеров. Существуют многие другие библиотеки, использующие декораторы для простоты и наглядности кода, как декларативный подход. Как .NET разработчик в прошлом, я вижу много сходства между TS декораторами и .NET аттрибутами. Наконец, набирающий популярность NestJS фреймворк для бекенд приложений (абстракция над Node), также построен на интенсивном использовании декораторов и декларативном подходе. Как это все работает и каким образом использовать декораторы в своем коде, чтобы он был более удобным и читабельным? Мы все понимаем, что после компиляции TS кода мы получаем Javascript код. В котором нет понятия декоратор, как и многих других Typescript особенностей. Поэтому для меня наиболее интересным является вопрос, во что превращается декоратор после компиляции. Занимаясь этим вопросом, я сделал выступление на митапе в Минске и хочу поделиться статьей.


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

PHP Reflection на замыканиях

Reading time2 min
Views7.1K

Привет, Habr! Сегодня хочу рассказать про свой костыль, который помог мне не погружаться в дебри PHP Reflection. Ведь все пишут костыли, просто кто-то пишет большие, а кто-то поменьше.


image

Читать дальше →
Total votes 27: ↑16 and ↓11+5
Comments17

Неудачная статья про ускорение рефлексии

Reading time7 min
Views7.9K
Сразу объясню название статьи. Изначально планировалось дать хороший, надежный совет по ускорению использования рефлекшена на простом, но реалистичном примере, однако в ходе бенчмаркинга выяснилось, что рефлексия работает не так медленно, как я думал, LINQ работает медленнее, чем снилось в кошмарах. А в итоге оказалось, что мной еще и была допущена ошибка в замерах… Подробности этой жизненной истории под катом и в комментариях. Так как пример достаточно бытовой и реализованный в принципе как обычно делается в энтерпрайзе, получилось достаточно интересная, как мне кажется, демонстрация жизни: влияния на скорость работы основного предмета статьи было не заметно из-за внешней логики: Moq, Autofac, EF Core и прочей «обвязки».
Читать дальше →
Total votes 24: ↑21 and ↓3+18
Comments76

[CppCon 2017] Herb Sutter: Метапрограммирование и кодогенерация в C++

Reading time8 min
Views11K

Продолжаю серию публикаций Fil по CppCon 2017. В докладе представлены ранние наработки по добавлению рефлексии и кодогенерации в C++, а также по метаклассам, которые позволят генерировать части классов C++. В стандарт эти новшества попадут не ранее, чем в C++23.

Total votes 14: ↑14 and ↓0+14
Comments7

Инстанцируем java.lang.Class

Reading time13 min
Views38K


Конструктор java.lang.Class является одной из самых охраняемых сущностей в языке Java. В спецификации чётко сказано, что объекты типа Class может создавать только сама JVM и что нам тут делать нечего, но так ли это на самом деле?


Предлагаю погрузиться в глубины Reflection API (и не только) и выяснить, как там всё устроено и насколько трудно будет обойти имеющиеся ограничения.

Читать дальше →
Total votes 56: ↑54 and ↓2+52
Comments15

CoLaboratory: приглашаем на C++ User Group Meetup

Reading time2 min
Views2.3K


15 ноября мы приглашаем всех неравнодушных к C++ на встречу с коллегами по цеху в рамках нашего проекта CoLaboratory. Резиденты C++ User Group сосредоточатся исключительно на практической стороне использования любимого инструмента программирования.

Поговорим на разные темы. Например, как clang и библиотека «libtooling» помогают «Лаборатории Касперского» автоматически генерировать код? Когда же наконец в C++ появятся «рефлекшены» и в каком виде попадут в стандарт? Какие подводные камни могут встретиться на пути проектирования «пула потоков» для высоконагруженной системы и соответственно как с ними бороться?
Читать дальше →
Total votes 11: ↑9 and ↓2+7
Comments0

Рефлексия в C++14

Reading time15 min
Views31K
Данная статья является расшифровкой (с небольшими правками) доклада Антона antoshkka Полухина — “Немного магии для C++14”.

Я тут недавно ковырялся с C++ и случайно открыл пару новых приемов метапрограммирования, которые позволяют делать рефлексию в C++14. Пара мотивационных примеров. Вот у вас есть какая-то POD структура, в ней какие-то поля:

struct complicated_struct {
    int i;
    short s;
    double d;
    unsigned u;
};

Количество полей и их имена не имеют значение, важно то, что с этой структуры мы можем написать следующий кусочек кода:

#include <iostream>
#include "magic_get.hpp"

struct complicated_struct { /* … */ };

int main() {
    using namespace pod_ops;
    complicated_struct s {1, 2, 3.0, 4};
    std::cout << "s == " << s << std::endl; // Compile time error?
}

Функция main, в ней создаем переменную нашей структуры, как-то ее инициализируем через aggregate инициализацию, а потом эту переменную пытаемся вывести в std::cout. И в этот момент у нас, по идее, должна быть ошибка компиляции: мы не определили оператор вывода в поток для нашей структуры, компилятор не знает как все это скомпилировать и вывести. Однако, оно скомпилируется и выведет содержимое структуры:

antoshkka@home:~$ ./test
s == {1, 2, 3.0, 4}

Читать дальше →
Total votes 40: ↑38 and ↓2+36
Comments33

LJV: Чему нас может научить визуализация структур данных в Java

Reading time26 min
Views28K

Эта статья является пересказом моего доклада на Java-конференции SnowOne 2021 года. LJV — проект, созданный в 2004 году как инструмент для преподавания языка Java студентам. Он позволяет визуализировать внутреннее устройство структур данных. В этом докладе я запускаю LJV на разных структурах (от String до ConcurrentSkipListMap) в разных версиях Java и разбираю, что там внутри, как оно менялось от версии к версии, и как это всё работает.


image

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

Learn OpenGL. Урок 4.6 — Кубические карты

Reading time16 min
Views27K
OGL3

Кубические карты


До сих пор нам приходилось пользоваться лишь двухмерными текстурами, однако, OpenGL поддерживает гораздо больше типов текстур. И в этом уроке мы рассмотрим тип текстурной карты, на самом деле, представляющий собой комбинацию нескольких отдельных текстур – это кубическая карта (cubemap).

Кубическая карта, по сути, является одним текстурным объектом, содержащим 6 отдельных двухмерных текстур, каждая из которых соотносится со стороной оттекстурированного куба. Зачем может пригодиться такой куб? Зачем сшивать шесть отдельных текстур в одну карту вместо использования отдельных текстурных объектов? Суть в том, что выборки из кубической карты можно совершать используя вектор направления.
Читать дальше →
Total votes 21: ↑21 and ↓0+21
Comments5

Тестирование аннотаций @NonNull/@Nullable

Reading time14 min
Views17K

Вместо «Посвящается ...»


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

Но эта задача была, а значит ее пришлось решить.

Intro


В статье вы часто будете встречать слово Lombok, прошу хейтеров не торопиться с выводами.
Я не собираюсь «топить» за Lombok или его отсутствие, я как Геральт Сапковского, стараюсь хранить нейтралитет, и могу спокойно и без дрожи в веке читать код как с Lombok, так и без оного.

Но на текущем проекте упомянутая библиотека присутствует, и что-то подсказывает мне, что наш проект такой не единственный.
Так вот.
Читать дальше →
Total votes 23: ↑14 and ↓9+5
Comments18

Unsafe.AsSpan: Span<T> как замена указателям?

Reading time16 min
Views10K


C# — невероятно гибкий язык. На нем можно писать не только бэкэнд или десктопные приложения. Я использую C# для работы, в том числе, и с научными данными, которые накладывают определенные требования на инструменты, доступные в языке. Хотя netcore захватывает повестку дня (учитывая, что после netstandard2.0 большинство фич как языков, так и рантайма, не бэк-портируются в netframework), я продолжаю работать и с легаси-проектами.


В этой статье я рассматриваю одно неочевидное (но, наверное, желаемое?) применение Span<T> и отличие реализации Span<T> в netframework и netcore из-за особенностей clr.

Добро пожаловать под кат
Total votes 26: ↑25 and ↓1+24
Comments16

Атрибуты C#: обо всех аспектах

Reading time19 min
Views41K
Здравствуй, читатель. В этой статье описаны атрибуты со всех сторон — начиная от спецификации, смысла и определения атрибутов, создания собственных и работе с ними, заканчивая добавлением атрибутов на рантайме и наиболее полезными и интересными существующими атрибутами. Если вам интересна тема атрибутов в C#, то добро пожаловать под кат.

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

Андрей Беляев про рефлексию в Java на встрече jug.msk.ru

Reading time2 min
Views3.2K
В прошедший четверг, 26 сентября 2019 года, в офисе компании КРОК на встрече московского сообщества Java-разработчиков jug.msk.ru выступил Андрей Беляев с докладом «Уменьшаем количество рефлексии в коде».


Читать дальше →
Total votes 20: ↑18 and ↓2+16
Comments6