Конфиденциальность 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/
.