Slide 1

Slide 1 text

プログラムと 名前にまつわる 雑談会

Slide 2

Slide 2 text

自己紹介 ● 名前: Akira Nakano ● 趣味: ボビンレース(はじめたばかり)

Slide 3

Slide 3 text

雑談会 プログラムと名前に関係するお話をつらつらと

Slide 4

Slide 4 text

名前と設計に関する考え (自分の)

Slide 5

Slide 5 text

名前と設計に関する考え 「雑談」で話す理由 ● 設計って一つの視点で行うものじゃない ● ユーザー, 開発者, フレームワーク, 実行環境, etc… ● 同じ題材でも求められるものが違う ○ 実在するお店のシステム ○ ゲーム内の武器屋

Slide 6

Slide 6 text

名前と設計に関する考え 「雑談」で話す理由 名前のみでは語れない、でも名前を考えることは大切 なので、若干無理やりな部分も! (収まり切らなかったとかじゃないよ!)

Slide 7

Slide 7 text

名前と設計に関する考え ちょっと名前から外れて、良い設計とはなにか? ● 疎結合が良い ● 高凝集が良い よく聞く話、なぜか?(というかなに?)

Slide 8

Slide 8 text

名前と設計 家が一つのパーツでできていたとする

Slide 9

Slide 9 text

名前と設計 窓が割れたら?

Slide 10

Slide 10 text

名前と設計 交換が効かない、全部捨てるしかない

Slide 11

Slide 11 text

名前と設計 逆に必要以上に細かく別れていたら?

Slide 12

Slide 12 text

名前と設計 求められる性能を発揮できない

Slide 13

Slide 13 text

名前と設計 ドアに連動して屋根が開いたら?

Slide 14

Slide 14 text

名前と設計 他の部分も怖くてさわれない

Slide 15

Slide 15 text

名前と設計 機能性(高凝集) と 独立性(疎結合) が求められる

Slide 16

Slide 16 text

名前と設計 プログラムも同じ 全部同じクラスやメソッドに書いてしまったら ● 仕様変更となったとき ● 不具合が見つかったとき ● 新しい機能を導入したいとき 適切な粒度で変更できますか?

Slide 17

Slide 17 text

名前と設計 プログラムも同じ 逆に複数の処理を跨がないと機能を達成できないとしたら ● 修正があったとき全て対応できるか ● 間違った使い方をしないと保証できるか ● 他の処理によって予期せぬ動作を引きおこなさないか 機能性を担保できますか?

Slide 18

Slide 18 text

名前と設計 適切な境界 ≒ 適切な名前 が必要!

Slide 19

Slide 19 text

名前と設計 バーガーショップの販売を模した処理を考えてみよう (Mのつくあのお店) ● 要素をクラス化すればいいよね ● 名詞で名前を付ければいいんでしょ? ○ お店 ○ カウンター ○ キッチン ○ お客さん

Slide 20

Slide 20 text

名前と設計 バーガーショップの販売を模した処理を考えてみよう (Mのつくあのお店) ● 要素をクラス化すればいいよね ● 名詞で名前を付ければいいんでしょ? ○ お店 ○ カウンター ○ キッチン ○ お客さん 本当か?

Slide 21

Slide 21 text

名前と設計 なんとなくこんな感じかな? お店 キッチン カウンター お客さん

Slide 22

Slide 22 text

名前と設計 「販売」はどこだ? お客さん 販売 お店 キッチン カウンター

Slide 23

Slide 23 text

「販売」ってなんだ?

Slide 24

Slide 24 text

名前と設計 ● 「販売」ってなんでしょうか? ● 名前は知っている ● なんとなくお客さんとお店のやりとりだと思う ● 本当にそうか? 境界線が曖昧(少なくとも、今の自分の中では)

Slide 25

Slide 25 text

名前と設計 名前「販売」について考える ● メニューを見せる ● 注文を受ける ● 注文をキッチンに伝える ● お金のやり取りを行う ● 商品番号を渡す ● 商品番号に紐づく商品を渡す 「お店」は出て来なかった(お客は隠れているだけかも)

Slide 26

Slide 26 text

名前と設計 販売 キッチン 番号 商品 注文を受ける 商品を渡す 注文 メニュー 見る

Slide 27

Slide 27 text

名前と設計 悪くなさそうだけど 販売 キッチン 番号 商品 注文を受ける 商品を渡す 注文 メニュー 見る

Slide 28

Slide 28 text

名前と設計 名前からの考え方 ● 「販売」という名前に自分は戸惑った ○ 他の人はどうだろうか? ● 「販売」という名前は他の機能を持たないだろうか ○ 「商品券」の販売は? ○ メニューの切り替えがあったら? ○ 不要な機能に違和感を示す名前か?

Slide 29

Slide 29 text

より独立した名前を探そう

Slide 30

Slide 30 text

例えば、こんなの

Slide 31

Slide 31 text

名前と設計 ● メニュー提供 ● 注文カウンター ○ 注文を受ける ■ 注文が正しいか確認する ■ 注文をキッチンに伝える ■ お金のやり取りを行う ■ 受け取り番号を発行する ● 提供カウンター ○ 商品の提供 ■ 受け取り番号が必要 ■ 商品が完成していれば提供する

