【Dart/Flutter開発基礎】クラスについての最低限の知識を書く。な話【オブジェクト指向】
こんにちんは、たちつてとです。
現在、最も参考になる書籍/サイト
→英語の公式ドキュメント
という状況。
真におすすめできる書籍がない。
という現在(2021/10/18)。
つまりプログラミング初心者が
Flutterを利用して開発を進めるのは
だいぶ難易度が高いという状況で、
オブジェクト指向の「クラス」に
ついての知識・文法をまとめることに
しました。
結構前に、Flutterくんが自動で作ってくれる
サンプルコードについて、
僕がわからなかった文法等をまとめました。
【Dart言語基礎】抽象クラスや継承など最低限の文法をまとめた【Flutter開発】
しかし、これは
「サンプルコードですらほぼ理解できない、
初心者も初心者だった僕の悔しさを
紛らわしたもの」で、
あまり「実用的」ではありません。
そこで
初心者も初心者だった僕も
簡単なアプリを作りましたので、
それを元にクラスについて
書こうと思います。
はい、こんな感じで
出費記録アプリを作りました。
実際のアプリでクラスの基本を学ぶ
上述にあったアプリで利用しているクラスと
そのソースコードをお見せしようと思います。
感覚的にはそんなに難しいものではないです!
カテゴリクラス
よくある収支管理アプリには、
食費、趣味、保険料...といったカテゴリが
あると思います。僕にとってのカテゴリは
もっとゆるいもので、
この画面の各項目に当たります。
この画面の機能としては
- 背景色の設定
- ユーザが選択できるか
- カテゴリの名前の編集
です。これらを感覚的に記録・利用するために、
クラスというものを利用しています。
ごちゃごちゃこんまいことを書くよりも
実物からどうぞ。
class Category {
// 1.フィールド(メンバ変数)
int id = 0;
String name = '';
int order = 0;// 未使用...すまぬ...
int delFlg = 0;
String rgboStr;
// 2.コンストラクタ(初期化子)
Category({
this.id = -1,
this.name = '',
this.order = -1,
this.delFlg = 0,
this.rgboStr= '255_255_255_1',
});
// 3.以下はメソッド
// String形式で保存してあるRGBOをColor化して返却
Color getColor(){
List<String> backColorStr = rgboStr.split('_');
return Color.fromRGBO(
int.parse(backColorStr[0]),
int.parse(backColorStr[1]),
int.parse(backColorStr[2]),
double.parse(backColorStr[3])
);
}
// 削除フラグを入れ替え
int switchDelFlg(){
if(delFlg == 0){
return 1;
}else{
return 0;
}
}
}
1.フィールド(メンバ変数)
「カテゴリ」クラスをアプリに実装する、
という視点で必要なものはなんでしょうか?
また、機能実装のために、各カテゴリに
特有の属性(もちろん、カテゴリの名前もその一つ)
のようなものを設定したいです。
僕なりの答えが以下です。
・id(=1,2,3,...)
基本的に連番です。
カテゴリ名ではなく、単純な数字で
取得するためのフィールド。
・name
カテゴリ名、そのまんま
・delFlg
暗黙の了解として
0と1だけを取る変数で
0:使用状態、1:削除「状態」
とします。※論理削除というものです。
・rgboStr
カテゴリに対応したイメージカラーです。
本当はColor型にしたかったです。
データベースに保存する都合で、
基本型(intとかStringとか)を強いられてしまい、
255_255_255_1とかの形式で保存することに。
という感じで、これら一つ一つを
フィールドとかメンバ変数と言います。
繰り返しになりますが、各カテゴリ
一つ一つにこれらの設定をします。
(後述)
2.コンストラクタ(初期化子)
コンストラクタというのは、
このクラスを利用する際に、
必ず最初に実行される処理/記述になります。
thisというのは、
「自分の」つまり
「カテゴリクラスのフィールドである」
という意味になります。
ですのでthis.name = ''は、
カテゴリクラスのフィールドである
nameに空文字''を代入する、
という処理になります。
3.メソッド
「クラス」には、その中に特有の関数を
作ることができます。
上では二つのメソッドを作っています。
Color getColor()
は、255_255_255_1といったString形式の
色設定をColor型にして返すメソッドです。
細かい処理を把握していただく必要はありませんが
一応...
数字1_数字2_数字3_数字4
なので、関数splitで
_ごとにList型に直してもらいます。
返却値は
[0]:数字1
[1]:数字2
[2]:数字3
[3]:数字4
となります。で、それぞれ
R、G、B、Oに入れてColorにできます。
int switchDelFlg()
はコメントの通り、論理削除状態を
復活させたり、論理削除状態にする
メソッドです。
自身のフィールドdelFlgを
みて、逆の値にしています。
4.実践編
さて、実際の記述をしてみましょう。
カテゴリを人作ってみます。
上記カテゴリクラスならば、
Category cate = Category(id:1,name:"アイウエオ");
この宣言で、id=1でアイウエオというやる気ない
カテゴリができました。
※ここでCategoryという変数型が
intやstringのような宣言と同じように
宣言されていることにも注目してください。
あれ?色とか、削除のやつ指定してない?
ってなるんですが、実は
コンストラクタのコメントの周りを見ると、
this.delFlg = 0,
this.rgboStr= '255_255_255_1',
このような記述もあります。
実はこれらの記述のおかげで
明示的な指定がなかったとき、
デフォルトで設定されます。
本当にそうか?
確かめるには、クラス内でメソッド作って
void Nemui(){
print(name);
print(rgboStr);
}
main関数で
Category cate = Category(id:1,name:"アイウエオ");
cate.Nemui();
と実行しましょう。
文法は、
変数.メソッド名
です。同様にして、
cate.getColor();
cate.switchDelFlg();
も、もちろんできます。
同じような書き方で、
Category cate = Category(id:1,name:"アイウエオ");
String aiueo = cate.name;
print(aiueo);
をmain関数で実行してみてください。
文法は、
変数.フィールド名
これで、そのオブジェクト
(=各カテゴリ、実態のこと)のフィールド
にアクセスできます。
フィールドに何か値を代入して
書き換えることも可能です。
なお、「クラス」というだけでは
その属性の設定だけがある
抽象的な状態になります。
Category cate = なになに、と
具体的にカテゴリを作った段階で
「インスタンス」という
コップに水が入った状況になります。
「クラス」 = 設計図、
「インスタンス」=設計図をもとにした作成物
がよくある説明です。
終わりに
という感じで、
オブジェクト指向の第一歩として
いかがだったでしょうか?
なお、なぜクラスを利用するか
なぜオブジェクト指向か等には
僕はあんまり詳しくないです。
ただ、感覚的であるとは思いませんか?
あと、この程度のプロジェクトなら
改修/保守しやすいかな?
この辺もちゃんと勉強するべきなんですが
こういう書籍に限って眠くなる...
しかも業務で役立つかと
言われるとNo...なんです...
ってかクラスフル活用された
外部の会社が作ったソースを読む機会も
ありましたが、改修がくそ大変な上
しかも汎用性も無くなってる場合が
多々ありました。
これもうわかんねえな。
|
|