プログラミング基礎講習2

364 Views

April 19, 21

スライド概要

サークルでProcessingを使ったプログラミング基礎講習会を行った時の資料です。

profile-image

公立はこだて未来大学複雑系学部3年

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

1 18時15分開始 お待ちくだせぇ

2.

プログラミング基礎講習 第二回 at FUN AI 2020/5/18

3.

本日の予定 18:15 〜 講習会開始 〜20:00 終わり 面倒なのでPDF作ってないです。テヘペロ。 各位休憩を適宜とって下さい。

4.

予定変更 来週は私のブロック崩しコードを リファクタリングします! リファクタリングとは プログラムの外部から見た動作を変えずにソースコードの内部構造を整理すること

5.

用意して欲しいもの ・Processing サンプルコードを手元に持ってきて遊んでみてね。

6.

本日のテーマ「可読性」 ・可読性とは ・命名規則 ・変数のスコープ ・コメントアウト ・関数 ・制御フロー ・関数の副作用

7.

1 可読性

8.

可読性とは > コードの読みやすさ・わかりやすさの指標

9.

可読性とは > なにが目的でどんな工程を踏んでいるのか > どの変数が何の役割をしているのか

10.

なんで気にするの? ・チーム開発する際に余計なコストがかからずに済む ・あとから改修がしやすくなる

11.

1 変数とのお付き合い

12.

変数と和解せよ > 変数と雑な付き合いするとあとで辛い思いしますよ。

13.

2 サンプルコード

15.

3 命名規則

16.

命名規則とは > 変数に名前をつける時に守るお約束ごと

17.

キャメルとスネーク >単語の先頭を大文字にする(StateTitle, UpWord) >単語の間にアンダーバーを入れる (left_word)

18.

統一感のある命名 > rectX,rectYなど、同じ処理に使用するなら名前を似せ る

19.

大文字と小文字で変数を分けない > rectXとRectXを別変数として扱う > XrectとrectXとか順番で区別もよくない

20.

上書きしない > もうすでに役目のあるお名前は使わない

21.

システム変数 > もうすでに役目がある変数たち。 > 上書き可能(するな) 例)mouseX, width

22.

予約語 > もうすでに役目があり、上書きが不可 例)int, float

23.

関数の名前を使わない > もうすでに役目のある関数の名前も使わない 例)rect,random,circle

24.

シンタックスハイライト > コードが見やすくなるように色がついている > 色がついたらすでに役割があるので使わない!

25.

・濃い青:void関数 ・緑:void ・ピンク:システム変数 ・薄い青:組み込み関数

26.

変数名の変えかた >

27.

変数楽に変えられるよ >

28.

便利サイト 日本語入力すると良い感じに英語にして返してくれる! codic : https://codic.jp/

29.

修正前 修正後

30.

変数名綺麗にしたコードだが… →変数が多い…💦

31.

4 変数の削除

32.

検討するポイント > 特に処理を行わないで値を渡していないか? > 定数ではないか?

33.

・backColorは必要? ・rectConstantは必要? ・Low,Highは必要? ・directionChangeは必要?

34.

用法の確認 >

35.

確認できること ・どこで宣言したのか ・何に使ってるか ・何を代入されてるか VSCodeではcommand+Fで検索できる ので、それで見ると󰢐

36.

・変数名をわかりやすくした ・不要な一時変数を削除 →だいぶ見やすくなった!🤗

37.

1 変数のスコープ

38.

スコープとは >変数のスコープは変数が使える有効範囲のこと >宣言する場所でスコープが変わる

39.

スコープとは >有効範囲を狭めることを「スコープを狭める」と言う

40.

例)正しいスコープ >>> marumarumarumarumarumaru… と出力される

41.

例) スコープを間違えると… >>> エラー:maruがいません

42.

イメージ >{}で囲まれた範囲=有効範囲

43.

用語解説 ・グローバル変数:完全にお外で宣言 ・ローカル変数:中で宣言

44.

なんで気にしなきゃダメなの? > どこで変数の上書きがされてるか把握しづらい > 変数が変更されればされるほど中身を追いにくい

45.

なんで気にしなきゃダメなの? > 変数名の競合を防ぐ。全部一意の名前にするのきつい べ。

46.

なんで気にしなきゃダメなの? > データを扱う際はメモリ消費が気になる gc.collect()!!!!!!!!

47.

注意ポイント > draw()は何度も回ってるので、宣言で初期化されて困る ものは影響が出ない場所で宣言する!

48.

・verX,verY,rectX,rectYは中身が 動いてほしいのでスコープ小さくできな い。 ・backcolorは定数として扱っている のでスコープを狭めていい

49.

1 インデント

50.

インデントとは void draw(){ aaaif(maru){ aaaaaprint(“まる!”); aaa} } {}は同じインデントに揃える!

51.

便利コマンド紹介 ● ctrl + R : 実行 ● ctrl + T : 自動フォーマット ● ctrl + S : 保存

52.

Pythonではインデント命 > スコープについて、Pythonではインデントで判断される > Processingは{}があるとはいえ気にしよう

53.

7 コメントアウト

