Что означает знак доллара, помещенный перед вызовом класса во Flutter?

Я новичок в Flutter / Dart, и я продолжаю видеть знаки доллара, появляющиеся перед вызовами классов или методов, например, следующий (находится в Floor документации пакета):

 final database = await $FloorAppDatabase.databaseBuilder('app_database.db').build();

Я много искал, и единственное значение знаков доллара в Dart, которое я смог найти, - это интерполяция строк, но, похоже, это не так.


person Teodoro    schedule 04.10.2020    source источник
comment
$ в официальных соглашениях об именах Dart не упоминается, поэтому я предполагаю, что спросите человека, который первым написал код.   -  person Dai    schedule 04.10.2020


Ответы (1)


Это не соглашение Flutter или Dart - по крайней мере, не официальное: официальное соглашение об именах Dart в документе (по состоянию на октябрь 2020 г.) не упоминается использование $ в именах идентификаторов.

Однако я знаю, что экосистемы других языков программирования действительно используют знак доллара (Sigil), и я думаю, что эта привычка унаследована авторами базы данных floor, с которой вы связались. В частности, в Java обычным явлением является использование $ для имен типов, сгенерированных инструментами, а не написанных вручную (например, типов сущностей ORM), и люди, использующие наблюдаемые объекты RxJS в JavaScript, будут использовать $ в качестве суффикса имени переменной.

Поскольку $FloorDatabase - это имя типа, а не имя переменной или члена, я буду исходить из предположения, что это привычка, взятая из Java:

Java: символ $ следует использовать только в механически сгенерированном исходном коде или, в редких случаях, для доступа к уже существующим именам в устаревших системах.

Итак, в этом случае подсказка находится в документации, на которую вы ссылаетесь:

Используйте сгенерированный код. Для получения экземпляра базы данных используйте сгенерированный класс $FloorAppDatabase, который предоставляет доступ к построителю базы данных.

Итак, мой вывод: это не официальное соглашение об именах в Dart / Flutter, но оно есть в Java, и похоже, что авторы floor перенесли его из Java.

(Мне лично хотелось бы, чтобы они этого не делали, поскольку это не особо полезный индикатор - какое значение для приложения-потребителя, если тип был создан как инструмент, а не написан вручную?)

person Dai    schedule 04.10.2020
comment
Использование $ действительно является соглашением, используемым типичными генераторами кода Dart (например, package:built_value). Лично я считаю, что это полезно, потому что тогда я знаю, что не могу напрямую использовать grep в имени, чтобы найти его определение. - person jamesdlin; 04.10.2020
comment
Если это действительно так, я полностью согласен с тем, что это соглашение о символах не следует переносить на дротик. Это вводит в заблуждение и, вероятно, сбивает с толку некоторых непреднамеренных новичков (например, меня). Я подожду еще ответов, но ваш кажется правильным. - person Teodoro; 04.10.2020
comment
@jamesdlin, твой пример тронул мне голову, но я этого не совсем понял. Не могли бы вы привести более конкретный пример? (Так что, возможно, я передумал использовать этот символ). - person Teodoro; 04.10.2020
comment
Извините, символ *, а не оператор - person Teodoro; 04.10.2020
comment
Например, если вы посмотрите на какой-то код и увидите $ в именах символов, то вы знаете, что происходит некоторая магия генерации кода. В вашем конкретном случае, если вы искали реализацию $FloorAppDatabase, чтобы увидеть, как это работает, вы легко могли бы сказать, что вам нужно запустить генератор кода сначала, а затем выполнить поиск сгенерированного вывода. - person jamesdlin; 04.10.2020
comment
Хм ок, снято. В данном случае это кажется полезным. Спасибо! - person Teodoro; 04.10.2020
comment
@jamesdlin Разве сгенерированный код уже не присутствует в вашей кодовой базе (и поэтому grep-способен)? И в системе управления версиями тоже? (Мое личное мнение состоит в том, что сгенерированный код должен находиться в системе контроля версий, а транслируемый код - нет, а генератор ORM не является транспилером). - person Dai; 04.10.2020
comment
@Dai Если сгенерированный код не находится в системе контроля версий, он не обязательно будет присутствовать при поиске. (Обычно я не помещаю сгенерированный код в систему управления версиями, если он создается как часть процесса сборки.) В общем, сгенерированный код также может находиться в отдельном месте, что затрудняет его поиск. И даже если бы вы могли его найти, он не обязательно был читабельным, возможно, вам лучше попытаться найти код, из которого он был сгенерирован. - person jamesdlin; 04.10.2020
comment
Шаблон, который сгенерирован один раз, и его никогда не нужно будет регенерировать, конечно же, можно было бы проверить. Ожидается, что этот код будет изменен. В этом случае я согласен с тем, что использование разных имен для сгенерированных символов бесполезно. - person jamesdlin; 07.10.2020