Equals и GetHashCode в C# это сложно

Работать в C# с  Equals и  GetHashCode по многим причинам непросто, даже несмотря на наличие разного рода инструментов. Особенно по сравнению с тем, как это могло бы быть в нормально спроектированном ЯП, к которым, к большому сожалению, C#, в данном контексте, не относится.  Если вам интересно, что это за проблемы, для чего этот метод вообще нужен, почему этот механизм реализован именно так, а не как-то иначе, как можно было сделать лучше, то добро пожаловать под кат.

Читать →

Локализация Dart пакетов

При разработке пакета может возникнуть потребность добавить локализацию. Если вы используете для локализации пакет Intl, то вас ждёт неприятный сюрприз.

Проблема

Для того, чтобы реализовать Intl локализацию стандартным образом вы должны:

  • создать класс, содержащий строки для локализации, получаемые через Intl.message();
  • сгенерировать arb файлы на основе этого класса;
  • выполнить перевод и разместить arb файл для каждого языка;
  • сгенерировать код ( messages_*.dart файлы) на основе arb файлов;
  • объявить делегат локализации (который будет зарегистрирован в приложении) и реализовать функцию загрузки, которая выполнит initializeMessages()  из сгенерированного кода и вернёт экземпляр класса реализации.

Этот способ отлично работает в приложении, но имеет одно существенное ограничение: правильно обработан будет только первый вызов initializeMessages(). Все последующие вызовы не добавят строк в локализацию, если для указанной локали уже есть записи.

Читать →

Новые возможности C# 8

Прошло примерно пол года с момента выхода C# 8, думаем самое время кратко рассмотреть основные нововведения. И начнем мы, пожалуй, по идее, с самого значимого из них, а именно с Nullable reference types.

Nullable reference types

Если бы Microsoft и компания писали бы сочинение по русскому языку в 5-ом классе, то обязательно бы получили минус полбалла за тавтологию, причем  заслуженно. Дело в том, что reference types (ссылочные типы) по определению nullable, т.е. зануляемые, таким образом получается масло масляное. Кроме того, название этого функционала пересекается с уже имеющимся функционалом, а именно с Nullable value types. А так как эти возможности имеют мало общего , это приводит к небольшой неразберихе. И даже больше, не только названия пересекаются, но и синтаксис полностью идентичен, что с одной стороны, конечно, хорошо, но вот с другой… Основная цель этого нововведения — решить (а по факту получается «решить») крайне неприятную и старую, как мир, проблему The Billion Dollar Mistake, т.е. всем известную проблему с Null Pointer Exception. В современных и мейнстрим языках, на наш взгляд, подобной проблемы существовать не должно вовсе, но, по тем или иным причинам, большиство популярных языков программирования продолжают гордо нести дух старой школы, а вместе с тем и весь тот груз, с которым каждому разработчику приходится бороться ежедневно, как будто бы других проблем у разработчиков больше нет. Ошибки дизайнеров, допущенные при укладке фундамента в самом начале, и необходимость в обратной совместимости теперь и не дают шанса на исправление подобных ошибок на корню. Из-за чего мы и получаем то, что имеем, как бы грустно это ни было. Напомним, что первая версия C# вышла в далеком 2002 году. С учетом того, что текущая версия вышла в прошлом году, не трудно подсчитать, что на то, чтобы начать (подчеркнем, не побороть, а именно начать) бороться с проблемой, которой быть в принципе не должно, потребовалось невообразимых 17 лет.

Чтобы начать пользоваться Nullable Reference Types, необходимо одним из возможных способов включить эту функцию вручную. И если для старых проектов это оправдано, то почему не включить эту функцию для новых проектов? Остается только гадать. Активировать эту возможность можно как для проекта целиком, в свойствах проекта, так и для отдельно взятых файлов с помощью директивы  #nullable enable . Давайте рассмотрим несколько примеров.
Читать →

Пользовательский интерфейс в Unity #2 — RectTransform


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

Everfest 2020. Нормально делай — нормально будет

29-го февраля и 1-го марта представители нашей компании побывали на it-фестивале Everfest, который проводился в Тамбове. Мероприятие было довольно интересным и нам хотелось бы поделиться впечатлениями о поездке.

Читать →

Unity 2019.3

На днях стала доступна новая версия Unity2019.3. Это последняя запланированная версия с индексом 3. В этом году будет выпущено только две версии: 2020.1 и 2020.2 соответственно. В эту версию вошло приличное количество новых возможностей, как для художников и дизайнеров, так и для разработчиков. Самые значимые изменения, на наш взгляд, это:

  • сериализация с поддержкой полиморфизма и честный  null ;
  • ускоренный переход в Play Mode;
  • улучшения профайлера;
  • Addressable Asset System;
  • UIElements и UI Builder (превью);
  • обновление пакетного менеджера;
  • новая версия Asset Import Pipeline;
  • Accelerator service.

Более подробно с этими и остальными (а их гораздо больше) изменениями можно ознакомиться здесь.

#4 Советы Flutter + Dart

Перевод статьи #4 Flutter + Dart Tips.

Это статья #4 в серии переводов Советы Flutter + Dart. Если вы пропустили предыдущие статьи, то вы сможете найти их по ссылкам:

11. Использование множественного числа в ваших Dart строках

В разных языках действуют разные правила грамматики для количеств. В английском, например, количество 1 — особый случай. Пишется «1 book», а для любого другого количества будет «n books». Это отличие между единственным и множественным достаточно общее, но другие языки имеют более тонкие различия.

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

  • Добавляем зависимость:
  • Как использовать:
  • Вывод:

Читать →

Unity DOTS

DOTS

Unity уже довольно давно представили миру свой новый дата-ориентированный технлогический стек (Data-Oriented Technology Stack или сокращенно DOTS). Возможно, вы уже что-то слышали о нем. Именно о DOTS сегодня и пойдет речь. Мы рассмотрим, что же это такое, с чем его едят и попробуем написать простое приложение с его помощью.

Думаю, ни для кого не секрет, что с производительностью в Unity дела обстоят далеко не самым лучшим образом. Да и производительности как таковой никогда не бывает много. В Unity, естесственно, знают, как обстоят дела с производительностью в их собственном движке; и именно поэтому и был представлен DOTSDOTS позволяет использовать всю мощь современных мультиядерных процессоров для получения высокопроизводительного кода относительно просто и безопасно. По заявлению разработчика, благодаря использованию DOTS вы не только получаете максимально доступную (на данный момент) в Unity производительность. Одновременно с этим упрощается разработка кода, последующие его чтения и даже переиспользование кода в других проектах. На самом деле, конечно же, не все так просто; и это не какая-то серебряная пуля, и все (как и обычно) зависит целиком и полностью от разработчика: как напишет так и будет).

Так что же из себя представляет DOTS?

DOTS включает в себя три основных компонента:

  • Job System;
  • Burst Compiler;
  • Entity Component System.

Читать →