54.

コメントアウトとは Processingでは// Pythonだと#

55.

使い道 ・処理の解説 ・開発のメモ(//あとで修正しよう)

56.

一連の処理へのコメントアウト /*---------Mecabの準備----------*/ t = MeCab.Tagger('/usr/local/lib/mecab/dic/mecab-ipadic-neologd') t.parse('')

57.

一連の処理へのコメントアウト #Mecab t = MeCab.Tagger('/usr/local/lib/mecab/dic/mecab-ipadic-neologd') t.parse('')

58.

1行に対してコメントアウト twitter = OAuth1Session(CK, CS, AT, ATS) # 認証処理 url = "https://api.twitter.com/1.1/statuses/home_timeline.json" タイムライン取得エンドポイント #

59.

7 関数

60.

関数とは 一連の処理をまとめて定義すること。

61.

int a=0; void draw(){ //...long process a++; } aを+1し続ける処理を 関数にしよう

62.

int a=0; void draw(){ //... returnがある関数は a = add(a) 値を返すよ } 例)random,mouseX int addition(int x){ return x+1; }

63.

int a=0; void draw(){ //... addition(a); } (これはうまく動かんです) void addition(int x){ x=x+1; } void の関数は上から下に 流れるだけだよ。 例)void mousePressed()

64.

関数の引数 void add(int x)とかint add(int x)の int xを関数の引数という。 rect(10,10,10,10)の”10”も関数の引数です。

65.

何が嬉しい? 繰り返しが防げる →書く手間が省ける →使わないと変更点が出ると全部書き直さなきゃいけない 場合がある(addが+1ではなく+2にしたいなど)

66.

何が嬉しい? 関数名をつけることで何の処理かわかりやすくなる →コードをべたに書くよりもわかりやすくなる

67.

7 制御フロー

68.

制御フローとは > 実行される順序のこと > 条件やループなどに出会わない限り、コードは最初の行 から順に最後の行まで順番に実行する。

69.

制御フロー できるだけ「自然」にする。

70.

自然?? フローチャートを思い出そう。

71.

int sum=0; int n=1; while(n<=10){ sum = sum + n; n++; } print(sum);

72.

int sum=0; sumを定義 int n=1; while(n<=10){ sum = sum + n; sumに1~10まで足す n++; } print(sum); sumを出力

73.

int sum=0; int n=0; while(n<=10){ sum = sum + n; if(n==10){ print(sum); } n++; }

74.

int sum=0; int n=0; sumを定義 while(n<=10){ sum = sum + n; if(n==10){ sumに1~10まで足す print(sum); } n++; } sumを出力

75.

気付きにくい。 > 具体的に考えれば考えるほど上記のようなことが起きや すい > 定期的に自分がそもそも何を書きたかったのかを思い出 そう

76.

if文 if (a == b) { // Case One ... } else { // Case Two ... }

77.

if文 if (a != b) { // Case Two ... } else { // Case One ... }

78.

つまり > 否定的ではなく肯定的ケースに対処する

79.

ついでに > より注目させたい処理を先に書く →判別させたいことは何か、何の処理をさせたいのか →エラー処理なら否定で入った方が良い

80.

ネスト とは > 入れ子構造のこと if(){ if(){ if(){ } } } //...

81.

ネストが深すぎると… > あとから読んだときになにが起きたらどこに入りどこで 抜け出すのか追いにくい →「自然」じゃない

82.

if(hoge!=0){ //超長い }else{ return hoge; } API使ってる人とかこうなって ませんか。私はなりました。

83.

if(hoge==0){ return hoge; } //長い処理 さっさとreturnさせる。

84.

if(hoge!=0){ //... if(hoge>5){ //hoge操作 if(hoge>100){ //hogeを操作 hoge=fuga; } //hoge操作 } } hogeの操作のみの場所があるなら

85.

piyo=hoge_calculation(hoge) int hoge_calculation(int piyo){ //ここに一連の処理を書き return piyo; } まとめてしまった方が良い。

86.

なにが嬉しい > 「これどんな条件分岐だっけ?」を防げる > あとで書き足しやすい&修正しやすい

87.

7 関数の副作用

88.

副作用のない関数とは > いついかなる時、場所でも同じ引数なら同じ振る舞いを する関数

89.

副作用のある関数とは > 副作用のない関数以外の関数全て

90.

副作用とみなされる行為 ・グローバル変数を読む、あるいは書く ・標準入力または標準出力を使う ・副作用のある関数を呼ぶ

91.

なぜ副作用がいけない? > 単体テストができないから。 →関数外に依存要素があるから単体でテストが行えない

92.

なぜ副作用がいけない? > リファクタリングするときに範囲を定めにくい →他のところも改修しなきゃいけなくなる

93.

出力予想できますか?

94.

nestMaru:0 marumaru:2 nestMaru:2 marumaru:2

95.

同じ関数を呼んだのに出力 が違う →副作用がある

96.

8 次回予告

97.

お品書き(予定) ● 実演 私が去年作ったブロック崩しをリファクタリング しながら学んだ内容の復習します。

98.

おわり。 感想くれ。 98