見出し画像

オブジェクト指向の学習は積み重ねが大事。そんなに早く結果は出せない。

今日も懲りずにObject-Oriented Programming (OOP) の学習中。3周目も半分くらい進んだ。だんだんとOOPの考え方が分かってきた気がする。とはいえ7時間のコース、序盤の2時間はプロシージャルなコーディングの話なのでもう理解できているのでカット。そのプロシージャルコードをOOPに変換していく作業から復習の3周目。

(約 2,500文字の記事です。)



曖昧な理解を潰す。きちんと理解するまで繰り返す

コードの細かいところやOOPにあまり関わらないところが見えてきた。なのでそういう所は2倍速で進めるかプログレスバーをクリックでジャンプして進める。そしてOOPの深い解説になったところを1~1.5倍でじっくり視聴。

このUdemyコースにはOOPのエッセンスがこれでもかというくらい詰め込まれているので、気を抜いて聞き流せない。

実際、1~2周目で取りこぼしていた知恵を3周目でようやく拾えている。だが当時には気が付かなかった部分にも頭がついて行けるようになった。


自分で考えてみる

コースを進めていくと徐々に流れが分かるようになる。だがどうしても「写経」になりがち。なので2周目からは少し考えて、思いつかない場合には答えを見て写経して、もう一度「なぜこういう風になるのか?」を考える。納得したら次に進む。

1周目ではこれはできるはずもない。2周でも割と引っかかりまくる。だが3周目で少しずつ「ここは確かこんな感じで書く」という「勘」が働くようになる。丸暗記ではなくてロジックを想起してそこからコードを書く。

3周目では以前から不満だった「分かりにくいメソッド名」などを自分が分かりやすいように変更して挑戦してみた。なので写経をすれば「そんな定義はない!」とコンパイラに怒られる😅。そこで考える。何を間違えたのか?そうすると少しずつ「自分の頭でコードを解釈」して書けるようになる。

OOPは思考なしの写経では時間の無駄になる。概念の理解が重要。手を動かして慣れて書けるようになるのはプロシージャルコードだけ。

今回、ビデオをスキップしたときにどこかのメソッドの実装の動画を飛ばしたようで、本来はサンプルが動くべきところ、エラーでコンパイルが通らず。確かに仮配置のままの実装だったので、コンパイルが通らない。

動画を探してもいいのだが、せっかくだから「ゼロから」自分で考えてみた。まったく記憶にないので完全忘却している状態。なので正解の手順を想起することはできない。完全にロジックで導いてコードを書くしかない

悩むこと5分。無事に完成!コンパイルも通って予想通りの動作。そして答え合わせのソースコードをDLして目視確認。まったく一緒!やったね😊

この瞬間、空の雲が少し晴れた気がした。自力でOOPコードを実装できた日。たったの1行だけれど、この価値は大きい。

OOPの考え方が少し分かった気がする

とりあえずこのコード、以前はちんぷんかんぷんだったが今は
「読める、読めるぞぉ~」になった😍

        public YearMonthDay GetStartSchoolDate(Child schoolchild) =>
            schoolchild
                .GetStartSchoolAge(_startAge)
                .GetFirstOccurrence(_cutoff)
                .GetFirstOccurrence(_schoolStart);

小学生の初登校日を求めるというテーマのコードの一部。子供の生年月日から登校開始の年齢を取得し、そこから入学の西暦(何期生として入学するか, cutoff)を取得し、さらにそれを使って実際の登校年月日を取得して返す「GetStartSchoolDate」メソッド。クラスタイプは安直に分かりやすく「YearMonthDay」に変更してみた😅Dateだけだとややこしい(解説中ではDateが年月日、YearDateが年無しの月日のみ、分かりづらい。)
クラス「Child」からスタートして最終的にYearMonthDayクラスのオブジェクトを返すメソッド。1つの「GetFirstOccurrence」メソッドでも2つの引数「_cutoff、_schoolStart」を使って求めるものを取得している点がエレガントだと思った。重複メソッド・重複関数はダメ、絶対。

オブジェクトの3つのパイプライン処理でしかないのだが、理解できてしまえば何とも鮮やかなコードだと感じた。(ま、講師の教材や教え方がいいだけですが。)OOPの魅力は美しさだったりする。決まるときにはビシッとスマートに決まる。早く自由に扱えるようになりたい。


なぜ正解だったのか?自分の考えをさかのぼって考えてみた

ではなぜそれが正解だと思ったのか?自分のロジックをもう一度復習。まだ、勘で、何となく「多分これだ」と思って書いたので、まだ曖昧。

  1. このメソッドは何をしようとしているのか?

  2. 今のクラスで何のプライベート変数(フィールド)を、どのクラスのメソッドに渡せばいいのか?

  3. メソッドがない場合は作ればいいのだが、どのクラスに作るべきか?

  4. クラスのフィールドのどれを使うか?また引数はどのメソッドから受け取るか(オブジェクトのパイプライン処理を検討する。)

これらを踏まえて、現在作業中のクラスと、やろうとしていることと、フィールド項目を眺める。今回は「多分これしかないな」というところまで考えてコードを書いて答え合わせした。合っていたので、正解の一つなのだろう。

ただしこの部分は、もうこのコースだけでは無理な気もしている。

早くデザインパターンの教材にシフトしたほうがいいのかもしれない。そちらにさらに最適な答えがある気もする。

とにかく3周目を終えたらこのコースに入る予定。あと少し。あと4時間くらいかな。

今回の創作活動は約1時間15分(累積 約3,909時間)
(1,153回目のnote更新)


読んでくれてありがとう。気長にマイペースに書いてます。この出会いに感謝😊