Roadmap.shを埋めたい【Flutter①】
はじめに
Roadmap.sh が埋まってなさすぎる!
今までなんとなくでFlutterを学習してきたことが可視化されてしまった(?)ので復習をしつつ、1個ずつ埋めていこうと思いました。
ただ埋めるだけでは時間がたった時になんだったっけ…?と忘れてしまいそうだったので備忘として記事に起こして記録していきます。
Roadmap.shとは
・ITエンジニアの分野別にスキルアップのロードマップが示されている
①Dartとは
DartはGoogleが開発したオープンソースのプログラミング言語で、主にモバイルアプリ(特にFlutterを使用)やWebアプリの開発に利用されている。オブジェクト指向で、JavaやJavaScriptに似た構文を持ち、非同期プログラミングをサポートしている。クロスプラットフォーム開発を容易にし、iOS、Android、Webなどで動作するアプリを一つのコードベースで構築できる。
②Dart Pad
Webブラウザ上でDartプログラムを記述し、即座に実行できるオンラインツール。DartやFlutterの開発環境をローカルにインストールする必要がなく、誰でも簡単にDartコードの動作を確認したり、学習を進めたりできる。初めて触れる人やちょっと試したいときにとっても便利。
DartPad
論文内で紹介されていたURLはリンク切れだったが以下リンクからDartのチュートリアルも確認できた。
Tutorials | Dart
③Variables (変数)
Flutter には 2 種類の変数がある。
ローカル変数: 関数内で宣言され、その関数内でのみアクセスできる
インスタンス変数: クラス内で宣言され、クラス全体でアクセスできる
型名 変数名 = 値 ;
int number = 125;
String message = "Hello world";
bool isLogin = true;
また、変数の命名規則はlowerCamelCaseで単語の区切りは大文字、それ以外は小文字にして表す。
例:happyHelloWorld
★finalとconst
変数を変更する予定がない場合は、型の代わりにまたは型に加えてfinalやconstを使用する。
finalとconst共通
・再代入不可:値が代入された後は変更(再代入)ができない
final
・実行時定数:プログラム実行時に初めて値が確定する
・遅延初期化:必要になるまでに初期化を遅らせることができる。計算結果を代入することなどが可能
・オブジェクトの状態は変更可能:再代入できないが、オブジェクトのプロパティは変更可能★
const
・コンパイル時定数:プログラムコンパイル時に定数が確定する
・メモリ効率:メモリの確保が一度ですみ、再利用されるため動作が軽くなる
・イミュータブル:再代入もすべてのプロパティも変更ができない★
final DateTime now = DateTime.now();
const int year = 365;
★オブジェクトのプロパティは変更ができる…?
このあたりが私自身いまいちピンとこなかったので、例を用いて整理してみた。
## final のパターン
void main() {
final list = [1, 2, 3];
// 再代入はできない
// list = [4, 5, 6]; // エラー
// でも要素は変更できる
list.add(4); // OK
print(list); // [1, 2, 3, 4]
}
## const のパターン
void main() {
const list = [1, 2, 3];
// 再代入もできないし
// list = [4, 5, 6]; // エラー
// 要素の変更も不可
// list.add(4); // エラー
print(list); // [1, 2, 3]
}
④Built-in types (組み込みデータ型)
何があったんだっけーということでDartの公式ドキュメントから型一覧を確認、一通りさらってみてみることにした。
Numbers (int, double)
int a = 42; // 整数型
double b = 3.14; // 小数点を含む浮動小数点型Strings (String)
String name = 'John Doe'; // 文字列型
String greeting = "Hello, World!";Booleans (bool)
真偽値型。trueまたはfalseを保持。
bool isActive = true;
bool isCompleted = false;Records (value1, value2)
Dart 3.0から導入された新しいデータ型。タプルのような構造で、複数の異なる型の値をまとめて保持できる。
(var, var) coordinates = (10, 20);
print(coordinates.$1); // 10
print(coordinates.$2); // 20Functions (Function)
Dartでは、関数も第一級オブジェクトとして扱われ、変数に格納したり、他の関数に渡すことができる。
Function add = (int x, int y) => x + y;
int result = add(5, 3); // 8Lists (List, also known as arrays)
リスト型(配列のようなもの)。(順序あり、重複あり)
List<int> numbers = [1, 2, 3, 4, 5];
List<String> fruits = ['apple', 'banana', 'orange'];Sets (Set)
集合型(順序なし、重複なし)。
Set<int> uniqueNumbers = {1, 2, 3, 4, 5};
Set<String> uniqueFruits = {'apple', 'banana', 'orange'};Maps (Map)
キーと値のペアを保持するコレクション型。
Map<String, int> ages = {'Alice': 30, 'Bob': 25, 'Charlie': 35};
Map<int, String> idToName = {1: 'John', 2: 'Jane', 3: 'Jack'};Runes (Runes; often replaced by the characters API)
Unicodeの文字(コードポイント)を表すために使用。通常、文字列が一文字ずつアクセスされる場合に使う。
String text = 'Dart 🦸♂️';
var rune = text.runes.first; // 'D'
print(String.fromCharCode(rune)); // 'D'Symbols (Symbol)
名前の識別子を表現するために使用。一般的にはリフレクション(メタプログラミング)で使われる。
Symbol mySymbol = #mySymbol;
print(mySymbol); // Symbol("mySymbol")The value null (Null)
nullは値が存在しないことを表す。
String? name = null; // nullを許容する型(nullable type)
int? age = null; // nullを許容する型
★配列に似たものが多い
Records,Lists,Sets,Mapsの整理が自分の中で難しかったのでそれぞれの特徴ごとに表にして整理してみた。
Records: 異なる型の値をまとめて1つのデータとして扱いたい場合、一時的なデータのグループ化に使用。
Lists: 順序が重要な場合、インデックスによるアクセスや繰り返し処理が必要な場合に使用。
Sets: 重複を排除したい場合、集合演算を行いたい場合に使用。
Maps: キーと値のペアでデータを扱いたい場合、効率的な検索や関連付けが必要な場合に使用。
おわりに
今回Roadmap.shを通して学習および復習を進めたことで、今までなんとなくでわかったつもりになっていた基礎の部分の理解がより進んだと感じました。
現段階では実際に手を動かしてコードを書いてみるという段階には至っていないので、次のステップでは環境構築なども進めつつ並行して学習を行っていきたいと考えています(゜-゜)