前のページ

言語編

次のページ


ライブラリと可視性 (Libraries and visibility)

importlibraryのディレクティブにより、モジュール化された共有可能(shareable )なコード・ベースの作成が可能となる。ライブラリは単にAPIたちを提供するだけでなく、プライバシの単位でもある:アンダスコア(_)で始まる識別子たちはそのライブラリ内でのみ可視である。各Dartのアプリは、例えそれがlibraryディレクティブを使っていなくてもライブラリである。

ライブラリたちはパッケージたちを使って配布可能となる。PubSDKのなかに入っているパッケージ・マネージャ)に関してはPub Package and Asset Managerを見ると良い。



ライブラリを使う (Using libraries)

ひとつのライブラリからの名前空間が別のライブラリのスコープ内でどのように使われるかを指定するのにimportを使う。

例えば、Dartのウェブ・アプリは通常dart:htmlライブラリを使用するが、それは次のようにインポートできる:

import 'dart:html';

必要な引数はそのライブラリを指定するURIである。組込みライブラリの場合は、そのURIは特別なdart:スキームになっている。他のライブラリの場合は、ファイル・システム・パスまたはpackage:スキームが使える。package:スキームはpubツールのようなパッケージ・マネージャが提供しているライブラリたちを指定する。例えば:

import 'package:test/test.dart';

注意:URIuniform resource identifierのことである。URL(uniform resource locators)URIの一般的な形式である。



ライブラリ・プレフィックスを指定する (Specifying a library prefix)

使われている識別子が互いにぶつかっている二つのライブラリをインポートするときは、そのひとつまたは双方のライブラリにプレフィックスを指定できる。例えば、もしlibrary1library2の双方がElementクラスを持っていたとすると、以下のようなコードにすることになろう:

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// lib1からのElementを使う
Element element1 = Element();
// lib2からのElementを使う
lib2.Element element2 = lib2.Element();



あるライブラリの一部のみをインポートする (Importing only part of a library)

あるライブラリの一部のみを使いたいときは、そのライブラリを選択的にインポートできる。例えば:

// fooのみをインポート
import 'package:lib1/lib1.dart' show foo;
// fooを除くすべての名前をインポート
import 'package:lib2/lib2.dart' hide foo;



ライブラリの後回しのロード (Lazily loading a library)

後回しのロードは不精なローディング(lazy loading)とも呼ばれ、あるアプリがそのライブラリが必要になったときにオンデマンドでそれをロード出来るようにする:

  • そのアプリの初期立ち上げ時間を短縮する

  • A/Bテストを行う—例えばあるアルゴリズムの別の実装を試す

  • オプショナルなスクリーンやダイヤログのような滅多に使われない機能をロードする

あるライブラリを後回しでロードするには、最初にそれをdeferred asを使ってインポートしなければならない。

import 'package:greetings/hello.dart' deferred as hello;

そのライブラリが必要になったときに、そのライブラリの識別子を使ってloadLibrary()を呼び出す。

Future greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

上のコードでは、awaitキーワードはそのライブラリがロードされるまで実行を休止する。asyncawaitに関する詳細は「非同期対応」の章を参照のこと。

あるライブラリに複数回loadLibrary()をかけるのは問題ない。そのライブラリは一度のみロードされる。

後回しのローディングを使う際は以下のこと念頭に置く必要がある:

  • 後回しになったライブラリの常数たちはインポートしている側のファイルの中では常数ではない。これらの常数たちはその後回しのライブラリがロードされるまでは存在していない

  • インポートしている側のファイルの中では後回しになったライブラリからの型を使うことはできない。代替として、後回しのライブラリとインポートする側のファイルの双方によってインポートされているインターフェイス型を検討する

  • deferred as名前空間を使って定義する名前空間にDartは暗示的にloadLibrary()関数を挿入する。このloadLibrary()関数はFutureを返す

Dart VMでの相違:Dart VMではたとえloadLibrary()の呼び出し前であっても後回しのライブラリたちのメンバへのアクセスが可能である。このふるまいは変更される可能性があるので、現行のふるまいに依存しないようにされたい。



ライブラリの実装 (Implementing libraries)

ライブラリ・パッケージの実装に関しては、Create Library Packagesを見ること。これには以下のことが記されている:

  • ライブラリ・ソース・コードの構成法

  • exportディレクティブの使い方

  • 何時partディレクティブを使うか

  • 何時libraryディレクティブを使うか





前のページ

次のページ