本記事では、Dartとは?というところから、Dartの基本的な書き方、読み方についてサンプルコードを交えながら説明します。
Dart公式にDartPadと呼ばれるWebブラウザ上で動作を見れるものが用意されているので、実際の動きを見たい場合は使ってみてください。
目次
Dartとは?
Dart(ダートまたはダーツ。当初はDashと呼ばれていた)は、ウェブアプリやモバイルアプリのクライアント開発向けに設計されたプログラミング言語である。Googleによって開発された言語で、サーバーやデスクトップ向けアプリケーションの開発にも使用できる。
Googleによって開発された、と聞くと時代の最先端!と思われるかもしれませんが、始まりは2011年の発表で、当初はDart仮想マシン、Chromeとの統合を目指す!といった形で大々的に発表されていたようですが、思うように普及は進まなかったようです。
そんな中、Flutter/Dart2の発表があり、日の目を浴びるようになった、という背景があります。
特徴
オブジェクト指向型
オブジェクト指向型の言語であり、C++やjavaを触れていた方からすると学習コストは少し低くなるかもしれません。
じゃあ、「JavaScriptを使ってる自分は手をつけづらいかも・・・」と思うかもしれませんが心配ありません。基本的にはJavaScriptの持つ問題を解決するために生まれた後継言語のようなものなので、キャッチアップはしやすいと思います。
型推論
動的、静的の両方の型推論に対応しています。そのため、Swiftといった他の言語で型推論を使いこなしている方からすると、非常に扱いやすいと思います。
コードの書き方
公式の言語説明・サンプルページを引用し、簡略化して説明します。
宣言
型推論のおかげで、基本的に宣言時の型を気にする必要はありません。
セミコロンは必要です。
var name = 'Voyager I'; var year = 1977; var antennaDiameter = 3.7; var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune']; var image = { 'tags': ['saturn'], 'url': '//path/to/saturn.jpg' };
制御フロー
プログラムの基本であるif/for/whileといったものは以下のように記載できます。基本的には他の言語と似たような記載の仕方であり、読むだけであればDartを知らなくても理解できると思います。
if (year >= 2001) { print('21st century'); } else if (year >= 1901) { print('20th century'); } for (final object in flybyObjects) { print(object); } for (int month = 1; month <= 12; month++) { print(month); } while (year < 2016) { year += 1; }
関数
戻り値の型については定義することが推奨されています。
以下の例ではフィボナッチ数列を返す関数となっています。
int fibonacci(int n) { if (n == 0 || n == 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } var result = fibonacci(20);
コメント
特に説明することはありませんね。dartdocなどのドキュメント生成ライブラリ用のために、スラッシュを3つ並べるケースもあります。
// This is a normal, one-line comment. /// This is a documentation comment, used to document libraries, /// classes, and their members. Tools like IDEs and dartdoc treat /// doc comments specially. /* Comments like these are also supported. */
インポート
// コアライブラリのインポート // Importing core libraries import 'dart:math'; // 外部パッケージからライブラリをインポートする場合 // Importing libraries from external packages import 'package:test/test.dart'; // ファイルのインポート // Importing files import 'path/to/my_other_file.dart';
クラス
これは、3つのプロパティ、2つのコンストラクター、および1つのメソッドを持つクラスの例です。プロパティの1つは直接設定できないため、(変数の代わりに)getterメソッドを使用して定義されます。この点は別記事で紹介予定です。
class Spacecraft { String name; DateTime? launchDate; // 読み取り専用 // Read-only non-final property int? get launchYear => launchDate?.year; // 変数を直接指定することができる糖衣構文(簡略化できる書き方) // Constructor, with syntactic sugar for assignment to members. Spacecraft(this.name, this.launchDate) { // Initialization code goes here. } // 名前付きコンストラクタ(デフォルトのコンストラクタを直接呼び出す記載方法) // Named constructor that forwards to the default one. Spacecraft.unlaunched(String name) : this(name, null); // 関数 // Method. void describe() { print('Spacecraft: $name'); // Type promotion doesn't work on getters. var launchDate = this.launchDate; if (launchDate != null) { int years = DateTime.now().difference(launchDate).inDays ~/ 365; print('Launched: $launchYear ($years years ago)'); } else { print('Unlaunched'); } } } //具体的には以下のように呼び出すことになる var voyager = Spacecraft('Voyager I', DateTime(1977, 9, 5)); voyager.describe(); var voyager3 = Spacecraft.unlaunched('Voyager III'); voyager3.describe();
継承
クラスを継承することができます(1つだけ)。上記のSpacecraftクラスにaltitude(高度)を追加した例になっています。
class Orbiter extends Spacecraft { double altitude; Orbiter(String name, DateTime launchDate, this.altitude) : super(name, launchDate); }
例外
宇宙飛行士がいない際は例外を投げる例です。throwを使うことで例外を発生させることができます。
if (astronauts == 0) { throw StateError('No astronauts.'); }
例外をキャッチする際は以下のように記載します。
try { for (final object in flybyObjects) { var description = await File('$object.txt').readAsString(); print(description); } } on IOException catch (e) { print('Could not describe object: $e'); } finally { flybyObjects.clear(); }
終わりに
本記事では、Dartの基本的な読み方書き方をサンプルを交えて説明しましたが、他にもいくつも機能があります。すべて紹介すると記事が長すぎたり、内容が難しくなってしまったりするため、今回は基礎中の基礎を紹介した形になっていますので、興味のある方はDart公式のページを参照してみてください。
コメントを残す