Slide 1

Slide 1 text

夏 の 素 の 読 書 感 想 L T #saitama.js Ja va Sc ri pt に よ る 実 践 オ ブ ジ ェ ク ト 指 向 登 壇 者 R O M 専 20 22 年 08 月 30 日

Slide 2

Slide 2 text

自己紹介します ROM専 https://twitter.com/rom1000_yksbpn 株式会社IBJで唯一のフロントエンド 最近古着が好きで古着ファッションで出社したりす るが、結構浮いてて悲 C 埼玉県には足を踏み入れたことがない

Slide 3

Slide 3 text

夏といえば、夏休み! 夏休みといえば、読書感想文!

Slide 4

Slide 4 text

夏といえば、夏休み! 夏休みといえば、読書感想文! ということで、 JavaScriptの積み本からほどいた一冊がこちら

Slide 5

Slide 5 text

素のJavascriptによる 実践オブジェクト指向 著:しらたまほ(発行:イモに聞け) 技術書典13で購入しました

Slide 6

Slide 6 text

現在は、 技術書典マーケットとBOOTHで 購入できるようです 技術書典マーケット https://techbookfest.org/product/5173846357311488?productVa riantID=4791737553780736 BOOTH https://booth.pm/ja/items/1514854 ※URLは概要欄にも載せてあります※

Slide 7

Slide 7 text

ひとくち書評 手続き型指向からオブジェクト指向へリファクタリング 体系的にオブジェクト指向の導入と利点を学ぶ

Slide 8

Slide 8 text

ここからは、感想も含みつつ 個人的に学びになったことを 書籍の抜粋とともに紹介していきます

Slide 9

Slide 9 text

🤔 ここからは、感想も含みつつ 個人的に学びになったことを 書籍の抜粋とともに紹介していきます

Slide 10

Slide 10 text

前提事項 ● この書籍で作成されるサンプルコードは、 canvasタグを使用してweb画面上で描画をする処理である ● 描画はマウス、タッチのマルチ対応を要件としている ● 初めのサンプルコードは、手続き型での記述

Slide 11

Slide 11 text

3章 処理の分離 からの抜粋 前提事項での要件の中で 「マウス、タッチのマルチ対応」が可能 であることとあったが、 それぞれの処理の中で重複している箇所があるかもしれない

Slide 12

Slide 12 text

3章 処理の分離 からの抜粋 前提事項での要件の中で 「マウス、タッチのマルチ対応」が可能 であることとあったが、 それぞれの処理の中で重複している箇所があるかもしれない ので、重複している部分は統一するべき!

Slide 13

Slide 13 text

3章 処理の分離 からの抜粋 前提事項での要件の中で 「マウス、タッチのマルチ対応」が可能 であることとあったが、 それぞれの処理の中で重複している箇所があるかもしれない ので、重複している部分は統一するべき! だけど… コード上は全く同じであっても、 意味的に異なるものであれば、重複とみなさない方が良い場合もある

Slide 14

Slide 14 text

3章 処理の分離 からの抜粋 例えば… 全く同じ記述がされている AとBの処理があったとして、後に Bだけが変更される可能性 があるなら、これは重複とは言わない

Slide 15

Slide 15 text

3章 処理の分離 からの抜粋 例えば… 全く同じ記述がされている AとBの処理があったとして、後に Bだけが変更される可能性 があるなら、これは重複とは言わない 🤔 しかし、AかBどちらかを変更したとき、 必ずもう一方も同じ変 更を加えなければいけないのは「重複」となる

Slide 16

Slide 16 text

3章 処理の分離 からの抜粋 誤った重複の放置や統一を起こさないために、処理の分離は コードの抽象化から始める こと 処理の一つ一つを分割して、そこから共通する処理を抽出していく

Slide 17

Slide 17 text

3章 処理の分離 からの抜粋 誤った重複の放置や統一を起こさないために、処理の分離は コードの抽象化から始める こと 処理の一つ一つを分割して、そこから共通する処理を抽出していく コードの抽象化とは、 (一概には言えないけど) 具体性をなくすことによって、様々な値に対応できるようにする 具体的な値を渡す(コードを使う)側に、判断の責任を持たせる 🤔

Slide 18

Slide 18 text

4章 ハンドラの共通化 からの抜粋 イベントの判定〜それに当たる処理は switch文(イベントのtypeプロパティで判定)なども あるが、イベントハンドラのメソッドを作って呼び出す 方法もある

Slide 19

Slide 19 text

4章 ハンドラの共通化 からの抜粋 動作の処理をオブジェクトのメソッドとして定義して、

Slide 20

Slide 20 text

4章 ハンドラの共通化 からの抜粋 動作の処理をオブジェクトのメソッドとして定義して、 イベントのtypeと対応させるマップを用意する

Slide 21

Slide 21 text

4章 ハンドラの共通化 からの抜粋 イベントハンドラをひとつにまとめる

Slide 22

Slide 22 text

4章 ハンドラの共通化 からの抜粋 これでイベントハンドラはひとつのメソッド でまとめられて、 それぞれのイベント登録は同じハンドラを呼び出す記述 をすることができる 🤔 イベントハンドラをひとつにまとめる

Slide 23

Slide 23 text

