Что это значит, когда мы говорим частную переменную экземпляра для своей собственной библиотеки? - PullRequest
0 голосов
/ 02 марта 2020

Я новичок в трепетании / дротике и прочитал, что у нас нет общедоступного / частного / защищенного спецификатора доступа для дротика, но если мы хотим сделать закрытый экземпляр переменной, мы можем использовать оператор подчеркивания (_), но он не сделает переменную приватной для класса, а свою собственную библиотеку , так что же это на самом деле означает?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Конфиденциальность Dart действительно только для каждой библиотеки.

Имя, которое начинается с _, является частным именем библиотеки. Частный идентификатор, такой как _tmp, считается другим именем , чем идентичный по буквам идентификатор, также _tmp, который встречается в другой библиотеке.

Это означает, что код в другая библиотека не может получить доступ к частному имени _tmp, потому что она не может даже express его. Если он пытается написать _tmp, он может вместо этого ссылаться только на частное имя своей собственной библиотеки.

Выбор встраивания управления доступом в имя имеет смысл, если вы помните, что Дарт имеет Dynami c вызовов . Если вы напишите dynamic x = ...; x.foo();, то это вызовет метод foo для x, если он есть. Чтобы сделать это эффективно, было бы слишком много накладных расходов, если бы каждый динамический вызов c также выяснил, откуда исходит имя и доступно ли оно для вызывающей стороны. Dart избегает этих издержек, делая видимыми все публичные c имена и все приватные имена невыразимые .

Цель конфиденциальности - отделить API интерфейса publi c от внутреннего API реализации, и чтобы избежать конфликтов имен. Вы можете писать свои личные имена, не опасаясь, что они вступают в конфликт с чужими именами, и не рискуя кем-то, думая, что они предназначены для публичного использования. Дарт не пытается защитить код от другого кода в той же библиотеке. В любом случае он должен быть одним и тем же автором, поэтому им можно доверять, чтобы использовать API ответственно (а если нет, то он сам).

Что это значит для вас как для пользователя: библиотека - это единица кода. Вы можете создавать библиотеки, которые содержат только один класс. Конфиденциальность библиотеки - это конфиденциальность класса для этого класса. Или вы можете создавать библиотеки со многими классами и функциями верхнего уровня, которые могут видеть личные имена друг друга.

Это означает, что вы должны основывать свою модульность на необходимости классов для совместного использования реализации, а не на чем-то другом. Вы всегда можете создать API большего размера, экспортируя другие библиотеки.

При создании пакета Pub я бы создал ваши собственные внутренние библиотеки внутри каталога lib/src/, предоставив им любой размер удобный , а затем экспортируйте ваш publi c API из основного файла пакета в lib/.

0 голосов
/ 02 марта 2020

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

...