Одной из технологий, которая помогает нам в нашем проекте следовать принципу инверсии управления (IoC), является фреймворк Dagger (https://google.github.io/dagger/). Он позволяет реализовать Dependency Injection — одну из форм IoC. Большинство фреймворков Dependency Injection опираются на отражение, которое используется для сканирования кода на наличие аннотаций, и именно так были реализованы ранние фреймворки Android DI, такие как Guice. В отличие от серверных решений, дополнительное время и память, необходимые для сред DI, обычно не являются проблемой, поскольку зависимости разрешаются и создаются во время запуска приложения, а не во время запроса, а взаимодействие с пользователем не ухудшается, на мобильных устройствах это дополнительное время и память могут иметь решающее значение и могут существенно повлиять на работу пользователей. Поэтому Dagger, рекомендуемый DI-фреймворк (https://developer.android.com/topic/performance/memory), использует другой подход — он разрешает зависимости во время компиляции, создавая дополнительные классы. Генерация кода — это то, к чему большинство членов нашей команды относятся скептически, поскольку очень редко сгенерированный код имеет такое же качество, как код, написанный опытным разработчиком. И мы решили немного поближе взглянуть на область генерации кода и на то, должна ли она быть нашей заботой.

Вся история языков программирования связана с повышением уровня абстракции и созданием кода более низкого уровня. Все началось с языков ассемблера, когда разработчикам больше не нужно было писать программу в двоичном коде (нули и единицы), но они могли использовать понятные человеку ключевые слова. И ассемблер использовался для преобразования ассемблерного кода в машинный язык. Поскольку преобразование было довольно простым, разработчики не слишком беспокоились о полученном машинном коде, а больше беспокоились о ассемблере. Другая история была с языками программирования следующего поколения, такими как Fortran, Cobol, Pascal, C, известными как языки программирования высокого уровня. Основное преимущество языков высокого уровня перед языками низкого уровня заключается в том, что их легче читать, писать и поддерживать. Но процесс трансляции (выполняемый компилятором) такого языка в машинный код намного сложнее, и поэтому сгенерированный машинный код был не таким оптимальным, как в случае с языком ассемблера. Но через некоторое время компиляторы улучшились, и большинство разработчиков перестали возиться с скомпилированным кодом и сосредоточились исключительно на коде языка программирования высокого уровня.

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

http://fitradar.me/