Slide 32

Slide 32 text

名前と設計 注文カウンター キッチン 提供カウンター 注文 番号 商品 メニュー

Slide 33

Slide 33 text

名前と設計 注文カウンター キッチン 提供カウンター 注文 番号 商品 メニュー あれ?「販売」は何処へ・・・

Slide 34

Slide 34 text

販売 名前と設計 注文カウンター キッチン 提供カウンター 注文 番号 商品 メニュー 組み合わせて表現 ちょっと怪しい、まだふんわりしてる

Slide 35

Slide 35 text

名前と設計 注文カウンター キッチン 提供カウンター 注文 番号 商品 スペシャル メニュー 変化があっても受け入れられる A B

Slide 36

Slide 36 text

名前と設計 ● 目につく名前に惑わされない ● 名前(境界)を理解する ○ フォーカスしたい名前の本質を知る ● より小さい概念(の関係性)を見つける ○ カウンターは物理的には1つかもしれない ○ 概念としては「注文」「提供」の二つがある ● 可能なら具体的な名前を付け直す

Slide 37

Slide 37 text

ここから本当に雑談

Slide 38

Slide 38 text

名前に迷ったとき ● つぶやいてみる ○ 販売は商品を提供する。販売はメニューを変更する。 ○ 提供カウンタは商品を提供する。提供カウンタはメニューを変更する。 ● となりの人に聞いてみる ○ 2,3人が首を傾げなければ、たぶん大丈夫 ○ できれば会話してみると良い ● 英語に迷ったとき ○ 日本語 > 翻訳 > 画像検索 ○ 試している最中

Slide 39

Slide 39 text

ハンガリアン記法 ● 昔話!! ● Microsoftのチャールズ・シモニイにより考案された ● ハンガリー人らしく、そのままなネーミング ● それが保持するものの種類を示すタグを小文字で付ける

Slide 40

Slide 40 text

ハンガリアン記法 ハンガリアンは二つある ● システムハンガリアン ○ 一般に知られる(知られた)ハンガリアン ○ 暗黒面 ● アプリケーションハンガリアン ○ シモニイが本当に提唱したかったもの

Slide 41

Slide 41 text

ハンガリアン記法 ● システムハンガリアン ○ 変数の型を表現するタグをつける ○ int なら i, long なら l とかで iCount, lCountとする ○ 型があれば保証してくれる情報じゃない? ○ その変数の型が変更された時に保守が大変 ■ 逆に混乱の元になる ○ 推奨されない

Slide 42

Slide 42 text

ハンガリアン記法 ● アプリケーションハンガリアン ○ 変数の種類を表現するタグをつける ○ 安全な文字列ならsafeのs、逆ならunsafeのusなど ○ 型では保証できない領域を保証する ○ sPassword = usPassworld 危険なコードが見える ○ 現在は推奨されない(とおもう)

Slide 43

Slide 43 text

ハンガリアン記法 ● 現在 ○ usというタグの意味を知らないと理解できない ■ 省略の問題が残る ○ us(タグ)よりunsafe(名前)の方が読み手を選ばない ○ 型の力を強化できる ■ strong typedefなどにより強力な型付けが可能 ○ 意思は受け継ぎつつ非推奨かなと思う

Slide 44

Slide 44 text

曖昧な名前 ● Get ○ プログラムは、データをやり取りするので至る所に「取得」がある ○ どこから取得したのか? どう取得したのか? ○ 特にインフラレイヤでは気を付けたい(DBとかデバイス付近) ○ メンバのゲッター程度の軽い処理に対して記述されるもイメージ ● Check ○ チェックした後は?あっていればいいのか?間違っていればいいのか? ○ CheckPost(ポストである確認) より AllowPostOnly(ポストのみ許可) ○ CheckBox->Check() チェックマークをつける?(ちょっと無理やり) ● Filter ○ 除外するのか、選ぶのか・・・Selectとかどうですかね。

Slide 45

Slide 45 text

ユビキタス言語 DDDのプラクティスの1つ 開発者とドメインエキスパートとの間で共通の意味を持つ用語を構築する 開発者とドメインエキスパートを含めたチーム全体で作り上げる共通言語 名前に業務上の境界を設け、開発者とドメインエキスパートが会話をし ドメインへの理解を深め、モデルに反映させる。 共通認識の名前を用いることで、課題に則したモデリングが行える。 バイト経験者と飲食店の例とかをやってみたら面白いかもね!

Slide 46

Slide 46 text

文化 ● 名前は文化から生まれる。 ● 勝手に命名ルールを変更するのは文化破壊となる。 ● 一人で進むのはやめよう。 ● チームで考える(やるべきこと、そうで無いもの) ● 文化がなければ、小さなところから育てよう

Slide 47

Slide 47 text

まとめ

Slide 48

Slide 48 text

まとめ ● プログラムと名前は切っても切れない関係 ● 今も昔も色々な考えがある ● 名前の考え方も進化していく ● 読みやすく品質の高いコードを目指しましょう ● 足並みそろえよう

Slide 49

Slide 49 text

以上、ありがとうございました