見出し画像

Udemyで50時間かけてオブジェクト指向教材を3周してわかったこと

C# 学習でUdemyのObject-Oriented Programming (OOP) 学習コース3周目をようやく終えた。もうお腹いっぱい。さすがに3回もやるとほとんどのことが理解できたし、2周目までで曖昧だったところにもキッチリ精査を入れられた。もうしゃぶりつくした。このコースをきちんと自分の実力に取り込めたと実感した。なのでこの教材は今日で卒業です。

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



わかったことまとめ

OOPの基本概念を書くと山盛りになるので全部省略w OOPを学べば分かる。それだけ。なのでそれ以外の基礎項目以外でこのコースで分かったこと。たくさんある。

  • OOPではユーザーストーリーが重要。User storiesという要求定義を使うというスタート地点(As a user, I want to ~ so that ~.)

  • 複数出てくるユーザーストーリーズの依存関係や実装しやすさを考えて、取り組みやすいストーリーから実装する「ボトムアップ方式」

  • 1つのユーザーストーリーを細かな課題に分けて(Problem Decomposition)メソッドを仮にコーディングし、分解が終わったら再び上から本実装する「トップダウン方式」

  • トップダウンとボトムアップはプログラマが自由に組み合わせてOK

  • レガシーなプロシージャルコードをOOPに自力で書き換えられる自信が身に付いた

  • OOPに書き換える手法にはパターンがあるらしい。次の教材はデザインパターン学習

  • きちんとOOPの作法を守れば重複コードは存在しない。

  • どのクラスを作るべきか?どんなメソッドにすべきか?を考えるためにはOOPの考え方が必要。普通の発想ではまず実装できない。

  • クラスの継承は諸刃の剣。なるべくオブジェクトの委任で済ませられないか考えよう。

  • オブジェクトの委任でも答えが得られないときに、ようやくクラスの新設を検討する。

  • オブジェクト・コンポジションによるチェーン構成を操れるとエレガントなコードになる。そのためにもOOPの考え方が必要。それが足りないと謎の呪文にしか見えない。

  • UMLは可視化の手段であって、必ずしもUML作図ツールを使わなくてもいい。むしろ自動生成させるほうが扱いやすい。

カタカナが多すぎw スペルを添えれば英単語の完成です。それだけOOPでは概念の英単語が山ほど出てくる。英語コースだったのでそのまま英語で覚える努力をしたが、正解だった。上記のカタカナ英語を全部和名にする努力は、無駄でしかない。


C# ソースコードから自動でUMLクラス図を作成

一応別のUdemyコースを購入してUMLを少し学んでみた。StarUMLというツールを使う。だがこれ、プチプチぷちぷちと、だるい😖こりゃあかん。

というわけでいったん塩漬けしていて、今日、ふと「ソースコードから自動でUMLを書き起こしてくれるツールとかないかな?」と調べてみたらビンゴ!VS Codeを使うが既に利用中なので問題なし。Csharp to PlantUMLというアドオンと、PlantUMLそのもののアドオンが必要らしい。

詳細はこちらが参考になります。

私にはよく分からないが、これ、どうやらUnityでも使えるらしい。(普通に使うと山ほど図が出てくるので適切に図示対象を絞り込む設定は必要らしい。)

私は今回はC# のみの図示でいいのでUnity関連についてはよく分からないが、Unityゲーム開発者には便利なツールかもしれない。是非お試しあれ。

んでこのUdemyコース完了時のUML図がこちら。

こりゃ1周しただけで全部理解できるはずがない😱

このコードの完成までに、OOPで必要な基礎が全部詰まっている。講師のゾラン先生の腕の良さ。ざっと解説しても、

  • 抽象クラスのCalendarから継承で2つのコンクリートクラスを作成(普通のグレゴリオ暦とユリウス暦。うるう年の扱いが異なる)

  • 抽象クラスのCalendarは月日を持つMonthDayクラスと、年月日を持つYearMonthDayクラスの依存性注入で作成(Dependency Injection)

  • うるう年の判定のためのメソッドは必然的にMonthDay, YearMonthDayとCalendarクラスのメソッドのチェーン構成で得ることになる

  • 各クラスの受け持つ範囲が明確。受け持ち範囲以外の答えを得るためにはチェーン構成で色んなクラスのメソッドと相互にやりとりして得られる。

  • そのため各クラスの責任の受け持ち範囲が明確(Simple Responsibility Principle, SRP)

  • OSがプログラムを実行するためのエントリポイントのstatic void Main()、これはOS側の仕様上「残念ながらシーケンシャル・プログラミング」なので、他のクラスとの依存関係が全くない。class ProgramはOOP上のクラスじゃないし、static void Main()はメソッドでもない(staticだし)。


ここまでで、一体何を言っているのか、さっぱりわからねぇと思うが、ありのままに話したぜ。(50時間前の自分はポカーンですわ😭)



とりあえずC# コードを書けばVS Code経由でリアルタイムにUMLを図にできる。やったね!なので、いったんStarUMLは学習停止。正式なUMLを書きたいわけじゃない。グラフィカルにクラスやメソッドの相対関係を可視化したいだけなんだ。

本来ならば「UML学習教材は不要になった」ので返金申請したいところだが、Video CC translatorアドオンを使ったせいで返金申請不可になってしまったようだ(検証中)。お金がもったいない……😭


総学習時間は約50時間😱

TickTickで学習ログを取っていたので、集計してみた結果、約44時間。だが何日か記録漏れもあったので約50時間と見積もることにした。

7時間の教材を3周するのに50時間。

  • 1周目、30時間

  • 2周目、12時間

  • 3周目、8時間

正確ではないが、ざっとこんな具合。最初の1周目で全体の6割の時間とエネルギーを使っている。3周目もあまり速度が上がらない。というのも1, 2周目で気付かないことに気が付くようになり、今まで曖昧だったことの検証作業が増えるため。全部が繋がって見えたときでないと検討できない事項が3周目で噴出するので、それらの確認をすることになる。

とりあえずこの教材を3周して知識を全部身につけようと思ったら50時間は確保して下さい、というトリビアが生まれた😊


とりあえずOOPは怖くなくなった

このコースの知識が全てではないにせよ、おそらく基本知識の7割程度は押さえられたと思う。ただしまだ実践できるだけの知恵がない。なので次はいよいよデザインパターンの教材に入っていく。同じくゾラン先生のコース。先生の既存コースを探して買ったコースだ。楽しみだ😍


今回の創作活動は約1時間(累積 約3,910時間)
(1,154回目のnote更新)


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