4章 ハンドラの共通化 からの抜粋 それぞれのイベントハンドラはひとつのメソッドでまとめられたが、 継承を用いて、それぞれの共通している動作をまとめる こともできる

Slide 24

Slide 24 text

4章 ハンドラの共通化 からの抜粋 まずイベントハンドラを 関数からクラスに書き換える

Slide 25

Slide 25 text

4章 ハンドラの共通化 からの抜粋 それぞれのイベントで共通する部分を抽出して、抽象クラス(継承元)とする 抽象クラスから派生クラスを定義すると、 継承関係に矛盾が生じにくい

Slide 26

Slide 26 text

4章 ハンドラの共通化 からの抜粋 継承関係の矛盾とは… 例えば、TouchHandlerをPointerHandlerから継承して作成するとする

Slide 27

Slide 27 text

4章 ハンドラの共通化 からの抜粋 継承関係の矛盾とは… 例えば、TouchHandlerをPointerHandlerから継承して作成するとする 上記だと、TouchHandlerとPointerHandlerが別物であっても、 TouchHandlerが使えるところでは常に PointerHandlerも使えなくてはならない 、 という矛盾が生じてしまう 🤔

Slide 28

Slide 28 text

5章 独立化 からの抜粋 状態保存するオブジェクトと動作のオブジェクトがグローバルに置いてあると、ひとつの DOMしか操作ができない

Slide 29

Slide 29 text

5章 独立化 からの抜粋 状態保存するオブジェクトと動作のオブジェクトがグローバルに置いてあると、ひとつの DOMしか操作ができない しかし、状態保存のオブジェクトがグローバル変数でなくなると、イベントのメソッドから直 接操作することができなくなってしまう

Slide 30

Slide 30 text

5章 独立化 からの抜粋 状態保存するオブジェクトと動作のオブジェクトがグローバルに置いてあると、ひとつの DOMしか操作ができない しかし、状態保存のオブジェクトがグローバル変数でなくなると、イベントのメソッドから直 接操作することができなくなってしまう 一つの手法として、オブジェクトをパラメータとして渡す 方法がある

Slide 31

Slide 31 text

5章 独立化 からの抜粋 状態保存の オブジェクトを パラメータとして渡す

Slide 32

Slide 32 text

5章 独立化 からの抜粋 状態保存の オブジェクトを パラメータとして渡す 動作の オブジェクトも パラメータとして渡す

Slide 33

Slide 33 text

5章 独立化 からの抜粋 このようなオブジェクトにオブジェクトを渡すことを DI(Dependency injection)という

Slide 34

Slide 34 text

5章 独立化 からの抜粋 このようなオブジェクトにオブジェクトを渡すことを DI(Dependency injection)という DIとは、依存性の注入のことであり、使用するコンポーネントは外部ファイルや別のコン ポーネントを利用することで、 コンポーネント間の依存性を薄くする ことができる 🤔

Slide 35

Slide 35 text

5章 独立化 からの抜粋 このようなオブジェクトにオブジェクトを渡すことを DI(Dependency injection)という DIとは、依存性の注入のことであり、使用するコンポーネントは外部ファイルや別のコン ポーネントを利用することで、 コンポーネント間の依存性を薄くする ことができる 処理をオブジェクトとして持ち、必要に応じて処理を切り替えられるようにする設計を 「Strategyパターン」という

Slide 36

Slide 36 text

まとめ Javascriptはマルチパラダイム言語であるので、オブジェクト指向の記述ひとつ取って も、class構文を使ったクラスベースのものや、 Object.createを使ったプロトタイプベース のもの(ここでは紹介しませんでしたが) など、様々な実装があります 書籍に「プログラムは変更されるもの 」とありました スクラッチでの実装、リファクタリングなど場合を問わず、変更しやすい(適切な切り分 け、継承)コーディングをしていけるように努力しようと思いました

Slide 37

Slide 37 text

ちなみに... Javascriptベースのライブラリである ReactやVueはコンポーネント指向

Slide 38

Slide 38 text

ちなみに... Javascriptベースのライブラリである ReactやVueはコンポーネント指向 コンポーネント指向と オブジェクト指向の違いってなに?

Slide 39

Slide 39 text

ちなみに... コンポーネント指向 「機能のまとまり」を設計し、「機能に付随するデータ」を含めたものを「コンポーネント」に 包み込んで、そのコンポーネントの集合でソフトウェアを作成する オブジェクト指向 「セットになっているデータ」と「付随する処理」を「オブジェクト」に包み込んで、再利用性 や保守性を高めていく

Slide 40

Slide 40 text

ちなみに... コンポーネント指向 「機能のまとまり」を設計し、「機能に付随するデータ」を含めたものを「コンポーネント」に 包み込んで、そのコンポーネントの集合でオブジェクトを作成する オブジェクト指向 「セットになっているデータ」と「付随する処理」を「オブジェクト」に包み込んで、再利用性 や保守性を高めていく 最も大切な考え方は 「データのカプセル化・抽象化」 根本には1つのオブジェクトには 1つのまとまったデータを管理 しようという発想がある 🤔

Slide 41

Slide 41 text

ご 清 聴 あ り が と う #saitama.js ご ざ い ま し た