Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
プログラムと名前にまつわる座談会
Search
Infiniteloop
October 17, 2023
Programming
0
88
プログラムと名前にまつわる座談会
たかが命名、されど命名。名前から考えるよいコード【タガヤス その4】発表資料(3)
https://tagayas.connpass.com/event/80363/
Infiniteloop
October 17, 2023
Tweet
Share
More Decks by Infiniteloop
See All by Infiniteloop
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
0
270
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
0
340
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
infiniteloop_inc
0
410
詫び石の裏側
infiniteloop_inc
0
370
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
6
25k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
140
ADRという考えを取り入れてみて
infiniteloop_inc
0
130
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
110
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
83
Other Decks in Programming
See All in Programming
macOS でできる リアルタイム動画像処理
biacco42
9
2.4k
CSC509 Lecture 09
javiergs
PRO
0
140
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
tomoya0x00
0
190
Outline View in SwiftUI
1024jp
1
330
エンジニアとして関わる要件と仕様(公開用)
murabayashi
0
280
Hotwire or React? ~アフタートーク・本編に含めなかった話~ / Hotwire or React? after talk
harunatsujita
1
120
Ethereum_.pdf
nekomatu
0
460
Jakarta EE meets AI
ivargrimstad
0
130
イベント駆動で成長して委員会
happymana
1
320
LLM生成文章の精度評価自動化とプロンプトチューニングの効率化について
layerx
PRO
2
190
聞き手から登壇者へ: RubyKaigi2024 LTでの初挑戦が 教えてくれた、可能性の星
mikik0
1
130
弊社の「意識チョット低いアーキテクチャ」10選
texmeijin
5
24k
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Become a Pro
speakerdeck
PRO
25
5k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Code Reviewing Like a Champion
maltzj
520
39k
Facilitating Awesome Meetings
lara
50
6.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Transcript
プログラムと 名前にまつわる 雑談会
自己紹介 • 名前: Akira Nakano • 趣味: ボビンレース(はじめたばかり)
雑談会 プログラムと名前に関係するお話をつらつらと
名前と設計に関する考え (自分の)
名前と設計に関する考え 「雑談」で話す理由 • 設計って一つの視点で行うものじゃない • ユーザー, 開発者, フレームワーク, 実行環境, etc…
• 同じ題材でも求められるものが違う ◦ 実在するお店のシステム ◦ ゲーム内の武器屋
名前と設計に関する考え 「雑談」で話す理由 名前のみでは語れない、でも名前を考えることは大切 なので、若干無理やりな部分も! (収まり切らなかったとかじゃないよ!)
名前と設計に関する考え ちょっと名前から外れて、良い設計とはなにか? • 疎結合が良い • 高凝集が良い よく聞く話、なぜか?(というかなに?)
名前と設計 家が一つのパーツでできていたとする
名前と設計 窓が割れたら?
名前と設計 交換が効かない、全部捨てるしかない
名前と設計 逆に必要以上に細かく別れていたら?
名前と設計 求められる性能を発揮できない
名前と設計 ドアに連動して屋根が開いたら?
名前と設計 他の部分も怖くてさわれない
名前と設計 機能性(高凝集) と 独立性(疎結合) が求められる
名前と設計 プログラムも同じ 全部同じクラスやメソッドに書いてしまったら • 仕様変更となったとき • 不具合が見つかったとき • 新しい機能を導入したいとき 適切な粒度で変更できますか?
名前と設計 プログラムも同じ 逆に複数の処理を跨がないと機能を達成できないとしたら • 修正があったとき全て対応できるか • 間違った使い方をしないと保証できるか • 他の処理によって予期せぬ動作を引きおこなさないか 機能性を担保できますか?
名前と設計 適切な境界 ≒ 適切な名前 が必要!
名前と設計 バーガーショップの販売を模した処理を考えてみよう (Mのつくあのお店) • 要素をクラス化すればいいよね • 名詞で名前を付ければいいんでしょ? ◦ お店 ◦
カウンター ◦ キッチン ◦ お客さん
名前と設計 バーガーショップの販売を模した処理を考えてみよう (Mのつくあのお店) • 要素をクラス化すればいいよね • 名詞で名前を付ければいいんでしょ? ◦ お店 ◦
カウンター ◦ キッチン ◦ お客さん 本当か?
名前と設計 なんとなくこんな感じかな? お店 キッチン カウンター お客さん
名前と設計 「販売」はどこだ? お客さん 販売 お店 キッチン カウンター
「販売」ってなんだ?
名前と設計 • 「販売」ってなんでしょうか? • 名前は知っている • なんとなくお客さんとお店のやりとりだと思う • 本当にそうか? 境界線が曖昧(少なくとも、今の自分の中では)
名前と設計 名前「販売」について考える • メニューを見せる • 注文を受ける • 注文をキッチンに伝える • お金のやり取りを行う
• 商品番号を渡す • 商品番号に紐づく商品を渡す 「お店」は出て来なかった(お客は隠れているだけかも)
名前と設計 販売 キッチン 番号 商品 注文を受ける 商品を渡す 注文 メニュー 見る
名前と設計 悪くなさそうだけど 販売 キッチン 番号 商品 注文を受ける 商品を渡す 注文 メニュー
見る
名前と設計 名前からの考え方 • 「販売」という名前に自分は戸惑った ◦ 他の人はどうだろうか? • 「販売」という名前は他の機能を持たないだろうか ◦ 「商品券」の販売は?
◦ メニューの切り替えがあったら? ◦ 不要な機能に違和感を示す名前か?
より独立した名前を探そう
例えば、こんなの
名前と設計 • メニュー提供 • 注文カウンター ◦ 注文を受ける ▪ 注文が正しいか確認する ▪
注文をキッチンに伝える ▪ お金のやり取りを行う ▪ 受け取り番号を発行する • 提供カウンター ◦ 商品の提供 ▪ 受け取り番号が必要 ▪ 商品が完成していれば提供する
名前と設計 注文カウンター キッチン 提供カウンター 注文 番号 商品 メニュー
名前と設計 注文カウンター キッチン 提供カウンター 注文 番号 商品 メニュー あれ?「販売」は何処へ・・・
販売 名前と設計 注文カウンター キッチン 提供カウンター 注文 番号 商品 メニュー 組み合わせて表現
ちょっと怪しい、まだふんわりしてる
名前と設計 注文カウンター キッチン 提供カウンター 注文 番号 商品 スペシャル メニュー 変化があっても受け入れられる
A B
名前と設計 • 目につく名前に惑わされない • 名前(境界)を理解する ◦ フォーカスしたい名前の本質を知る • より小さい概念(の関係性)を見つける ◦
カウンターは物理的には1つかもしれない ◦ 概念としては「注文」「提供」の二つがある • 可能なら具体的な名前を付け直す
ここから本当に雑談
名前に迷ったとき • つぶやいてみる ◦ 販売は商品を提供する。販売はメニューを変更する。 ◦ 提供カウンタは商品を提供する。提供カウンタはメニューを変更する。 • となりの人に聞いてみる ◦
2,3人が首を傾げなければ、たぶん大丈夫 ◦ できれば会話してみると良い • 英語に迷ったとき ◦ 日本語 > 翻訳 > 画像検索 ◦ 試している最中
ハンガリアン記法 • 昔話!! • Microsoftのチャールズ・シモニイにより考案された • ハンガリー人らしく、そのままなネーミング • それが保持するものの種類を示すタグを小文字で付ける
ハンガリアン記法 ハンガリアンは二つある • システムハンガリアン ◦ 一般に知られる(知られた)ハンガリアン ◦ 暗黒面 • アプリケーションハンガリアン
◦ シモニイが本当に提唱したかったもの
ハンガリアン記法 • システムハンガリアン ◦ 変数の型を表現するタグをつける ◦ int なら i, long
なら l とかで iCount, lCountとする ◦ 型があれば保証してくれる情報じゃない? ◦ その変数の型が変更された時に保守が大変 ▪ 逆に混乱の元になる ◦ 推奨されない
ハンガリアン記法 • アプリケーションハンガリアン ◦ 変数の種類を表現するタグをつける ◦ 安全な文字列ならsafeのs、逆ならunsafeのusなど ◦ 型では保証できない領域を保証する ◦
sPassword = usPassworld 危険なコードが見える ◦ 現在は推奨されない(とおもう)
ハンガリアン記法 • 現在 ◦ usというタグの意味を知らないと理解できない ▪ 省略の問題が残る ◦ us(タグ)よりunsafe(名前)の方が読み手を選ばない ◦
型の力を強化できる ▪ strong typedefなどにより強力な型付けが可能 ◦ 意思は受け継ぎつつ非推奨かなと思う
曖昧な名前 • Get ◦ プログラムは、データをやり取りするので至る所に「取得」がある ◦ どこから取得したのか? どう取得したのか? ◦ 特にインフラレイヤでは気を付けたい(DBとかデバイス付近)
◦ メンバのゲッター程度の軽い処理に対して記述されるもイメージ • Check ◦ チェックした後は?あっていればいいのか?間違っていればいいのか? ◦ CheckPost(ポストである確認) より AllowPostOnly(ポストのみ許可) ◦ CheckBox->Check() チェックマークをつける?(ちょっと無理やり) • Filter ◦ 除外するのか、選ぶのか・・・Selectとかどうですかね。
ユビキタス言語 DDDのプラクティスの1つ 開発者とドメインエキスパートとの間で共通の意味を持つ用語を構築する 開発者とドメインエキスパートを含めたチーム全体で作り上げる共通言語 名前に業務上の境界を設け、開発者とドメインエキスパートが会話をし ドメインへの理解を深め、モデルに反映させる。 共通認識の名前を用いることで、課題に則したモデリングが行える。 バイト経験者と飲食店の例とかをやってみたら面白いかもね!
文化 • 名前は文化から生まれる。 • 勝手に命名ルールを変更するのは文化破壊となる。 • 一人で進むのはやめよう。 • チームで考える(やるべきこと、そうで無いもの) •
文化がなければ、小さなところから育てよう
まとめ
まとめ • プログラムと名前は切っても切れない関係 • 今も昔も色々な考えがある • 名前の考え方も進化していく • 読みやすく品質の高いコードを目指しましょう •
足並みそろえよう
以上、ありがとうございました