Dart-programming-quick-guide
Dartプログラミング-概要
Dartは、Cスタイルの構文を持つオブジェクト指向言語であり、オプションでJavaScriptにトランスコンパイルできます。 インターフェイス、クラス、コレクション、ジェネリック、オプションの型指定など、さまざまなプログラミング支援をサポートしています。
Dartは、単一ページのアプリケーションを作成するために広く使用できます。 単一ページのアプリケーションは、WebサイトおよびWebアプリケーションにのみ適用されます。 単一ページのアプリケーションを使用すると、ブラウザーに異なるWebページをロードすることなく、Webサイトの異なる画面間を移動できます。 典型的な例は GMail です。─受信ボックス内のメッセージをクリックすると、ブラウザーは同じWebページに留まりますが、JavaScriptコードは受信ボックスを非表示にし、メッセージ本文を画面に表示します。
Googleは、 Chromium の特別なビルドである Dart VM をリリースしました。 Dartiumを使用すると、他のブラウザでテストする準備ができるまでコードをJavaScriptにコンパイルする必要がなくなります。
次の表は、DartとJavaScriptの機能を比較しています。
Feature | Dart | JavaScript |
---|---|---|
Type system | Optional, dynamic | Weak, dynamic |
Classes | Yes, single inheritance | Prototypical |
Interfaces | Yes, multiple interfaces | No |
Concurrency | Yes, with isolates | Yes, with HTML5 web workers |
このチュートリアルは、Dartプログラミング言語の基本レベルの理解を提供します。
Dartプログラミング-環境
この章では、WindowsプラットフォームでのDartの実行環境の設定について説明します。
DartPadを使用してスクリプトをオンラインで実行する
[[1]] Dartエディターはスクリプトを実行し、HTMLとコンソール出力の両方を表示します。 オンラインエディタには、プリセットコードサンプルのセットが付属しています。
*Dartpad* エディターのスクリーンショットを以下に示します-
Dartpadでは、より制限的な方法でコーディングすることもできます。 これは、エディターの右下にある[強モード]オプションをチェックすることで実現できます。 強力モードは次の場合に役立ちます-
- より強力な静的および動的チェック
- 相互運用性を高めるための慣用的なJavaScriptコード生成。
Dartpadを使用して次の例を試すことができます
void main() {
print('hello world');
}
コードは次の出力を表示します
hello world
ローカル環境のセットアップ
このセクションでは、ローカル環境のセットアップ方法を見てみましょう。
テキストエディターの使用
いくつかのエディターの例には、Windows Notepad、Notepad ++、Emacs、vim、viなどが含まれます。 編集者は、オペレーティングシステムごとに異なる場合があります。 通常、ソースファイルには拡張子「.dart」が付けられます。
Dart SDKのインストール
Dartの現在の安定バージョンは 1.21.0 です。 dart sdk は次からダウンロードできます-
Dart SDKのインストールのスクリーンショットは以下のとおりです-
SDKのインストールが完了したら、PATH環境変数を次のように設定します-
<dart-sdk-path>\bin
インストールの検証
Dartが正常にインストールされているかどうかを確認するには、コマンドプロンプトを開き、次のコマンドを入力します-
Dart
インストールが成功すると、dartランタイムが表示されます。
IDEサポート
多数のIDEがDartのスクリプトをサポートしています。 例には、Jet Brainsの Eclipse、IntelliJ 、および WebStorm が含まれます。
以下は、 WebStrom IDE を使用してDart環境を設定する手順です。
WebStormのインストール
WebStormのインストールファイルは、https://www.jetbrains.com/webstorm/download/#section=windows-version [[[2]] 。]
WebStormインストールファイルは、Mac OS、Windows、およびLinuxで利用可能です。
インストールファイルをダウンロードした後、以下の手順に従ってください-
- Dart SDKをインストールします:上記の手順を参照してください
- 新しいDartプロジェクトを作成し、Dartサポートを構成する
- 新しいDartプロジェクトを作成するには、
- 「ようこそ」画面で「新規プロジェクトの作成」をクリックします
- 次のダイアログボックスで、[ダーツ]をクリックします
- Dart SDK パスに値が指定されていない場合は、SDKパスを指定します。 たとえば、SDKパスは <dart installation directory>/dart/dartsdk になります。
プロジェクトにDartファイルを追加する
プロジェクトにDartファイルを追加するには-
- プロジェクトを右クリック
- 新規→Dartファイル
- Dartスクリプトの名前を入力してください
WebStormエディタのスクリーンショットは以下のとおりです-
dart2jsツール
*dart2js* ツールは、DartコードをJavaScriptにコンパイルします。 DartコードをJSにコンパイルすると、Dart VMをサポートしていないブラウザーでDartスクリプトを実行できます。
dart2jsツールはDart SDKの一部として出荷されており、/dartsdk/binフォルダーにあります。
DartをJavaScriptにコンパイルするには、ターミナルで次のコマンドを入力します
dart2js - - out = <output_file>.js <dart_script>.dart
このコマンドは、Dartコードに相当するJavaScriptを含むファイルを生成します。 このユーティリティの使用に関する完全なチュートリアルは、Dartの公式Webサイトにあります。
Dartプログラミング-構文
構文は、プログラムを記述するための一連のルールを定義します。 すべての言語仕様は独自の構文を定義しています。 Dartプログラムはで構成されています-
- 変数と演算子
- クラス
- 関数
- 式とプログラミング構成
- 意思決定とループ構造
- コメント
- ライブラリとパッケージ
- 型定義
- コレクション/ジェネリックとして表されるデータ構造
初めてのダーツコード
従来の「Hello World」の例から始めましょう-
main() {
print("Hello World!");
}
- main()関数は、Dartの事前定義されたメソッドです。 このメソッドは、アプリケーションへのエントリポイントとして機能します。 Dartスクリプトを実行するには、 main()*メソッドが必要です。 * print()*は、指定された文字列または値を標準出力に出力する定義済みの関数です。 ターミナル。
上記のコードの出力は次のようになります-
Hello World!
Dartプログラムを実行する
あなたは2つの方法でDartプログラムを実行することができます-
- ターミナル経由
- WebStorm IDE経由
ターミナル経由
端末を介してDartプログラムを実行するには-
- 現在のプロジェクトのパスに移動します
- [ターミナル]ウィンドウに次のコマンドを入力します
dart file_name.dart
WebStorm IDE経由
WebStorm IDEを介してDartプログラムを実行するには-
- IDEでDartスクリプトファイルを右クリックします。 (ファイルには、実行を可能にする* main()*関数が含まれている必要があります)
- *「Run <file_name>」*オプションをクリックします。 同じのスクリーンショットを以下に示します-
あるいは、Run Buttonボタンをクリックするか、ショートカット Ctrl + Shift + F10 を使用してDartスクリプトを実行できます。
Dartコマンドラインオプション
Dartコマンドラインオプションは、Dartスクリプトの実行を変更するために使用されます。 Dartの一般的なコマンドラインオプションには次のものがあります-
Sr.No | Command-Line Option & Description |
---|---|
1 |
-c or --c アサーションとタイプチェックの両方を有効にします(チェックモード)。 |
2 |
--version VMバージョン情報を表示します。 |
3 |
--packages <path> パッケージ解決構成ファイルへのパスを指定します。 |
4 |
-p <path> インポートされたライブラリの場所を指定します。 このオプションは—packagesと共に使用できません。 |
5 |
-h or --help ヘルプを表示します。 |
チェックモードを有効にする
Dartプログラムは2つのモードで実行されます-
- チェックモード
- 実動モード(デフォルト)
開発およびテスト中に警告およびエラーを追加して開発およびデバッグプロセスを支援するため、開発およびテスト中はDart VMを*チェックモード*で実行することをお勧めします。 チェックモードでは、タイプチェックなどのさまざまなチェックが実行されます。 チェックモードをオンにするには、スクリプトの実行中に、スクリプトファイル名の前に-cまたは–-checkedオプションを追加します。
ただし、スクリプトの実行中にパフォーマンスの利点を確保するために、*実稼働モード*でスクリプトを実行することをお勧めします。
次の Test.dart スクリプトファイルを考慮してください-
void main() {
int n = "hello";
print(n);
}
次を入力してスクリプトを実行します-
dart Test.dart
タイプの不一致がありますが、チェックモードがオフになると、スクリプトは正常に実行されます。 スクリプトは、次の出力になります-
hello
「--checked」または「-c」オプションでスクリプトを実行してみてください-
dart -c Test.dart
Or,
dart - - checked Test.dart
Dart VMは、タイプの不一致があることを示すエラーをスローします。
Unhandled exception:
type 'String' is not a subtype of type 'int' of 'n' where
String is from dart:core
int is from dart:core
#0 main (file:///C:/Users/Administrator/Desktop/test.dart:3:9)
#1 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart :261)
#2 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Dartの識別子
識別子は、変数、関数などのプログラム内の要素に付けられた名前です。 識別子のルールは-
識別子には、文字と数字の両方を含めることができます。 ただし、識別子を数字で始めることはできません。
- 識別子には、アンダースコア(_)またはドル記号($)以外の特殊記号を含めることはできません。
- 識別子をキーワードにすることはできません。
- それらは一意でなければなりません。
- 識別子では大文字と小文字が区別されます。
- 識別子にスペースを含めることはできません。
次の表に、有効な識別子と無効な識別子の例をいくつか示します-
Valid identifiers | Invalid identifiers |
---|---|
firstName | Var |
first_name | first name |
num1 | first-name |
$result | 1number |
Dartのキーワード
キーワードは、言語の文脈において特別な意味を持ちます。 次の表に、Dartのいくつかのキーワードを示します。
abstract 1 | continue | false | new | this |
as 1 | default | final | null | throw |
assert | deferred 1 | finally | operator 1 | true |
async 2 | do | for | part 1 | try |
async* 2 | dynamic 1 | get 1 | rethrow | typedef 1 |
await 2 | else | if | return | var |
break | enum | implements 1 | set 1 | void |
case | export 1 | import 1 | static 1 | while |
catch | external 1 | in | super | with |
class | extends | is | switch | yield 2 |
const | factory 1 | library 1 | sync* 2 | yield* 2 |
空白と改行
Dartは、プログラムに表示されるスペース、タブ、改行を無視します。 プログラムでは、スペース、タブ、改行を自由に使用できます。また、コードを読みやすく理解しやすくするために、プログラムをきちんと一貫した方法で自由にフォーマットおよびインデントできます。
Dartは大文字と小文字を区別します
Dartでは大文字と小文字が区別されます。 これは、Dartが大文字と小文字を区別することを意味します。
ステートメントはセミコロンで終わります
命令の各行はステートメントと呼ばれます。 各dartステートメントはセミコロン(;)で終わる必要があります。 1行に複数のステートメントを含めることができます。 ただし、これらのステートメントはセミコロンで区切る必要があります。
Dartのコメント
コメントは、プログラムの可読性を向上させる方法です。 コメントを使用して、コードの作成者などのプログラムに関する追加情報、関数/コンストラクトに関するヒントなどを含めることができます。 コメントはコンパイラによって無視されます。
Dartは次のタイプのコメントをサポートしています-
- 単一行コメント(//)-「//」と行末の間のテキストはコメントとして扱われます
- 複数行コメント(/ /)-これらのコメントは複数行にわたる場合があります。
例
//this is single line comment
/* This is a
Multi-line comment
*/
Dartのオブジェクト指向プログラミング
Dartはオブジェクト指向言語です。 オブジェクト指向は、実世界のモデリングに従うソフトウェア開発パラダイムです。 オブジェクト指向は、プログラムを、メソッドと呼ばれるメカニズムを介して互いに通信するオブジェクトのコレクションと見なします。
- オブジェクト-オブジェクトは、エンティティのリアルタイム表現です。 Grady Broochによると、すべてのオブジェクトには3つの機能が必要です-
- 状態-オブジェクトの属性によって記述されます。
- 動作-オブジェクトの動作方法を説明します。
- Identity -オブジェクトを類似のそのようなオブジェクトのセットから区別する一意の値。
- クラス-OOPの観点でのクラスは、オブジェクトを作成するための青写真です。 クラスは、オブジェクトのデータをカプセル化します。
- メソッド-メソッドはオブジェクト間の通信を容易にします。
例:ダーツとオブジェクトの向き
class TestClass {
void disp() {
print("Hello World");
}
}
void main() {
TestClass c = new TestClass();
c.disp();
}
上記の例では、クラス TestClass を定義しています。 クラスには* disp()メソッドがあります。 このメソッドは、文字列「Hello World」を端末に出力します。 新しいキーワードは、クラスのオブジェクトを作成します。 オブジェクトはメソッド disp()*を呼び出します。
コードは、次の*出力*を生成する必要があります-
Hello World
Dartプログラミング-データ型
プログラミング言語の最も基本的な特性の1つは、サポートするデータ型のセットです。 これらは、プログラミング言語で表現および操作できる値のタイプです。
Dart言語は次のタイプをサポートしています-
- 番号
- 文字列
- ブール値
- リスト
- Maps
番号
Dartの数字は、数値リテラルを表すために使用されます。 ナンバーダートには2つのフレーバーがあります-
- 整数-整数値は非小数値、つまり小数点のない数値を表します。 たとえば、値「10」は整数です。 整数リテラルは、 int キーワードを使用して表されます。
- Double -Dartは小数値もサポートしています。 小数点付きの値。 DartのDoubleデータ型は、64ビット(倍精度)浮動小数点数を表します。 たとえば、値「10.10」。 キーワード double は、浮動小数点リテラルを表すために使用されます。
文字列
文字列は文字のシーケンスを表します。 たとえば、名前、住所などのデータを保存する場合 文字列データ型を使用する必要があります。 Dart文字列は、UTF-16コードユニットのシーケンスです。 *ルーン*は、UTF-32コードユニットのシーケンスを表すために使用されます。
キーワード String は、文字列リテラルを表すために使用されます。 文字列値は、一重引用符または二重引用符に埋め込まれます。
ブール値
ブールデータ型はブール値trueおよびfalseを表します。 Dartは bool キーワードを使用してブール値を表します。
リストと地図
データ型リストとマップは、オブジェクトのコレクションを表すために使用されます。 リスト*は、オブジェクトの順序付けられたグループです。 DartのListデータ型は、他のプログラミング言語の配列の概念と同義です。 *Map データ型は、一連の値をキーと値のペアとして表します。 dart:core ライブラリを使用すると、定義済みのListクラスとMapクラスを介してこれらのコレクションを作成および操作できます。
動的タイプ
Dartは、オプションで入力される言語です。 変数の型が明示的に指定されていない場合、変数の型は*動的*です。 dynamic キーワードは、明示的に型注釈として使用することもできます。
Dartプログラミング-変数
変数は、値を格納する「メモリ内の名前付きスペース」です。 つまり、プログラム内の値のコンテナとして機能します。 変数名は識別子と呼ばれます。 以下は、識別子の命名規則です-
- 識別子をキーワードにすることはできません。
- 識別子にはアルファベットと数字を含めることができます。
- アンダースコア(_)とドル($)記号を除いて、識別子にスペースと特殊文字を含めることはできません。
- 変数名は数字で始めることはできません。
型の構文
変数は、使用する前に宣言する必要があります。 Dartはvarキーワードを使用して同じことを実現します。 変数を宣言するための構文は以下のとおりです-
var name = 'Smith';
dartのすべての変数は、値を含むのではなく、値への参照を格納します。 nameという変数には、「Smith」という値を持つStringオブジェクトへの参照が含まれています。
Dartは、変数名の前にデータ型を付けることで type-checking をサポートしています。 型チェックにより、変数がデータ型に固有のデータのみを保持することが保証されます。 同じための構文は以下のとおりです-
String name = 'Smith';
int num = 10;
次の例を考慮してください-
void main() {
String name = 1;
}
上記のスニペットでは、変数に割り当てられた値が変数のデータ型と一致しないため、警告が表示されます。
出力
Warning: A value of type 'String' cannot be assigned to a variable of type 'int'
すべての初期化されていない変数の初期値はnullです。 これは、Dartがすべての値をオブジェクトと見なすためです。 次の例は同じことを示しています-
void main() {
int num;
print(num);
}
出力
Null
動的キーワード
静的型なしで宣言された変数は、暗黙的に動的として宣言されます。 変数は、varキーワードの代わりにdynamicキーワードを使用して宣言することもできます。
次の例は同じことを示しています。
void main() {
dynamic x = "tom";
print(x);
}
出力
tom
最終および定数
*final* および *const* キーワードは、定数を宣言するために使用されます。 Dartは、finalまたはconstキーワードを使用して宣言された変数の値の変更を防ぎます。 これらのキーワードは、変数のデータ型と組み合わせて、または *var* キーワードの代わりに使用できます。
*const* キーワードは、コンパイル時の定数を表すために使用されます。 *const* キーワードを使用して宣言された変数は、暗黙的にfinalです。
構文:最終キーワード
final variable_name
OR
final data_type variable_name
構文:constキーワード
const variable_name
OR
const data_type variable_name
例-最終キーワード
void main() {
final val1 = 12;
print(val1);
}
出力
12
例– constキーワード
void main() {
const pi = 3.14;
const area = pi*12*12;
print("The output is ${area}");
}
上記の例では、 const キーワードを使用して、 pi および area の2つの定数を宣言しています。 area 変数の値はコンパイル時の定数です。
出力
The output is 452.15999999999997
注-コンパイル時定数の計算に使用できるのは const 変数のみです。 コンパイル時定数は、コンパイル時に値が決定される定数です。
例
*final* またはconstキーワードで宣言された変数を変更しようとすると、Dartは例外をスローします。 以下に示す例は同じことを示しています-
void main() {
final v1 = 12;
const v2 = 13;
v2 = 12;
}
上記のコードは、次のエラーを output としてスローします-
Unhandled exception:
cannot assign to final variable 'v2='.
NoSuchMethodError: cannot assign to final variable 'v2='
#0 NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:178)
#1 main (file: Test.dart:5:3)
#2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Dartプログラミング-演算子
式は、値に評価される特別な種類のステートメントです。 すべての式はで構成されています-
- オペランド-データを表します
- 演算子-値を生成するためにオペランドを処理する方法を定義します。
次の式を考慮してください-「2 + 3」。 この式では、2と3は*オペランド*であり、記号 "+"(プラス)は*演算子*です。
この章では、Dartで使用できる演算子について説明します。
- 算術演算子
- 平等および関係演算子
- 型テスト演算子
- ビット演算子
- 割り当て演算子 *論理演算子
算術演算子
次の表に、Dartでサポートされている算術演算子を示します。
リンク:/dart_programming/dart_programming_arithmetic_operators [例を表示]
Sr.No | Operators & Meaning |
---|---|
1 |
Add |
2 |
− 引く |
3 |
-expr 単項マイナス、否定とも呼ばれます(式の符号を逆にします) |
4 | かける |
5 |
/ 割る |
6 |
~/ 除算、整数の結果を返します |
7 |
% 整数除算の剰余を取得(モジュロ) |
8 |
* * インクリメント |
9 |
-- デクリメント |
平等および関係演算子
関係演算子は、2つのエンティティ間の関係の種類をテストまたは定義します。 関係演算子はブール値、つまり 正誤。
Aの値が10で、Bが20であると仮定します。
リンク:/dart_programming/dart_programming_equality_relational_operators [例を表示]
Operator | Description | Example |
---|---|---|
> | Greater than | (A > B) is False |
< | Lesser than | (A < B) is True |
>= | Greater than or equal to | (A >= B) is False |
⇐ | Lesser than or equal to | (A ⇐ B) is True |
== | Equality | (A==B) is False |
!= | Not equal | (A!=B) is True |
型テスト演算子
これらの演算子は、実行時に型をチェックするのに便利です。
リンク:/dart_programming/dart_programming_type_test_operators [例を表示]
Operator | Meaning |
---|---|
is | True if the object has the specified type |
is! | False if the object has the specified type |
ビット演算子
次の表は、Dartで使用可能なビット演算子とその役割を示しています-
リンク:/dart_programming/dart_programming_bitwise_operators [例を表示]
Operator | Description | Example |
---|---|---|
Bitwise AND | a & b | Returns a one in each bit position for which the corresponding bits of both operands are ones. |
Bitwise OR | a | b |
Returns a one in each bit position for which the corresponding bits of either or both operands are ones. | Bitwise XOR | a ^ b |
Returns a one in each bit position for which the corresponding bits of either but not both operands are ones. | Bitwise NOT | ~ a |
Inverts the bits of its operand. | Left shift | a LT b |
Shifts a in binary representation b (< 32) bits to the left, shifting in zeroes from the right. | Signpropagating right shift | a GT b |
割り当て演算子
次の表に、Dartで使用可能な割り当て演算子を示します。
リンク:/dart_programming/dart_programming_assignment_operators [例を表示]
Sr.No | Operator & Description |
---|---|
1 |
=(Simple Assignment ) 右側のオペランドから左側のオペランドに値を割り当てます
|
2 |
??= 変数がnullの場合にのみ値を割り当てます |
3 |
+=(Add and Assignment) 右オペランドを左オペランドに追加し、結果を左オペランドに割り当てます。 例:C + = AはC = C + Aと同等 |
4 |
─=(Subtract and Assignment) 左のオペランドから右のオペランドを減算し、結果を左のオペランドに割り当てます。 例:C-= AはC = C – Aと同等 |
5 |
*=(Multiply and Assignment) 右オペランドと左オペランドを乗算し、結果を左オペランドに割り当てます。 例:C = AはC = C Aと同等 |
6 |
/=(Divide and Assignment) 左のオペランドを右のオペランドで除算し、結果を左のオペランドに割り当てます。 |
注-ビットごとの演算子にも同じロジックが適用されるため、&Lt; =、&Gt; =、&Gt; =、&Gt; =、| =および^ =になります。
論理演算子
論理演算子は、2つ以上の条件を結合するために使用されます。 論理演算子はブール値を返します。 変数Aの値が10で、Bが20であると仮定します。
リンク:/dart_programming/dart_programming_logical_operators [例を表示]
Operator | Description | Example |
---|---|---|
&& | And − The operator returns true only if all the expressions specified return true | (A > 10 && B > 10) is False. |
OR − The operator returns true if at least one of the expressions specified return true | (A > 10 | |
B > 10) is True. | ! | NOT − The operator returns the inverse of the expression’s result. For E.g.: !(7>5) returns false |
条件式
Dartには、ifelseステートメントを必要とする式を評価できる2つの演算子があります-
調子 ? expr1:expr2
条件が真の場合、式は expr1 を評価します(そしてその値を返します)。それ以外の場合は、 expr2 の値を評価して返します。
expr1 ?? expr2
*expr1* がnull以外の場合、その値を返します。それ以外の場合は、 *expr2* の値を評価して返します
例
次の例は、Dartで条件式を使用する方法を示しています-
void main() {
var a = 10;
var res = a > 12 ? "value greater than 10":"value lesser than or equal to 10";
print(res);
}
それは次の出力を生成します-
value lesser than or equal to 10
例
別の例を見てみましょう-
void main() {
var a = null;
var b = 12;
var res = a ?? b;
print(res);
}
それは次の出力を生成します-
12
Dartプログラミング-ループ
時々、特定の命令は繰り返し実行する必要があります。 ループは同じことを行う理想的な方法です。 ループは、繰り返す必要がある一連の命令を表します。 ループのコンテキストでは、繰り返しは*反復*と呼ばれます。
次の図は、ループの分類を示しています-
確定ループで議論を始めましょう。 反復回数が確定/固定されているループは、*確定ループ*と呼ばれます。
Sr.No | Loop & Description |
---|---|
1 |
|
2 |
for … inループは、オブジェクトのプロパティをループするために使用されます。 |
次に、不定ループについて説明します。 不定ループは、ループ内の反復回数が不確定または不明な場合に使用されます。 を使用して無限ループを実装することができます-
Sr.No | Loop & Description |
---|---|
1 |
whileループは、指定された条件がtrueと評価されるたびに命令を実行します。 言い換えると、ループはコードブロックが実行される前に条件を評価します。 |
2 |
do … whileループは、do … whileループがループの最初の実行時に条件を評価しないことを除いて、whileループに似ています。 |
次に、Dartの Loop Control Statements について説明します。
Sr.No | Control Statement & Description |
---|---|
1 |
|
2 |
|
ラベルを使用してフローを制御する
ラベル*は、ステートメントまたはコードブロックに適用されるコロン(:)が後に続く単なる識別子です。 ラベルを *break および continue とともに使用して、フローをより正確に制御できます。
*'continue'* または *'break'* ステートメントとそのラベル名の間で改行することはできません。 また、ラベル名と関連するループの間に他のステートメントがあってはなりません。
例:ブレーク付きのラベル
void main() {
outerloop://This is the label name
for (var i = 0; i < 5; i++) {
print("Innerloop: ${i}");
innerloop:
for (var j = 0; j < 5; j++) {
if (j > 3 ) break ;
//Quit the innermost loop
if (i == 2) break innerloop;
//Do the same thing
if (i == 4) break outerloop;
//Quit the outer loop
print("Innerloop: ${j}");
}
}
}
上記のコードが正常に実行されると、次の output が表示されます。
Innerloop: 0
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 1
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 2
Innerloop: 3
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 4
例:継続のラベル
void main() {
outerloop://This is the label name
for (var i = 0; i < 3; i++) {
print("Outerloop:${i}");
for (var j = 0; j < 5; j++) {
if (j == 3){
continue outerloop;
}
print("Innerloop:${j}");
}
}
}
上記のコードが正常に実行されると、次の出力が表示されます。
Outerloop: 0
Innerloop: 0
Innerloop: 1
Innerloop: 2
Outerloop: 1
Innerloop: 0
Innerloop: 1
Innerloop: 2
Outerloop: 2
Innerloop: 0
Innerloop: 1
Innerloop: 2
Dartプログラミング-意思決定
条件付き/意思決定構造は、命令が実行される前に条件を評価します。
Dartの条件付きコンストラクトは、次の表に分類されます。
Sr.No | Statement & Description |
---|---|
1 |
|
2 |
|
3 |
|
4 |
switchステートメントは式を評価し、式の値をcase句に一致させ、そのケースに関連付けられたステートメントを実行します。 |
Dartプログラミング-数字
ダーツ番号は次のように分類できます-
int -任意のサイズの整数。 int データ型は、整数を表すために使用されます。
double -IEEE 754標準で指定されている64ビット(倍精度)浮動小数点数。 double データ型は、小数を表すために使用されます
*num* タイプは、 *int* および *double* タイプに継承されます。 * dartコアライブラリ*は、数値に対する多数の操作を許可します。
番号を宣言するための構文は以下のとおりです-
int var_name; //declares an integer variable
double var_name; //declares a double variable
例
void main() {
//declare an integer
int num1 = 10;
//declare a double value
double num2 = 10.50;
//print the values
print(num1);
print(num2);
}
それは次の出力を生成します-
10
10.5
注-小数値が整数変数に割り当てられている場合、 Dart VM は例外をスローします。
構文解析
- parse()*静的関数を使用すると、数値リテラルを含む文字列を数値に解析できます。 次の図は同じことを示しています-
void main() {
print(num.parse('12'));
print(num.parse('10.91'));
}
上記のコードは、次の出力になります-
12
10.91
解析関数は、数字以外の値が渡されると FormatException をスローします。 次のコードは、英数字の値を* parse()*関数に渡す方法を示しています。
例
void main() {
print(num.parse('12A'));
print(num.parse('AAAA'));
}
上記のコードは、次の出力になります-
Unhandled exception:
FormatException: 12A
#0 num.parse (dart:core/num.dart:446)
#1 main (file:///D:/Demos/numbers.dart:4:13)
#2 _startIsolate.<anonymous closure> (dart:isolatepatch/isolate_patch.dart:261)
#3 _RawReceivePortImpl._handleMessage (dart:isolatepatch/isolate_patch.dart:148)
数値のプロパティ
次の表に、Dart番号でサポートされているプロパティを示します。
Sr.No | Property & Description |
---|---|
1 |
数値のハッシュコードを返します。 |
2 |
数が有限であれば真。それ以外の場合はfalse。 |
3 |
数値が正の無限大または負の無限大の場合は真。それ以外の場合はfalse。 |
4 |
isNan 数値が二重のNot-a-Number値である場合はtrue。それ以外の場合はfalse。 |
5 |
数値が負の場合は真。それ以外の場合はfalse。 |
6 |
数値の符号と数値に応じて、マイナス1、ゼロ、またはプラス1を返します。 |
7 |
数値が偶数の場合、trueを返します。 |
8 |
数値が奇数の場合、trueを返します。 |
数値メソッド
以下は、数字でサポートされている一般的に使用される方法のリストです-
シニア
方法と説明
1
リンク:/dart_programming/dart_programming_abs_method [abs]
数値の絶対値を返します。
2
リンク:/dart_programming/dart_programming_ceil_method [ceil]
数値以上の最小の整数を返します。
3
リンク:/dart_programming/dart_programming_compareto_method [compareTo]
これを他の数値と比較します。
4
リンク:/dart_programming/dart_programming_floor_method [Floor]
現在の数値以下の最大の整数を返します。
5
リンク:/dart_programming/dart_programming_remainder_method [remainder]
2つの数値を除算した後、切り捨てられた剰余を返します。
6
リンク:/dart_programming/dart_programming_round_method [Round]
現在の数値に最も近い整数を返します。
7
リンク:/dart_programming/dart_programming_todouble_method [toDouble]
数値の2倍に相当する値を返します。
8
リンク:/dart_programming/dart_programming_toint_method [toInt]
数値に相当する整数を返します。
9
リンク:/dart_programming/dart_programming_number_tostring_method [toString]
文字列に相当する数値の表現を返します。
10
リンク:/dart_programming/dart_programming_truncate_method [truncate]
小数桁を破棄した後に整数を返します。
Dartプログラミング-文字列
Stringデータ型は、一連の文字を表します。 Dart文字列は、UTF 16コードユニットのシーケンスです。
Dartの文字列値は、単一引用符、二重引用符、または三重引用符を使用して表すことができます。 単一行ストリングは、単一引用符または二重引用符を使用して表されます。 三重引用符は、複数行の文字列を表すために使用されます。
Dartで文字列値を表す構文は以下のとおりです-
構文
String variable_name = 'value'
OR
String variable_name = ''value''
OR
String variable_name = '''line1
line2'''
OR
String variable_name= ''''''line1
line2''''''
次の例は、DartでのStringデータ型の使用を示しています。
void main() {
String str1 = 'this is a single line string';
String str2 = "this is a single line string";
String str3 = '''this is a multiline line string''';
String str4 = """this is a multiline line string""";
print(str1);
print(str2);
print(str3);
print(str4);
}
次の Output が生成されます-
this is a single line string
this is a single line string
this is a multiline line string
this is a multiline line string
文字列は不変です。 ただし、文字列にはさまざまな操作を行うことができ、結果の文字列は新しい値として保存できます。
文字列補間
静的文字列に値を追加して新しい文字列を作成するプロセスは、*連結*または*補間*と呼ばれます。 つまり、文字列を別の文字列に追加するプロセスです。
演算子プラス(+)は、文字列を連結/補間するために一般的に使用されるメカニズムです。
例1
void main() {
String str1 = "hello";
String str2 = "world";
String res = str1+str2;
print("The concatenated string : ${res}");
}
次の output が生成されます-
The concatenated string : Helloworld
例2
「$ \ {}」を使用して、文字列内のDart式の値を補間できます。 次の例は同じことを示しています。
void main() {
int n=1+1;
String str1 = "The sum of 1 and 1 is ${n}";
print(str1);
String str2 = "The sum of 2 and 2 is ${2+2}";
print(str2);
}
次の output が生成されます-
The sum of 1 and 1 is 2
The sum of 2 and 2 is 4
文字列のプロパティ
次の表にリストされているプロパティはすべて読み取り専用です。
Sr.No | Property & Description |
---|---|
1 |
この文字列のUTF-16コード単位の変更不可能なリストを返します。 |
2 |
この文字列が空の場合、trueを返します。 |
3 |
スペース、タブ、改行文字を含む文字列の長さを返します。 |
文字列を操作するメソッド
- dart:コアライブラリ*のStringクラスは、文字列を操作するメソッドも提供します。 これらの方法のいくつかを以下に示します-
Sr.No | Methods & Description |
---|---|
1 |
この文字列のすべての文字を小文字に変換します。 |
2 |
この文字列のすべての文字を大文字に変換します。 |
3 |
先頭および末尾の空白なしで文字列を返します。 |
4 |
このオブジェクトを別のオブジェクトと比較します。 |
5 |
指定されたパターンに一致するすべての部分文字列を指定された値に置き換えます。 |
6 |
指定された区切り文字の一致で文字列を分割し、部分文字列のリストを返します。 |
7 |
startIndex(両端を含む)からendIndex(排他的)に及ぶこの文字列の部分文字列を返します。 |
8 |
このオブジェクトの文字列表現を返します。 |
9 |
指定されたインデックスで16ビットUTF-16コード単位を返します。 |
Dartプログラミング-ブール
Dartは、ブールデータ型の組み込みサポートを提供します。 DARTのブールデータ型は、trueとfalseの2つの値のみをサポートします。 キーワードboolは、DARTでブールリテラルを表すために使用されます。
DARTでブール変数を宣言するための構文は以下のとおりです-
bool var_name = true;
OR
bool var_name = false
例
void main() {
bool test;
test = 12 > 5;
print(test);
}
次の output が生成されます-
true
例
JavaScriptとは異なり、ブールデータ型はリテラルtrueのみをtrueとして認識します。 その他の値はすべて偽と見なされます。 次の例を考慮してください-
var str = 'abc';
if(str) {
print('String is not empty');
} else {
print('Empty String');
}
上記のスニペットをJavaScriptで実行すると、文字列が空でない場合にif構造体がtrueを返すため、「文字列が空ではありません」というメッセージが出力されます。
ただし、Dartでは、 str はstr!= true_として_falseに変換されます。 そのため、スニペットは_ ‘空の文字列’ _というメッセージを出力します(チェックなしモードで実行した場合)。
例
上記のスニペットを checked モードで実行すると、例外がスローされます。 同じことを以下に示します-
void main() {
var str = 'abc';
if(str) {
print('String is not empty');
} else {
print('Empty String');
}
}
*Checked Mode* で次の *output* を生成します-
Unhandled exception:
type 'String' is not a subtype of type 'bool' of 'boolean expression' where
String is from dart:core
bool is from dart:core
#0 main (file:///D:/Demos/Boolean.dart:5:6)
#1 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261)
#2 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
*Unchecked Mode* で、次の *output* を生成します-
Empty String
注- WebStorm IDEはデフォルトでチェックモードで実行されます。
Dartプログラミング-リスト
プログラミングで非常に一般的に使用されるコレクションは、配列*です。 Dartは、 *List オブジェクトの形式で配列を表します。 リスト*は、単にオブジェクトの順序付けられたグループです。 *dart:core ライブラリは、リストの作成と操作を可能にするListクラスを提供します。
Dartのリストの論理表現は以下のとおりです-
- test_list -コレクションを参照する識別子です。
- リストには、値12、13、および14が含まれます。 これらの値を保持するメモリブロックは、*要素*と呼ばれます。
- リストの各要素は、インデックス*と呼ばれる一意の番号で識別されます。 インデックスは *zero から始まり、 n-1 まで拡張されます。 n はリスト内の要素の総数です。 インデックスは*添え字*とも呼ばれます。
リストは次のように分類できます-
- 固定長リスト
- 成長可能なリスト
ここで、これら2つのタイプの*リスト*について詳しく説明します。
固定長リスト
固定長リストの長さは実行時に変更できません。 固定長リストを作成するための構文は以下のとおりです-
ステップ1-リストの宣言
固定長リストを宣言するための構文は以下のとおりです-
var list_name = new List(initial_size)
上記の構文は、指定されたサイズのリストを作成します。 リストは実行時に拡大または縮小できません。 リストのサイズを変更しようとすると、例外が発生します。
ステップ2-リストの初期化
リストを初期化するための構文は以下のとおりです-
lst_name[index] = value;
例
void main() {
var lst = new List(3);
lst[0] = 12;
lst[1] = 13;
lst[2] = 11;
print(lst);
}
次の output が生成されます-
[12, 13, 11]
成長可能なリスト
成長可能なリストの長さは、実行時に変更できます。 拡張可能リストを宣言および初期化するための構文は以下のとおりです-
ステップ1-リストの宣言
var list_name = [val1,val2,val3]
--- creates a list containing the specified values
OR
var list_name = new List()
--- creates a list of size zero
ステップ2-リストの初期化
インデックス/サブスクリプトは、値が入力される要素を参照するために使用されます。 リストを初期化するための構文は以下のとおりです-
list_name[index] = value;
例
次の例は、3つの要素のリストを作成する方法を示しています。
void main() {
var num_list = [1,2,3];
print(num_list);
}
次の output が生成されます-
[1, 2, 3]
例
次の例では、* empty List()コンストラクター*を使用して長さゼロのリストを作成します。 List クラスの* add()*関数は、リストに要素を動的に追加するために使用されます。
void main() {
var lst = new List();
lst.add(12);
lst.add(13);
print(lst);
}
次の output が生成されます-
[12, 13]
リストのプロパティ
次の表に、* dart:coreライブラリ*の List クラスで一般的に使用されるいくつかのプロパティを示します。
Sr.No | Methods & Description |
---|---|
1 |
最初の要素のケースを返します。 |
2 |
コレクションに要素がない場合はtrueを返します。 |
3 |
コレクションに少なくとも1つの要素がある場合、trueを返します。 |
4 |
リストのサイズを返します。 |
5 |
リストの最後の要素を返します。 |
6 |
リストの値を逆順に含む反復可能なオブジェクトを返します。 |
7 |
リストに要素が1つだけあるかどうかを確認して返します。 |
Dartプログラミング-リスト(基本操作)
この章では、次のようなリストの基本的な操作を実行する方法について説明します-
Sr.No | Basic Operation & Description |
---|---|
1 |
Inserting Elements into a List 可変リストは、実行時に動的に拡大できます。 * List.add()*関数は、指定された値をリストの最後に追加し、変更されたリストオブジェクトを返します。 |
2 |
Dartのリストは、次の方法で更新できます-
|
3 |
dart:coreライブラリのListクラスでサポートされている次の関数を使用して、リスト内のアイテムを削除できます。 |
Dartプログラミング-マップ
Mapオブジェクトは、単純なキー/値のペアです。 マップ内のキーと値はどのタイプでもかまいません。 マップは動的なコレクションです。 つまり、マップは実行時に拡大および縮小することができます。
マップは2つの方法で宣言することができます-
- マップリテラルの使用
- Mapコンストラクターを使用する
マップリテラルを使用したマップの宣言
マップリテラルを使用してマップを宣言するには、キーと値のペアを中括弧 "\ {}" のペアで囲む必要があります。
ここにその*構文*があります-
var identifier = { key1:value1, key2:value2 [,…..,key_n:value_n] }
マップコンストラクターを使用してマップを宣言する
Mapコンストラクターを使用してMapを宣言するには、2つのステップがあります。 まず、マップを宣言し、次にマップを初期化します。
- マップを宣言する*構文*は次のとおりです-
var identifier = new Map()
さて、次の構文を使用して*マップを初期化*-
map_name[key] = value
例:マップリテラル
void main() {
var details = {'Usrname':'tom','Password':'pass@123'};
print(details);
}
次の output が生成されます-
{Usrname: tom, Password: pass@123}
例:実行時にマップリテラルに値を追加する
void main() {
var details = {'Usrname':'tom','Password':'pass@123'};
details['Uid'] = 'U1oo1';
print(details);
}
次の output が生成されます-
{Usrname: tom, Password: pass@123, Uid: U1oo1}
例:マップコンストラクター
void main() {
var details = new Map();
details['Usrname'] = 'admin';
details['Password'] = 'admin@123';
print(details);
}
次の output が生成されます-
{Usrname: admin, Password: admin@123}
注-マップ値には、NULLを含む任意のオブジェクトを指定できます。
マップ-プロパティ
dart:coreパッケージの Map クラスは、次のプロパティを定義します-
Sr.No | Property & Description |
---|---|
1 |
キーを表す反復可能なオブジェクトを返します |
2 |
値を表す反復可能なオブジェクトを返します |
3 |
マップのサイズを返します |
4 |
マップが空のマップの場合、trueを返します |
5 |
マップが空のマップの場合、trueを返します |
マップ-機能
以下は、Dartでマップを操作するために一般的に使用される関数です。
Sr.No | Function Name & Description |
---|---|
1 |
otherのすべてのキーと値のペアをこのマップに追加します。 |
2 |
マップからすべてのペアを削除します。 |
3 |
キーおよびキーに関連付けられた値(存在する場合)をマップから削除します。 |
4 |
マップの各キーと値のペアにfを適用します。 |
Dartプログラミング-シンボル
Dartのシンボルは、ライブラリのメタデータを反映するために使用される不透明で動的な文字列名です。 簡単に言えば、シンボルは、人間が読める文字列とコンピューターで使用するために最適化された文字列との関係を保存する方法です。
リフレクションは、クラス内のメソッドの数、クラスに含まれるコンストラクターの数、関数内のパラメーターの数など、実行時に型のメタデータを取得するメカニズムです。 実行時にロードされるタイプのメソッドを呼び出すこともできます。
Dartリフレクションでは、特定のクラスが dart:mirrors パッケージで利用可能です。 このライブラリは、Webアプリケーションとコマンドラインアプリケーションの両方で機能します。
構文
Symbol obj = new Symbol('name');
//expects a name of class or function or library to reflect
*name* は、有効なパブリックDartメンバー名、パブリックコンストラクター名、またはライブラリ名でなければなりません。
例
次の例を考えてください。 このコードは、ライブラリ foo_lib でクラス Foo を宣言します。 このクラスは、 m1、m2 、および m3 メソッドを定義します。
Foo.dart
library foo_lib;
//libarary name can be a symbol
class Foo {
//class name can be a symbol
m1() {
//method name can be a symbol
print("Inside m1");
}
m2() {
print("Inside m2");
}
m3() {
print("Inside m3");
}
}
次のコードは、 Foo.dart ライブラリをロードし、Symbolタイプを使用してFooクラスを検索します。 上記のライブラリのメタデータを反映しているため、コードは dart:mirrors ライブラリをインポートします。
FooSymbol.dart
import 'dart:core';
import 'dart:mirrors';
import 'Foo.dart';
main() {
Symbol lib = new Symbol("foo_lib");
//library name stored as Symbol
Symbol clsToSearch = new Symbol("Foo");
//class name stored as Symbol
if(checkIf_classAvailableInlibrary(lib, clsToSearch))
//searches Foo class in foo_lib library
print("class found..");
}
bool checkIf_classAvailableInlibrary(Symbol libraryName, Symbol className) {
MirrorSystem mirrorSystem = currentMirrorSystem();
LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName);
if (libMirror != null) {
print("Found Library");
print("checkng...class details..");
print("No of classes found is : ${libMirror.declarations.length}");
libMirror.declarations.forEach((s, d) => print(s));
if (libMirror.declarations.containsKey(className)) return true;
return false;
}
}
libMirror.declarations.forEach((s、d)⇒ print(s));という行に注意してください。実行時にライブラリ内のすべての宣言を反復処理し、宣言を Symbol のタイプとして出力します。
このコードは、次の*出力*を生成する必要があります-
Found Library
checkng...class details..
No of classes found is : 1
Symbol("Foo")//class name displayed as symbol
class found.
例:クラスのインスタンスメソッドの数を表示する
クラス内のインスタンスメソッドの数を表示することを考えてみましょう。 定義済みのクラス ClassMirror は、同じことを達成するのに役立ちます。
import 'dart:core';
import 'dart:mirrors';
import 'Foo.dart';
main() {
Symbol lib = new Symbol("foo_lib");
Symbol clsToSearch = new Symbol("Foo");
reflect_InstanceMethods(lib, clsToSearch);
}
void reflect_InstanceMethods(Symbol libraryName, Symbol className) {
MirrorSystem mirrorSystem = currentMirrorSystem();
LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName);
if (libMirror != null) {
print("Found Library");
print("checkng...class details..");
print("No of classes found is : ${libMirror.declarations.length}");
libMirror.declarations.forEach((s, d) => print(s));
if (libMirror.declarations.containsKey(className)) print("found class");
ClassMirror classMirror = libMirror.declarations[className];
print("No of instance methods found is ${classMirror.instanceMembers.length}");
classMirror.instanceMembers.forEach((s, v) => print(s));
}
}
このコードは、次の*出力*を生成する必要があります-
Found Library
checkng...class details..
No of classes found is : 1
Symbol("Foo")
found class
No of instance methods found is 8
Symbol("==")
Symbol("hashCode")
Symbol("toString")
Symbol("noSuchMethod")
Symbol("runtimeType")
Symbol("m1")
Symbol("m2")
Symbol("m3")
シンボルを文字列に変換
*MirrorSystem* クラスを使用して、シンボルに格納されているクラスやライブラリなどのタイプの名前を文字列に変換できます。 次のコードは、シンボルを文字列に変換する方法を示しています。
import 'dart:mirrors';
void main(){
Symbol lib = new Symbol("foo_lib");
String name_of_lib = MirrorSystem.getName(lib);
print(lib);
print(name_of_lib);
}
次の output が生成されるはずです-
Symbol("foo_lib")
foo_lib
Dartプログラミング-ルーン文字
文字列は文字のシーケンスです。 Dartは、文字列をUnicode UTF-16コードユニットのシーケンスとして表します。 Unicodeは、文字、数字、記号ごとに一意の数値を定義する形式です。
Dart文字列はUTF-16コードユニットのシーケンスであるため、文字列内の32ビットUnicode値は特別な構文を使用して表されます。 rune は、Unicodeコードポイントを表す整数です。
*dart:core* ライブラリのStringクラスは、 *runes* にアクセスするメカニズムを提供します。 文字列コード単位/ルーンは3つの方法でアクセスできます-
- String.codeUnitAt()関数を使用する
- String.codeUnitsプロパティを使用する
- String.runesプロパティを使用する
String.codeUnitAt()関数
文字列内のコード単位には、インデックスを介してアクセスできます。 指定されたインデックスで16ビットUTF-16コード単位を返します。
構文
String.codeUnitAt(int index);
例
import 'dart:core';
void main(){
f1();
}
f1() {
String x = 'Runes';
print(x.codeUnitAt(0));
}
次の output が生成されます-
82
String.codeUnitsプロパティ
このプロパティは、指定された文字列のUTF-16コード単位の変更不可能なリストを返します。
構文
String. codeUnits;
例
import 'dart:core';
void main(){
f1();
}
f1() {
String x = 'Runes';
print(x.codeUnits);
}
次の output が生成されます-
[82, 117, 110, 101, 115]
String.runesプロパティ
このプロパティは、この string.Runes のUnicodeコードポイントの反復可能オブジェクトを返します。
構文
String.runes
例
void main(){
"A string".runes.forEach((int rune) {
var character=new String.fromCharCode(rune);
print(character);
});
}
次の output が生成されます-
A
s
t
r
i
n
g
通常、Unicodeコードポイントは \ uXXXX として表されます。XXXXは4桁の16進値です。 4桁以上または16進数未満を指定するには、値を中括弧で囲みます。 同じためにdart:coreライブラリのRunesクラスのコンストラクタを使用できます。
例
main() {
Runes input = new Runes(' \u{1f605} ');
print(new String.fromCharCodes(input));
}
次の output が生成されます-
Dartプログラミング-列挙
名前付き定数値の定義には列挙が使用されます。 列挙型は、 enum キーワードを使用して宣言されます。
構文
enum enum_name {
enumeration list
}
どこで、
- _enum_name_は、列挙型の名前を指定します
- _enumeration list_は、コンマ区切りの識別子のリストです
列挙リスト内の各シンボルは整数値を表し、その前のシンボルよりも1つ大きくなります。 デフォルトでは、最初の列挙シンボルの値は0です。
例えば
enum Status {
none,
running,
stopped,
paused
}
例
enum Status {
none,
running,
stopped,
paused
}
void main() {
print(Status.values);
Status.values.forEach((v) => print('value: $v, index: ${v.index}'));
print('running: ${Status.running}, ${Status.running.index}');
print('running index: ${Status.values[1]}');
}
次の output が生成されます-
[Status.none, Status.running, Status.stopped, Status.paused]
value: Status.none, index: 0
value: Status.running, index: 1
value: Status.stopped, index: 2
value: Status.paused, index: 3
running: Status.running, 1
running index: Status.running
Dartプログラミング-関数
関数は、読み取り可能、保守可能、および再利用可能なコードの構成要素です。 関数は、特定のタスクを実行するための一連のステートメントです。 関数は、プログラムをコードの論理ブロックに編成します。 定義すると、コードにアクセスするために関数を呼び出すことができます。 これにより、コードが再利用可能になります。 さらに、関数を使用すると、プログラムのコードの読み取りと保守が簡単になります。
関数宣言は、関数の名前、戻り値の型、およびパラメーターについてコンパイラーに通知します。 関数定義は、関数の実際の本体を提供します。
Sr.No | Functions & Description |
---|---|
1 |
関数定義は、特定のタスクの実行内容と方法を指定します。 |
2 |
関数を実行するには、関数を呼び出す必要があります。 |
3 |
関数は、制御とともに値を呼び出し元に戻すこともできます。 |
4 |
パラメータは、値を関数に渡すメカニズムです。 |
オプションのパラメータ
オプションのパラメーターは、関数の実行のために引数を強制的に渡す必要がない場合に使用できます。 パラメータには、名前に疑問符を追加することにより、オプションとしてマークできます。 オプションのパラメーターは、関数の最後の引数として設定する必要があります。
Dartには3種類のオプションパラメータがあります-
Sr.No | Parameter & Description |
---|---|
1 |
オプションの定位置パラメーターを指定するには、角括弧[]を使用します。 |
2 |
定位置パラメーターとは異なり、パラメーターの名前は、値を渡すときに指定する必要があります。 中括弧\ {}を使用して、オプションの名前付きパラメーターを指定できます。 |
3 |
Optional Parameters with Default Values 関数パラメーターには、デフォルトで値を割り当てることもできます。 ただし、このようなパラメーターは明示的に値を渡すこともできます。 |
再帰ダーツ関数
再帰は、結果に到達するまで関数呼び出しを繰り返し実行することにより、操作を反復する手法です。 再帰は、ループ内から異なるパラメーターを使用して同じ関数を繰り返し呼び出す必要がある場合に最適です。
例
void main() {
print(factorial(6));
}
factorial(number) {
if (number <= 0) {
//termination case
return 1;
} else {
return (number * factorial(number - 1));
//function invokes itself
}
}
次の output が生成されるはずです-
720
ラムダ関数
Lambda関数は、関数を表す簡潔なメカニズムです。 これらの関数は、矢印関数とも呼ばれます。
構文
[return_type]function_name(parameters)=>expression;
例
void main() {
printMsg();
print(test());
}
printMsg()=>
print("hello");
int test()=>123;
//returning function
次の output が生成されるはずです-
hello 123
Dartプログラミング-インターフェイス
*interface* は、エンティティが従わなければならない構文を定義します。 インターフェイスは、オブジェクトで使用できるメソッドのセットを定義します。 Dartには、インターフェイスを宣言するための構文がありません。 クラス宣言自体は、Dartのインターフェースです。
- クラス*は、インターフェイスを使用できるようにimplementsキーワードを使用する必要があります。 実装クラスには、実装されたインターフェースのすべての機能の具体的な実装を提供することが必須です。 言い換えれば、クラスは実装したいインターフェースのすべての関数を再定義しなければなりません。
構文:インターフェースの実装
class identifier implements interface_name
例
次のプログラムでは、クラス Printer を宣言しています。 ConsolePrinter クラスは、 Printer クラスの暗黙的なインターフェイス宣言を実装します。 main 関数は、 new キーワードを使用して ConsolePrinter クラスのオブジェクトを作成します。 このオブジェクトは、 ConsolePrinter クラスで定義された関数 print_data を呼び出すために使用されます。
void main() {
ConsolePrinter cp= new ConsolePrinter();
cp.print_data();
}
class Printer {
void print_data() {
print("__________Printing Data__________");
}
}
class ConsolePrinter implements Printer {
void print_data() {
print("__________Printing to Console__________");
}
}
次の output が生成されるはずです-
__________Printing to Console__________
複数のインターフェースの実装
クラスは複数のインタフェースを実装できます。 インターフェイスはコンマで区切られます。 同じための*構文*は以下に示されています-
class identifier implements interface-1,interface_2,interface_4…….
次の*例*は、Dartで複数のインターフェイスを実装する方法を示しています-
void main() {
Calculator c = new Calculator();
print("The gross total : ${c.ret_tot()}");
print("Discount :${c.ret_dis()}");
}
class Calculate_Total {
int ret_tot() {}
}
class Calculate_Discount {
int ret_dis() {}
}
class Calculator implements Calculate_Total,Calculate_Discount {
int ret_tot() {
return 1000;
}
int ret_dis() {
return 50;
}
}
次の output が生成されるはずです-
The gross total: 1000
Discount:50
Dartプログラミング-クラス
Dartはオブジェクト指向言語です。 クラス、インターフェースなどのオブジェクト指向プログラミング機能をサポートしています。 OOPに関する class は、オブジェクトを作成するための青写真です。 class はオブジェクトのデータをカプセル化します。 Dartは、 class と呼ばれるこの概念の組み込みサポートを提供します。
クラスを宣言する
*class* キーワードを使用して、Dartで *class* を宣言します。 クラス定義は、キーワードclassで始まり、その後に *class name* が続きます。クラス本体は、中括弧のペアで囲まれています。 同じための構文は以下のとおりです-
構文
class class_name {
<fields>
<getters/setters>
<constructors>
<functions>
}
*class* キーワードの後にクラス名が続きます。 クラスに名前を付けるときは、識別子の規則を考慮する必要があります。
クラス定義には、次のものを含めることができます-
- フィールド-フィールドは、クラスで宣言された変数です。 フィールドは、オブジェクトに関連するデータを表します。
- セッターとゲッター-プログラムがクラスのフィールドの値を初期化および取得できるようにします。 デフォルトのゲッター/セッターはすべてのクラスに関連付けられています。 ただし、セッター/ゲッターを明示的に定義することにより、デフォルトのものをオーバーライドできます。
- コンストラクタ-クラスのオブジェクトにメモリを割り当てる役割を担います。
- 関数-関数はオブジェクトが実行できるアクションを表します。 また、メソッドと呼ばれることもあります。
これらのコンポーネントをまとめて、クラスの*データメンバー*と呼びます。
例:クラスの宣言
class Car {
//field
String engine = "E1001";
//function
void disp() {
print(engine);
}
}
この例では、クラス Car を宣言しています。 クラスには engine という名前のフィールドがあります。 * disp()は、フィールド *engine の値を出力する単純な関数です。
クラスのインスタンスの作成
クラスのインスタンスを作成するには、 new キーワードにクラス名を続けて使用します。 同じための構文は以下のとおりです-
構文
var object_name = new class_name([ arguments ])
- new キーワードはインスタンス化を担当します。
- 式の右側は、コンストラクターを呼び出します。 パラメーター化されている場合、コンストラクターに値を渡す必要があります。
例:クラスのインスタンス化
var obj = new Car("Engine 1")
属性と機能へのアクセス
クラスの属性と機能は、オブジェクトを介してアクセスできます。 クラスのデータメンバーにアクセスするには、「。」ドット表記(*ピリオドと呼ばれる)を使用します。
//accessing an attribute
obj.field_name
//accessing a function
obj.function_name()
例
Dartの属性と機能にアクセスする方法を理解するために、次の例を見てください-
void main() {
Car c= new Car();
c.disp();
}
class Car {
//field
String engine = "E1001";
//function
void disp() {
print(engine);
}
}
上記のコードの*出力*は次のとおりです-
E1001
Dartコンストラクター
コンストラクターは、クラスの変数の初期化を担当するクラスの特別な関数です。 Dartは、クラスの名前と同じ名前のコンストラクターを定義します。 コンストラクターは関数であるため、パラメーター化できます。 ただし、関数とは異なり、コンストラクターは戻り値の型を持つことはできません。 コンストラクターを宣言しない場合、デフォルトの*引数なしコンストラクター*が提供されます。
構文
Class_name(parameter_list) {
//constructor body
}
例
次の例は、Dartでコンストラクタを使用する方法を示しています-
void main() {
Car c = new Car('E1001');
}
class Car {
Car(String engine) {
print(engine);
}
}
次の output が生成されるはずです-
E1001
名前付きコンストラクター
Dartは named constructors を提供して、クラスが*複数のコンストラクター*を定義できるようにします。 名前付きコンストラクタの構文は以下のとおりです-
構文:コンストラクターの定義
Class_name.constructor_name(param_list)
例
次の例は、Dartで名前付きコンストラクタを使用する方法を示しています-
void main() {
Car c1 = new Car.namedConst('E1001');
Car c2 = new Car();
}
class Car {
Car() {
print("Non-parameterized constructor invoked");
}
Car.namedConst(String engine) {
print("The engine is : ${engine}");
}
}
次の output が生成されるはずです-
The engine is : E1001
Non-parameterized constructor invoked
thisキーワード
*this* キーワードは、クラスの現在のインスタンスを参照します。 ここで、パラメーター名とクラスのフィールドの名前は同じです。 したがって、あいまいさを避けるために、クラスのフィールドの先頭には *this* キーワードが付きます。 次の例は同じを説明します-
例
次の例では、Dartで this キーワードを使用する方法を説明します-
void main() {
Car c1 = new Car('E1001');
}
class Car {
String engine;
Car(String engine) {
this.engine = engine;
print("The engine is : ${engine}");
}
}
次の output が生成されるはずです-
The engine is : E1001
Dart Class─ゲッターとセッター
*accessor* および *mutators* とも呼ばれる *Getters* および *Setters* を使用すると、プログラムはそれぞれクラスフィールドの値を初期化および取得できます。 ゲッターまたはアクセサーは、 *get* キーワードを使用して定義されます。 セッターまたはミューテーターは、 *set* キーワードを使用して定義されます。
デフォルトのゲッター/セッターは、すべてのクラスに関連付けられています。 ただし、セッター/ゲッターを明示的に定義することにより、デフォルトのものをオーバーライドできます。 ゲッターにはパラメーターがなく、値を返します。セッターにはパラメーターが1つあり、値を返しません。
構文:ゲッターの定義
Return_type get identifier
{
}
構文:セッターの定義
set identifier
{
}
例
次の例は、Dartクラスで getters および setters を使用する方法を示しています-
class Student {
String name;
int age;
String get stud_name {
return name;
}
void set stud_name(String name) {
this.name = name;
}
void set stud_age(int age) {
if(age<= 0) {
print("Age should be greater than 5");
} else {
this.age = age;
}
}
int get stud_age {
return age;
}
}
void main() {
Student s1 = new Student();
s1.stud_name = 'MARK';
s1.stud_age = 0;
print(s1.stud_name);
print(s1.stud_age);
}
このプログラムコードは、次の*出力*を生成する必要があります-
Age should be greater than 5
MARK
Null
クラスの継承
Dartは、既存のクラスから新しいクラスを作成するプログラムの機能である継承の概念をサポートしています。 新しいクラスを作成するために拡張されたクラスは、親クラス/スーパークラスと呼ばれます。 新しく作成されたクラスは、子/サブクラスと呼ばれます。
クラスは、「extends」キーワードを使用して別のクラスから継承します。 子クラスは、親クラスのコンストラクタを除くすべてのプロパティとメソッドを継承します。
構文
class child_class_name extends parent_class_name
注-Dartは多重継承をサポートしていません。
例:クラスの継承
次の例では、クラス Shape を宣言しています。 このクラスは、 Circle クラスによって拡張されます。 クラス間に継承関係があるため、子クラス、つまりクラス Car は親クラスのデータメンバーへの暗黙的なアクセスを取得します。
void main() {
var obj = new Circle();
obj.cal_area();
}
class Shape {
void cal_area() {
print("calling calc area defined in the Shape class");
}
}
class Circle extends Shape {}
次の output が生成されるはずです-
calling calc area defined in the Shape class
継承の種類
継承は、次の3つのタイプにすることができます-
- Single -すべてのクラスは、1つの親クラスから最大で拡張できます。
- Multiple -クラスは複数のクラスから継承できます。 Dartは多重継承をサポートしていません。
- マルチレベル-クラスは別の子クラスから継承できます。
例
次の例は、マルチレベルの継承の仕組みを示しています-
void main() {
var obj = new Leaf();
obj.str = "hello";
print(obj.str);
}
class Root {
String str;
}
class Child extends Root {}
class Leaf extends Child {}
//indirectly inherits from Root by virtue of inheritance
クラス Leaf は、マルチレベルの継承により、RootクラスとChildクラスから属性を取得します。 その*出力*は次のとおりです-
hello
Dart –クラスの継承とメソッドのオーバーライド
メソッドのオーバーライドは、子クラスが親クラスのメソッドを再定義するメカニズムです。 次の例は同じことを示しています-
例
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
void m1(int a){ print("value of a ${a}");}
}
class Child extends Parent {
@override
void m1(int b) {
print("value of b ${b}");
}
}
次の output が生成されるはずです-
value of b 12
メソッドをオーバーライドしている間、関数パラメーターの数とタイプは一致する必要があります。 パラメーターの数またはそれらのデータ型が一致しない場合、Dartコンパイラーはエラーをスローします。 次の図は同じことを説明しています-
import 'dart:io';
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
void m1(int a){ print("value of a ${a}");}
}
class Child extends Parent {
@override
void m1(String b) {
print("value of b ${b}");
}
}
次の output が生成されるはずです-
value of b 12
静的キーワード
*static* キーワードは、クラスのデータメンバー、つまり *fields* および *methods* に適用できます。 静的変数は、プログラムが実行を終了するまでその値を保持します。 静的メンバーはクラス名によって参照されます。
例
class StaticMem {
static int num;
static disp() {
print("The value of num is ${StaticMem.num}") ;
}
}
void main() {
StaticMem.num = 12;
//initialize the static variable }
StaticMem.disp();
//invoke the static method
}
次の output が生成されるはずです-
The value of num is 12
スーパーキーワード
*super* キーワードは、クラスの直接の親を参照するために使用されます。 キーワードを使用して、*変数、プロパティ、*または*メソッド*のスーパークラスバージョンを参照できます。 次の例は同じことを示しています-
例
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
String msg = "message variable from the parent class";
void m1(int a){ print("value of a ${a}");}
}
class Child extends Parent {
@override
void m1(int b) {
print("value of b ${b}");
super.m1(13);
print("${super.msg}") ;
}
}
次の output が生成されるはずです-
value of b 12
value of a 13
message variable from the parent class
Dartプログラミング-オブジェクト
オブジェクト指向プログラミングは、オブジェクトを「定義された境界を持つエンティティ」として定義します。オブジェクトには次のものがあります-
- 状態-オブジェクトを説明します。 クラスのフィールドはオブジェクトの状態を表します。
- 動作-オブジェクトができることを説明します。
- ID -オブジェクトを類似した他のオブジェクトのセットから区別する一意の値。 2つ以上のオブジェクトが状態と動作を共有できますが、IDは共有できません。
期間演算子*(。)*は、オブジェクトと組み合わせて使用され、クラスのデータメンバーにアクセスします。
例
Dartは、オブジェクトの形式でデータを表します。 Dartのすべてのクラスは、Objectクラスを拡張します。 以下は、オブジェクトを作成して使用する簡単な例です。
class Student {
void test_method() {
print("This is a test method");
}
void test_method1() {
print("This is a test method1");
}
}
void main() {
Student s1 = new Student();
s1.test_method();
s1.test_method1();
}
次の output が生成されるはずです-
This is a test method
This is a test method1
カスケード演算子(..)
上記の例は、クラス内のメソッドを呼び出します。 ただし、関数が呼び出されるたびに、オブジェクトへの参照が必要です。 cascade operator は、一連の呼び出しがある場合の省略形として使用できます。
カスケード(.. )演算子を使用して、オブジェクトを介して一連の呼び出しを発行できます。 上記の例は、次のように書き直すことができます。
class Student {
void test_method() {
print("This is a test method");
}
void test_method1() {
print("This is a test method1");
}
}
void main() {
new Student()
..test_method()
..test_method1();
}
次の output が生成されるはずです-
This is a test method
This is a test method1
toString()メソッド
この関数は、オブジェクトの文字列表現を返します。 次の例を見て、 toString メソッドの使用方法を理解してください。
void main() {
int n = 12;
print(n.toString());
}
次の output が生成されるはずです-
12
Dartプログラミング-コレクション
Dartは他のプログラミング言語とは異なり、配列をサポートしていません。 Dartコレクションを使用して、配列などのデータ構造を複製できます。 dart:coreライブラリと他のクラスは、Dartスクリプトでのコレクションサポートを有効にします。
Dartコレクションは基本的に次のように分類できます-
Sr.No | Dart collection & Description |
---|---|
1 |
リストは、単にオブジェクトの順序付けられたグループです。 dart:core ライブラリは、リストの作成と操作を可能にするListクラスを提供します。
|
2 |
Setは、各オブジェクトが1回しか出現できないオブジェクトのコレクションを表します。 dart:coreライブラリは、同じものを実装するSetクラスを提供します。 |
3 |
Mapオブジェクトは、単純なキー/値のペアです。 マップ内のキーと値はどのタイプでもかまいません。 マップは動的なコレクションです。 つまり、マップは実行時に拡大および縮小することができます。 dart:coreライブラリのMapクラスは、同じサポートを提供します。 |
4 |
キューは、両端で操作できるコレクションです。 キューは、先入れ先出しのコレクションを構築する場合に役立ちます。 簡単に言えば、キューは一方の端からデータを挿入し、もう一方の端から削除します。 値は、挿入された順に削除または読み取られます。 |
コレクションの反復
*dart:core* ライブラリのIteratorクラスを使用すると、コレクションを簡単にたどることができます。 すべてのコレクションには *iterator* プロパティがあります。 このプロパティは、コレクション内のオブジェクトを指すイテレータを返します。
例
次の例は、反復子オブジェクトを使用してコレクションを走査する方法を示しています。
import 'dart:collection';
void main() {
Queue numQ = new Queue();
numQ.addAll([100,200,300]);
Iterator i= numQ.iterator;
while(i.moveNext()) {
print(i.current);
}
}
- moveNext()関数は、後続のエントリがあるかどうかを示すブール値を返します。 反復子オブジェクトの *current プロパティは、反復子が現在指しているオブジェクトの値を返します。
このプログラムは、次の*出力*を生成する必要があります-
100
200
300
Dartプログラミング-ジェネリック
Dartは*オプションで型指定された言語*です。 Dartのコレクションは、デフォルトでは異種です。 つまり、1つのDartコレクションでさまざまなタイプの値をホストできます。 ただし、同種の値を保持するためにDartコレクションを作成できます。 ジェネリックの概念は、同じことを達成するために使用できます。
Genericsを使用すると、コレクションに含めることができる値のデータ型に制限が適用されます。 このようなコレクションは、タイプセーフコレクションと呼ばれます。 タイプセーフは、メモリブロックに特定のデータタイプのデータのみを含めることができるようにするプログラミング機能です。
すべてのDartコレクションは、ジェネリックを介したタイプセーフ実装をサポートしています。 データ型を含む山括弧のペアを使用して、タイプセーフなコレクションを宣言します。 タイプセーフなコレクションを宣言するための構文は次のとおりです。
構文
Collection_name <data_type> identifier= new Collection_name<data_type>
List、Map、Set、およびQueueのタイプセーフな実装を以下に示します。 この機能は、上記のコレクションタイプのすべての実装でもサポートされています。
例:汎用リスト
void main() {
List <String> logTypes = new List <String>();
logTypes.add("WARNING");
logTypes.add("ERROR");
logTypes.add("INFO");
//iterating across list
for (String type in logTypes) {
print(type);
}
}
次の output が生成されるはずです-
WARNING
ERROR
INFO
指定されたタイプ以外の値を挿入しようとすると、コンパイルエラーが発生します。 次の例はこれを示しています。
例
void main() {
List <String> logTypes = new List <String>();
logTypes.add(1);
logTypes.add("ERROR");
logTypes.add("INFO");
//iterating across list
for (String type in logTypes) {
print(type);
}
}
次の output が生成されるはずです-
1
ERROR
INFO
例:汎用セット
void main() {
Set <int>numberSet = new Set<int>();
numberSet.add(100);
numberSet.add(20);
numberSet.add(5);
numberSet.add(60);
numberSet.add(70);
//numberSet.add("Tom");
compilation error;
print("Default implementation :${numberSet.runtimeType}");
for(var no in numberSet) {
print(no);
}
}
次の output が生成されるはずです-
Default implementation :_CompactLinkedHashSet<int>
100
20
5
60
70
例:汎用キュー
import 'dart:collection';
void main() {
Queue<int> queue = new Queue<int>();
print("Default implementation ${queue.runtimeType}");
queue.addLast(10);
queue.addLast(20);
queue.addLast(30);
queue.addLast(40);
queue.removeFirst();
for(int no in queue){
print(no);
}
}
次の output が生成されるはずです-
Default implementation ListQueue<int>
20
30
40
汎用マップ
タイプセーフマップ宣言は、データ型を指定します-
- キー
- 値
構文
Map <Key_type, value_type>
例
void main() {
Map <String,String>m={'name':'Tom','Id':'E1001'};
print('Map :${m}');
}
次の output が生成されるはずです-
Map :{name: Tom, Id: E1001}
Dartプログラミング-パッケージ
パッケージは、プログラミングユニットのグループをカプセル化するメカニズムです。 アプリケーションでは、サードパーティのライブラリまたはプラグインの統合が必要になる場合があります。 すべての言語には、JavaのMavenまたはGradle、.NETのNuget、Node.jsのnpmなどの外部パッケージを管理するメカニズムがあります。 Dartのパッケージマネージャーは pub です。
Pubは、リポジトリにパッケージをインストールするのに役立ちます。 ホストされるパッケージのリポジトリは、https://pub.dartlang.org/[[[3]]]にあります。
パッケージメタデータ*は、 *pubsec.yaml ファイルで定義されています。 YAMLは Yet Another Markup Language の頭字語です。 pub ツールを使用して、アプリケーションに必要なさまざまなライブラリをすべてダウンロードできます。
すべてのDartアプリケーションには、他のライブラリへのアプリケーションの依存関係と、アプリケーション名、作成者、バージョン、説明などのアプリケーションのメタデータを含む pubspec.yaml ファイルがあります。
*pubspec.yaml* ファイルの内容は次のようになります-
name: 'vector_victor'
version: 0.0.1
description: An absolute bare-bones web app.
...
dependencies: browser: '>=0.10.0 <0.11.0'
重要な* pubコマンド*は次のとおりです-
Sr.No | Command & Description |
---|---|
1 |
‘pub get’ アプリケーションが依存しているすべてのパッケージを取得するのに役立ちます。 |
2 |
‘pub upgrade’ すべての依存関係を新しいバージョンにアップグレードします。 |
3 |
‘pub build’ これはWebアプリケーションのビルドに使用され、ビルドフォルダーを作成し、それに関連するすべてのスクリプトを含めます。 |
4 |
‘pub help’ これにより、すべての異なるpubコマンドのヘルプが提供されます。 |
WebStormのようなIDEを使用している場合、pubspec.yamlを右クリックして、すべてのコマンドを直接取得できます-
パッケージのインストール
アプリケーションがxmlを解析する必要がある例を考えてみましょう。 Dart XMLは、オープンソースであり、XMLドキュメントの解析、トラバース、クエリ、および構築に適した軽量のライブラリです。
上記のタスクを達成するための手順は次のとおりです-
- ステップ1 *-以下をpubsec.yamlファイルに追加します。
name: TestApp
version: 0.0.1
description: A simple console application.
#dependencies:
# foo_bar: '>=1.0.0 <2.0.0'
dependencies: https://mail.google.com/mail/u/0/images/cleardot.gif
xml:
*pubsec.yaml* を右クリックして、依存関係を取得します。 これにより、以下に示すように* pub getコマンド*が内部的に起動されます。
ダウンロードしたパッケージとその依存パッケージは、packagesフォルダーで確認できます。
これでインストールが完了したため、プロジェクトで dart xml を参照する必要があります。 構文は次のとおりです-
import 'package:xml/xml.dart' as xml;
XML文字列を読み取る
XML文字列を読み取り、入力を確認するために、Dart XMLは* parse()*メソッドを使用します。 構文は次のとおりです-
xml.parse(String input):
例:XML文字列入力の解析
次の例は、XML文字列入力を解析する方法を示しています-
import 'package:xml/xml.dart' as xml;
void main(){
print("xml");
var bookshelfXml = '''<?xml version = "1.0"?>
<bookshelf>
<book>
<title lang = "english">Growing a Language</title>
<price>29.99</price>
</book>
<book>
<title lang = "english">Learning XML</title>
<price>39.95</price>
</book>
<price>132.00</price>
</bookshelf>''';
var document = xml.parse(bookshelfXml);
print(document.toString());
}
次の output が生成されるはずです-
xml
<?xml version = "1.0"?><bookshelf>
<book>
<title lang = "english">Growing a Language</title>
<price>29.99</price>
</book>
<book>
<title lang = "english">Learning XML</title>
<price>39.95</price>
</book>
<price>132.00</price>
</bookshelf>
Dartプログラミング-例外
例外(または例外的なイベント)は、プログラムの実行中に発生する問題です。 例外が発生すると、プログラムの通常のフローが中断され、プログラム/アプリケーションが異常終了します。
組み込みのDartの例外には次のものがあります-
Sr.No | Exceptions & Description |
---|---|
1 |
DeferredLoadException 遅延ライブラリがロードに失敗するとスローされます。 |
2 |
FormatException 文字列またはその他のデータに予期される形式がなく、解析または処理できない場合にスローされる例外。 |
3 |
IntegerDivisionByZeroException 数値がゼロで除算されるとスローされます。 |
4 |
IOException Inupt-Outputに関連するすべての例外の基本クラス。 |
5 |
IsolateSpawnException 分離を作成できない場合にスローされます。 |
6 |
Timeout 非同期結果を待っている間にスケジュールされたタイムアウトが発生したときにスローされます。 |
Dartのすべての例外は、事前定義されたクラス Exception のサブタイプです。 アプリケーションが突然終了しないように、例外を処理する必要があります。
try/on/catchブロック
*try* ブロックには、例外が発生する可能性のあるコードが埋め込まれます。 onブロックは、例外タイプを指定する必要がある場合に使用されます。 *catch* ブロックは、ハンドラーが例外オブジェクトを必要とするときに使用されます。
*try* ブロックの後には、正確に1つの *on/catch* ブロックまたは1つの *finally* ブロック(またはその両方)が続く必要があります。 tryブロックで例外が発生すると、制御は *catch* に転送されます。
例外を処理するための*構文*は以下のとおりです-
try {
//code that might throw an exception
}
on Exception1 {
//code for handling exception
}
catch Exception2 {
//code for handling exception
}
以下は覚えておくべきポイントです-
- コードスニペットは、複数の例外を処理するために複数のon/catchブロックを持つことができます。
- onブロックとcatchブロックは相互に包括的です。 tryブロックは、onブロックとcatchブロックの両方に関連付けることができます。
次のコードは、Dartでの例外処理を示しています-
例:ONブロックの使用
次のプログラムは、変数 x および y でそれぞれ表される2つの数値を除算します。 ゼロによる除算を試みるため、コードは例外をスローします。 on block には、この例外を処理するコードが含まれています。
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/y;
}
on IntegerDivisionByZeroException {
print('Cannot divide by zero');
}
}
次の output が生成されるはずです-
Cannot divide by zero
例:catchブロックの使用
次の例では、上記と同じコードを使用しています。 唯一の違いは、(ONブロックではなく)* catchブロック*に例外を処理するコードが含まれていることです。 catch のパラメーターには、実行時にスローされる例外オブジェクトが含まれます。
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/y;
}
catch(e) {
print(e);
}
}
次の output が生成されるはずです-
IntegerDivisionByZeroException
例:on…catch
次の例は、 on … catch ブロックの使用方法を示しています。
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/y;
}
on IntegerDivisionByZeroException catch(e) {
print(e);
}
}
次の output が生成されるはずです-
IntegerDivisionByZeroException
最後のブロック
*finally* ブロックには、例外の発生に関係なく実行されるコードが含まれています。 オプションの *finally* ブロックは、 *try/on/catch* の後に無条件に実行されます。
*finally* ブロックを使用するための構文は次のとおりです-
try {
//code that might throw an exception
}
on Exception1 {
//exception handling code
}
catch Exception2 {
// exception handling
}
finally {
//code that should always execute; irrespective of the exception
}
次の例は、 finally ブロックの使用法を示しています。
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/y;
}
on IntegerDivisionByZeroException {
print('Cannot divide by zero');
}
finally {
print('Finally block executed');
}
}
次の output が生成されるはずです-
Cannot divide by zero
Finally block executed
例外を投げる
*throw* キーワードは、明示的に例外を発生させるために使用されます。 発生した例外は、プログラムが突然終了するのを防ぐために処理する必要があります。
明示的に例外を発生させるための*構文*は-
throw new Exception_name()
例
次の例は、 throw キーワードを使用して例外をスローする方法を示しています-
main() {
try {
test_age(-2);
}
catch(e) {
print('Age cannot be negative');
}
}
void test_age(int age) {
if(age<0) {
throw new FormatException();
}
}
次の output が生成されるはずです-
Age cannot be negative
カスタム例外
上記で指定したように、Dartのすべての例外タイプは、組み込みクラス Exception のサブタイプです。 Dartでは、既存の例外を拡張することにより、カスタム例外を作成できます。 カスタム例外を定義するための構文は以下のとおりです-
構文:例外の定義
class Custom_exception_Name implements Exception {
//can contain constructors, variables and methods
}
カスタム例外は明示的に発生させる必要があり、同じ例外をコードで処理する必要があります。
例
次の例は、カスタム例外を定義および処理する方法を示しています。
class AmtException implements Exception {
String errMsg() => 'Amount should be greater than zero';
}
void main() {
try {
withdraw_amt(-1);
}
catch(e) {
print(e.errMsg());
}
finally {
print('Ending requested operation.....');
}
}
void withdraw_amt(int amt) {
if (amt <= 0) {
throw new AmtException();
}
}
上記のコードでは、カスタム例外 AmtException を定義しています。 渡された金額が例外範囲内にない場合、コードは例外を発生させます。 main 関数は、 try … catch ブロックで関数呼び出しを囲みます。
コードは、次の*出力*を生成する必要があります-
Amount should be greater than zero
Ending requested operation....
Dartプログラミング-デバッグ
時々、開発者はコーディング中に間違いを犯します。 プログラムの間違いはバグと呼ばれます。 バグを見つけて修正するプロセスはデバッグと呼ばれ、開発プロセスの通常の部分です。 このセクションでは、タスクのデバッグに役立つツールとテクニックについて説明します。
WebStormエディターは、ブレークポイントとステップバイステップのデバッグを可能にします。 プログラムは、ブレークポイントがアタッチされたポイントでブレークします。 この機能は、JavaまたはC#アプリケーションの開発に期待される機能に似ています。 WebStormエディターから、変数の監視、スタックの閲覧、ステップオーバー、メソッドおよび関数呼び出しへのステップインができます。
ブレークポイントを追加する
次のコードスニペットを考えてください。 *(TestString.dart) *
void main() {
int a = 10, b = 20, c = 5;
c = c* c * c;
print("$a + $b = ${a+b}");
print("$a%$b = ${a%b}"); //Add a break point here
print("$a*$b = ${a*b}");
print("$a/$b = ${a/b}");
print(c);
}
- ブレークポイントを追加*するには、左マージンをクリックします。 以下の図では、行番号7にブレークポイントがあります。
プログラムをデバッグモードで実行します。 プロジェクトエクスプローラーで、このケースのTestString.dartのdartプログラムを右クリックします。
プログラムがデバッグモードで実行されると、次のスクリーンショットに示すようなデバッガウィンドウが表示されます。 変数タブには、現在のコンテキストの変数の値が表示されます。 特定の変数にウォッチャーを追加し、ウォッチウィンドウを使用してその値の変化を聞くことができます。
デバッグメニューの[ステップイン](F7)矢印アイコンは、一度に1ステートメントずつコードを実行するのに役立ちます。 メインメソッドがサブルーチンを呼び出す場合、これはサブルーチンコードにも入ります。
ステップオーバー(F8):*ステップイン*に似ています。 使用法の違いは、現在のステートメントにサブルーチンの呼び出しが含まれている場合に発生します。 メインメソッドがサブルーチンを呼び出す場合、ステップオーバーはサブルーチンにドリルしません。 サブルーチンをスキップします。
ステップアウト(Shift + F8):現在の実行ポイントがある関数の残りの行を実行します。 表示される次のステートメントは、サブルーチン呼び出しに続くステートメントです。
デバッグモードで実行した後、プログラムは次の*出力*を提供します-
10 + 20 = 30
10 % 20 = 10
10 * 20 = 200
10/20 = 0.5
125
Dartプログラミング-Typedef
*typedef* 、または関数型エイリアスは、メモリ内の実行可能コードへのポインターを定義するのに役立ちます。 簡単に言えば、 *typedef* は関数を参照するポインターとして使用できます。
以下は、Dartプログラムで typedefs を実装する手順です。
ステップ1:typedefの定義
*typedef* を使用して、特定の関数に一致させる関数シグネチャを指定できます。 関数シグネチャは、関数のパラメーター(それらのタイプを含む)によって定義されます。 戻り値の型は関数シグネチャの一部ではありません。 構文は次のとおりです。
typedef function_name(parameters)
ステップ2:関数をtypedef変数に割り当てる
*typedef* の変数は、 *typedef* と同じシグネチャを持つ任意の関数を指すことができます。 次のシグネチャを使用して、関数を *typedef* 変数に割り当てることができます。
type_def var_name = function_name
ステップ3:関数の呼び出し
*typedef* 変数を使用して関数を呼び出すことができます。 これは、関数を呼び出す方法です-
var_name(parameters)
例
次に、Dartの typedef の詳細を理解するための例を見てみましょう。
最初に、 typedef を定義します。 ここでは、関数シグネチャを定義しています。 この関数は、 integer 型の2つの入力パラメーターを取ります。 戻り値の型は関数シグネチャの一部ではありません。
typedef ManyOperation(int firstNo , int secondNo);//function signature
次に、関数を定義しましょう。 ManyOperation typedef と同じ関数シグネチャを持ついくつかの関数を定義します。
Add(int firstNo,int second){
print("Add result is ${firstNo+second}");
}
Subtract(int firstNo,int second){
print("Subtract result is ${firstNo-second}");
}
Divide(int firstNo,int second){
print("Add result is ${firstNo/second}");
}
最後に、 typedef を介して関数を呼び出します。 ManyOperations型の変数を宣言します。 関数名を宣言された変数に割り当てます。
ManyOperation oper ;
//can point to any method of same signature
oper = Add;
oper(10,20);
oper = Subtract;
oper(30,20);
oper = Divide;
oper(50,5);
*oper* 変数は、2つの整数パラメーターを取る任意のメソッドを指すことができます。 *Add* 関数の参照が変数に割り当てられます。 Typedefは実行時に関数参照を切り替えることができます
すべての部品をまとめて、完全なプログラムを見てみましょう。
typedef ManyOperation(int firstNo , int secondNo);
//function signature
Add(int firstNo,int second){
print("Add result is ${firstNo+second}");
}
Subtract(int firstNo,int second){
print("Subtract result is ${firstNo-second}");
}
Divide(int firstNo,int second){
print("Divide result is ${firstNo/second}");
}
Calculator(int a, int b, ManyOperation oper){
print("Inside calculator");
oper(a,b);
}
void main(){
ManyOperation oper = Add;
oper(10,20);
oper = Subtract;
oper(30,20);
oper = Divide;
oper(50,5);
}
プログラムは、次の*出力*を生成する必要があります-
Add result is 30
Subtract result is 10
Divide result is 10.0
注- typedef 変数が異なる関数シグネチャを持つ関数をポイントしようとすると、上記のコードはエラーになります。
例
*Typedefs* は、パラメーターとして関数に渡すこともできます。 次の例を考慮してください-
typedef ManyOperation(int firstNo , int secondNo); //function signature
Add(int firstNo,int second){
print("Add result is ${firstNo+second}");
}
Subtract(int firstNo,int second){
print("Subtract result is ${firstNo-second}");
}
Divide(int firstNo,int second){
print("Divide result is ${firstNo/second}");
}
Calculator(int a,int b ,ManyOperation oper){
print("Inside calculator");
oper(a,b);
}
main(){
Calculator(5,5,Add);
Calculator(5,5,Subtract);
Calculator(5,5,Divide);
}
次の output が生成されます-
Inside calculator
Add result is 10
Inside calculator
Subtract result is 0
Inside calculator
Divide result is 1.0
Dartプログラミング-ライブラリ
プログラミング言語のライブラリは、ルーチン(プログラミング命令のセット)のコレクションを表します。 Dartには、頻繁に使用されるルーチンを保存するのに役立つ組み込みライブラリのセットがあります。 Dartライブラリは、クラス、定数、関数、typedef、プロパティ、および例外のセットで構成されます。
ライブラリのインポート
インポートすると、ライブラリ内のコンポーネントが呼び出し元コードで利用可能になります。 importキーワードは、同じことを達成するために使用されます。 dartファイルには、複数のインポートステートメントを含めることができます。
組み込みのDartライブラリURIは、dart:スキームを使用してライブラリを参照します。 他のライブラリは、ファイルシステムパスまたはpackage:スキームを使用してそのURIを指定できます。 pubツールなどのパッケージマネージャーによって提供されるライブラリは、_package:scheme_を使用します。
Dartでライブラリをインポートするための構文は以下のとおりです-
import 'URI'
次のコードスニペットを考慮してください-
import 'dart:io'
import 'package:lib1/libfile.dart'
ライブラリの一部のみを使用する場合は、ライブラリを選択してインポートできます。 同じための構文は以下のとおりです-
import 'package: lib1/lib1.dart' show foo, bar;
//Import only foo and bar.
import 'package: mylib/mylib.dart' hide foo;
//Import all names except foo
一般的に使用されるいくつかのライブラリを以下に示します-
Sr.No | Library & Description |
---|---|
1 |
dart:io サーバーアプリケーションのファイル、ソケット、HTTP、およびその他のI/Oサポート。 このライブラリは、ブラウザベースのアプリケーションでは機能しません。 このライブラリはデフォルトでインポートされます。 |
2 |
dart:core すべてのDartプログラムの組み込み型、コレクション、およびその他のコア機能。 このライブラリは自動的にインポートされます。 |
3 |
dart: math 数学定数と関数、および乱数ジェネレーター。 |
4 |
dart: convert JSONやUTF-8などの異なるデータ表現間で変換するためのエンコーダーとデコーダー。 |
5 |
dart: typed_data 固定サイズのデータ(たとえば、符号なし8バイト整数)を効率的に処理するリスト。 |
例:ライブラリのインポートと使用
次の例では、組み込みライブラリ dart:math をインポートします。 このスニペットは、 math ライブラリーから* sqrt()*関数を呼び出します。 この関数は、渡された数値の平方根を返します。
import 'dart:math';
void main() {
print("Square root of 36 is: ${sqrt(36)}");
}
出力
Square root of 36 is: 6.0
ライブラリでのカプセル化
Dartスクリプトは、コンポーネントにプライベートマークを付けるために、識別子の前にアンダースコア(_)を付けることができます。 簡単に言えば、Dartライブラリは、外部スクリプトによるコンテンツへのアクセスを制限できます。 これは「カプセル化」と呼ばれます。 同じための構文は以下のとおりです-
構文
_identifier
例
最初に、プライベート関数でライブラリを定義します。
library loggerlib;
void _log(msg) {
print("Log method called in loggerlib msg:$msg");
}
次に、ライブラリをインポートします
import 'test.dart' as web;
void main() {
web._log("hello from webloggerlib");
}
上記のコードはエラーになります。
Unhandled exception:
No top-level method 'web._log' declared.
NoSuchMethodError: method not found: 'web._log'
Receiver: top-level
Arguments: [...]
#0 NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:184)
#1 main (file:///C:/Users/Administrator/WebstormProjects/untitled/Assertion.dart:6:3)
#2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
カスタムライブラリの作成
Dartでは、独自のコードをライブラリとして使用することもできます。 カスタムライブラリの作成には、次の手順が含まれます-
ステップ1:ライブラリの宣言
ライブラリを明示的に宣言するには、* libraryステートメント*を使用します。 ライブラリを宣言するための構文は以下のとおりです-
library library_name
//library contents go here
ステップ2:ライブラリを関連付ける
あなたは2つの方法でライブラリを関連付けることができます-
- 同じディレクトリ内
import 'library_name'
- 別のディレクトリから
import 'dir/library_name'
例:カスタムライブラリ
まず、カスタムライブラリ calculator.dart を定義しましょう。
library calculator_lib;
import 'dart:math';
//import statement after the libaray statement
int add(int firstNumber,int secondNumber){
print("inside add method of Calculator Library ") ;
return firstNumber+secondNumber;
}
int modulus(int firstNumber,int secondNumber){
print("inside modulus method of Calculator Library ") ;
return firstNumber%secondNumber;
}
int random(int no){
return new Random().nextInt(no);
}
次に、ライブラリをインポートします-
import 'calculator.dart';
void main() {
var num1 = 10;
var num2 = 20;
var sum = add(num1,num2);
var mod = modulus(num1,num2);
var r = random(10);
print("$num1 + $num2 = $sum");
print("$num1 % $num2= $mod");
print("random no $r");
}
プログラムは、次の*出力*を生成する必要があります-
inside add method of Calculator Library
inside modulus method of Calculator Library
10 + 20 = 30
10 % 20= 10
random no 0
ライブラリプレフィックス
競合する識別子を持つ2つのライブラリをインポートする場合、一方または両方のライブラリのプレフィックスを指定できます。 プレフィックスを指定するには、 'as' キーワードを使用します。 同じための構文は以下のとおりです-
構文
import 'library_uri' as prefix
例
まず、ライブラリを定義しましょう: loggerlib.dart 。
library loggerlib;
void log(msg){
print("Log method called in loggerlib msg:$msg");
}
次に、別のライブラリ webloggerlib.dart を定義します。
library webloggerlib;
void log(msg){
print("Log method called in webloggerlib msg:$msg");
}
最後に、プレフィックス付きのライブラリをインポートします。
import 'loggerlib.dart';
import 'webloggerlib.dart' as web;
//prefix avoids function name clashes
void main(){
log("hello from loggerlib");
web.log("hello from webloggerlib");
}
次の output が生成されます-
Log method called in loggerlib msg:hello from loggerlib
Log method called in webloggerlib msg:hello from webloggerlib
Dartプログラミング-非同期
非同期操作*は、 *main アプリケーションスレッドとは別のスレッドで実行されます。 アプリケーションがメソッドを呼び出して操作を非同期的に実行する場合、非同期メソッドがタスクを実行している間、アプリケーションは実行を継続できます。
例
この概念を理解するために例を見てみましょう。 ここで、プログラムは* IOライブラリ*を使用してユーザー入力を受け入れます。
import 'dart:io';
void main() {
print("Enter your name :");
//prompt for user input
String name = stdin.readLineSync();
//this is a synchronous method that reads user input
print("Hello Mr. ${name}");
print("End of main");
}
readLineSync()は同期メソッドです。 つまり、 readLineSync()関数呼び出しに続くすべての命令の実行は、 readLineSync()*メソッドの実行が完了するまでブロックされます。
*stdin.readLineSync* は入力を待機します。 トラックで停止し、ユーザーの入力を受け取るまでそれ以上実行しません。
上記の例では、次の*出力*になります-
Enter your name :
Tom
//reads user input
Hello Mr. Tom
End of main
コンピューティングでは、続行する前にイベントが発生するのを待つとき、何かが*同期*であると言います。 このアプローチの欠点は、コードの一部の実行に時間がかかりすぎると、後続のブロックは無関係ですが実行がブロックされることです。 リソースに対する複数の要求に応答する必要があるWebサーバーを検討します。
同期実行モデルは、現在のリクエストの処理が完了するまで、他のすべてのユーザーのリクエストをブロックします。 そのような場合、Webサーバーのように、すべての要求は他の要求から独立している必要があります。 つまり、ウェブサーバーは、他のユーザーからのリクエストに応答する前に、現在のリクエストの実行が完了するのを待つべきではありません。
簡単に言えば、以前のユーザーの要求を必ず完了する前に、新しいユーザーからの要求を受け入れる必要があります。 これは非同期と呼ばれます。 非同期プログラミングとは、基本的に、待機またはノンブロッキングプログラミングモデルがないことを意味します。 dart:async パッケージは、Dartスクリプトでの非同期プログラミングブロックの実装を容易にします。
例
次の例は、非同期ブロックの機能をよりよく示しています。
ステップ1 *-以下に示す *contact.txt ファイルを作成し、*現在のプロジェクトのデータフォルダーに保存します。
1, Tom
2, John
3, Tim
4, Jane
- ステップ2 *-アプリケーションの他の部分をブロックせずにファイルを読み取るプログラムを作成します。
import "dart:async";
import "dart:io";
void main(){
File file = new File( Directory.current.path+"\\data\\contact.txt");
Future<String> f = file.readAsString();
//returns a futrue, this is Async method
f.then((data)=>print(data));
//once file is read , call back method is invoked
print("End of main");
//this get printed first, showing fileReading is non blocking or async
}
このプログラムの*出力*は次のようになります-
End of main
1, Tom
2, John
3, Tim
4, Jan
「メインの終わり」が最初に実行され、スクリプトがファイルの読み取りを続けます。 dart:async の一部である Future クラスは、非同期タスクの完了後に計算の結果を取得するために使用されます。 この Future 値は、計算が終了した後に何かをするために使用されます。
読み取り操作が完了すると、実行制御は "then()" 内で転送されます。 これは、読み取り操作に時間がかかるため、プログラムの他の部分をブロックしたくないためです。
Dart Future
Dartコミュニティは、 Future を「将来いつか価値を得るための手段」と定義しています。簡単に言うと、* Futureオブジェクト*は、実行が後で完了する式によって返される値を表すメカニズムです。 非同期メソッドが呼び出されると、Dartの組み込みクラスのいくつかは Future を返します。
Dartはシングルスレッドのプログラミング言語です。 コードが実行スレッドをブロックする場合(たとえば、時間のかかる操作を待機したり、I/Oをブロックしたりするなど)、プログラムは事実上フリーズします。
非同期操作により、ブロックされることなくプログラムを実行できます。 Dartは* Futureオブジェクト*を使用して非同期操作を表します。
Dartプログラミング-並行性
- 同時実行*は、複数の命令シーケンスを同時に実行することです。 複数のタスクを同時に実行する必要があります。
Dartは、並行して作業を行うためのツールとして Isolates を使用しています。 dart:isolate パッケージは、シングルスレッドのDartコードを取得し、アプリケーションが利用可能なハードウェアをより活用できるようにするDartのソリューションです。
*Isolates* は、名前が示すように、実行中のコードの孤立したユニットです。 それらの間でデータを送信する唯一の方法は、クライアントとサーバーの間でメッセージを渡す方法のように、メッセージを渡すことです。 *isolate* は、プログラムがすぐにマルチコアマイクロプロセッサを利用できるようにします。
例
この概念をよりよく理解するために例を見てみましょう。
import 'dart:isolate';
void foo(var message){
print('execution from foo ... the message is :${message}');
}
void main(){
Isolate.spawn(foo,'Hello!!');
Isolate.spawn(foo,'Greetings!!');
Isolate.spawn(foo,'Welcome!!');
print('execution from main1');
print('execution from main2');
print('execution from main3');
}
ここでは、 Isolate クラスの spawn メソッドにより、コードの残りの部分と並行して関数 foo を実行できます。 *スポーン*関数は2つのパラメータを取ります-
- 生成される関数、および
- 生成された関数に渡されるオブジェクト。
生成された関数に渡すオブジェクトがない場合、NULL値を渡すことができます。
2つの関数*(fooとmain)は毎回同じ順序で実行されるとは限りません。 *foo がいつ実行され、いつ* main()*が実行されるかについての保証はありません。 出力は実行するたびに異なります。
出力1
execution from main1
execution from main2
execution from main3
execution from foo ... the message is :Hello!!
出力2
execution from main1
execution from main2
execution from main3
execution from foo ... the message is :Welcome!!
execution from foo ... the message is :Hello!!
execution from foo ... the message is :Greetings!!
出力から、Dartコードは、JavaまたはC#コードが新しいスレッドを開始できるように、実行中のコードから新しい isolate を生成できると結論付けることができます。
*Isolates* は、 *isolate* に独自のメモリがあるという点でスレッドと異なります。 *isolates* の間で変数を共有する方法はありません。 *isolates* の間で通信する唯一の方法は、メッセージの受け渡しによる方法です。
注-上記の出力は、ハードウェアおよびオペレーティングシステムの構成によって異なります。
v/s Futureを分離
複雑な計算作業を非同期で行うことは、アプリケーションの応答性を確保するために重要です。 Dart Future は非同期タスクの値を完了後に取得するためのメカニズムであり、* Dart Isolatesは並列処理を抽象化し、実用的な高レベルで実装するためのツールです。
Dartプログラミング-単体テスト
単体テストでは、アプリケーションの個々のユニットをすべてテストします。 開発者が複雑なアプリケーション全体を実行せずに小さな機能をテストするのに役立ちます。
「test」という名前のDart external library は、単体テストを記述および実行する標準的な方法を提供します。
Dartユニットテストには、次の手順が含まれます-
ステップ1:「テスト」パッケージのインストール
現在のプロジェクトにサードパーティパッケージをインストールするには、 pubspec.yaml ファイルが必要です。 テストパッケージ*をインストールするには、まず *pubspec.yaml ファイルに次のエントリを作成します-
dependencies:
test:
エントリを作成したら、 pubspec.yaml ファイルを右クリックして依存関係を取得します。 "test" パッケージがインストールされます。 以下は、 WebStorm エディターでの同じスクリーンショットです。
パッケージは、*コマンドライン*からもインストールできます。 端末に次のように入力します-
pub get
ステップ2:「テスト」パッケージのインポート
import "package:test/test.dart";
ステップ3テストの作成
テストはトップレベル関数* test()を使用して指定され、*テストアサーション*は expect()関数を使用して作成されます。 これらのメソッドを使用するには、 *pub 依存関係としてインストールする必要があります。
構文
test("Description of the test ", () {
expect(actualValue , matchingValue)
});
- group()*関数を使用して、テストをグループ化できます。 各グループの説明は、テストの説明の先頭に追加されます。
構文
group("some_Group_Name", () {
test("test_name_1", () {
expect(actual, equals(exptected));
});
test("test_name_2", () {
expect(actual, equals(expected));
});
})
例1:テストに合格
次の例では、メソッド* Add()を定義しています。 このメソッドは2つの整数値を取り、 *sum を表す整数を返します。 この* add()*メソッドをテストするには-
ステップ1 *-以下のように *test パッケージをインポートします。
ステップ2 *- test()関数を使用してテストを定義します。 ここで、 test()関数は expect()*関数を使用してアサーションを強制します。
import 'package:test/test.dart';
//Import the test package
int Add(int x,int y)
//Function to be tested {
return x+y;
}
void main() {
//Define the test
test("test to check add method",(){
//Arrange
var expected = 30;
//Act
var actual = Add(10,20);
//Asset
expect(actual,expected);
});
}
次の output が生成されるはずです-
00:00 +0: test to check add method
00:00 +1: All tests passed!
例2:テストの失敗
以下で定義されている* subtract()メソッドには論理的な誤りがあります。 次の *test は同じことを検証します。
import 'package:test/test.dart';
int Add(int x,int y){
return x+y;
}
int Sub(int x,int y){
return x-y-1;
}
void main(){
test('test to check sub',(){
var expected = 10;
//Arrange
var actual = Sub(30,20);
//Act
expect(actual,expected);
//Assert
});
test("test to check add method",(){
var expected = 30;
//Arrange
var actual = Add(10,20);
//Act
expect(actual,expected);
//Asset
});
}
出力-関数* add()のテストケースは合格しますが、以下に示すように subtract()*のテストは失敗します。
00:00 +0: test to check sub
00:00 +0 -1: test to check sub
Expected:
Actual:
package:test expect
bin\Test123.dart 18:5 main.<fn>
00:00 +0 -1: test to check add method
00:00 +1 -1: Some tests failed.
Unhandled exception:
Dummy exception to set exit code.
#0 _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:938)
#1 _microtaskLoop (dart:async/schedule_microtask.dart:41)
#2 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50)
#3 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:394)
#4 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:414)
#5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
テストケースのグループ化
- テストケース*をグループ化して、テストコードにより多くの意味を追加できます。 多くの*テストケース*がある場合、これはよりクリーンなコードを書くのに役立ちます。
指定されたコードでは、* split()関数と *trim 関数のテストケースを記述しています。 したがって、これらのテストケースを論理的にグループ化し、 String と呼びます。
例
import "package:test/test.dart";
void main() {
group("String", () {
test("test on split() method of string class", () {
var string = "foo,bar,baz";
expect(string.split(","), equals(["foo", "bar", "baz"]));
});
test("test on trim() method of string class", () {
var string = " foo ";
expect(string.trim(), equals("foo"));
});
});
}
出力-出力は、以下に示すように各テストケースのグループ名を追加します-
00:00 +0: String test on split() method of string class
00:00 +1: String test on trim() method of string class
00:00 +2: All tests passed
Dartプログラミング-HTML DOM
すべてのWebページは、オブジェクトと見なすことができるブラウザーウィンドウ内にあります。
- ドキュメントオブジェクト*は、そのウィンドウに表示されるHTMLドキュメントを表します。 Documentオブジェクトには、ドキュメントコンテンツへのアクセスとドキュメントコンテンツの変更を許可する他のオブジェクトを参照するさまざまなプロパティがあります。
ドキュメントのコンテンツにアクセスして変更する方法は、ドキュメントオブジェクトモデル*または *DOM と呼ばれます。 オブジェクトは階層構造になっています。 この階層構造は、Webドキュメント内のオブジェクトの組織に適用されます。
- Window -階層のトップ。 オブジェクト階層の最も外側の要素です。
- ドキュメント-ウィンドウにロードされる各HTMLドキュメントはドキュメントオブジェクトになります。 ドキュメントにはページのコンテンツが含まれています。
- 要素-Webページのコンテンツを表します。 例には、テキストボックス、ページタイトルなどが含まれます。
- ノード-多くの場合要素ですが、属性、テキスト、コメント、その他のDOMタイプも可能です。
ここにいくつかの重要なDOMオブジェクトの単純な階層があります-
Dartは、DOMのオブジェクトと要素を操作するための dart:html ライブラリを提供します。 コンソールベースのアプリケーションは、 dart:html ライブラリを使用できません。 WebアプリケーションでHTMLライブラリを使用するには、 dart:html をインポートします-
import 'dart:html';
次のセクションでは、* DOM操作*について説明します。
DOM要素の検索
*dart:html* ライブラリーは、DOM内の要素を検索するための *querySelector* 関数を提供します。
Element querySelector(String selectors);
- querySelector()関数は、セレクターの指定されたグループに一致する最初の要素を返します。 *"selectors は、以下に示すCSSセレクター構文を使用した文字列でなければなりません
var element1 = document.querySelector('.className');
var element2 = document.querySelector('#id');
例:DOMの操作
Webstorm IDEで、以下の手順に従ってください-
ステップ1 *-ファイルNewProject→場所で、プロジェクト名を *DemoWebApp として指定します。
ステップ1 *-「サンプルコンテンツの生成」セクションで、 *SimpleWebApplication を選択します。
サンプルプロジェクト DemoWebApp が作成されます。 ダウンロードする必要がある依存関係を含む pubspec.yaml ファイルがあります。
name: 'DemoWebApp'
version: 0.0.1
description: An absolute bare-bones web app.
#author: Your Name <[email protected]>
#homepage: https://www.example.com
environment:
sdk: '>=1.0.0 <2.0.0'
dependencies:
browser: '>=0.10.0 <0.11.0' dart_to_js_script_rewriter: '^1.0.1'
transformers:
- dart_to_js_script_rewriter
Webに接続している場合、これらは自動的にダウンロードされます。そうでない場合は、 pubspec.yaml を右クリックして依存関係を取得できます。
webフォルダーには、 Indexl、main.dart 、 style.css の3つのファイルがあります。
インデクス
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
<meta name = "scaffolded-by" content = "https://github.com/google/stagehand">
<title>DemoWebApp</title>
<link rel = "stylesheet" href = "styles.css">
<script defer src = "main.dart" type = "application/dart"></script>
<script defer src = "packages/browser/dart.js"></script>
</head>
<body>
<h1>
<div id = "output"></div>
</h1>
</body>
</html>
Main.dart
import 'dart:html';
void main() {
querySelector('#output').text = 'Your Dart web dom app is running!!!.';
}
*indexl* ファイルを実行します。画面に次の出力が表示されます。
イベント処理
*dart:html* ライブラリは、DOM要素の *onClick* イベントを提供します。 この構文は、要素がクリックイベントのストリームをどのように処理できるかを示しています。
querySelector('#Id').onClick.listen(eventHanlderFunction);
- querySelector()関数は、指定されたDOMから要素を返し、 onClick.listen()は、クリックイベントが発生したときに呼び出される *eventHandler メソッドを取ります。 eventHandler の構文は以下のとおりです-
void eventHanlderFunction (MouseEvent event){ }
次に、Dartのイベント処理の概念を理解するための例を取り上げます。
TestEventl
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
<meta name = "scaffolded-by" content ="https://github.com/google/stagehand">
<title>DemoWebApp</title>
<link rel = "stylesheet" href = "styles.css">
<script defer src = "TestEvent.dart" type="application/dart"></script>
<script defer src = "packages/browser/dart.js"></script>
</head>
<body>
<div id = "output"></div>
<h1>
<div>
Enter you name : <input type = "text" id = "txtName">
<input type = "button" id = "btnWish" value="Wish">
</div>
</h1>
<h2 id = "display"></h2>
</body>
</html>
TestEvent.dart
import 'dart:html';
void main() {
querySelector('#btnWish').onClick.listen(wishHandler);
}
void wishHandler(MouseEvent event){
String name = (querySelector('#txtName') as InputElement).value;
querySelector('#display').text = 'Hello Mr.'+ name;
}