宣言的コーディング
Shigeki Suwa
@すわくん
株式会社オロ
デジタルトランスフォーメーション事業部
宣言的エンジニア
Slack
だいたいプログラミングの話です。
用法、要領を守って正しくお聞きください。
良いコードを書こう!という話
WARNING
TL;DR
納得感には個人差があります。
宣言的 ⇄ 命令的
命令的
HOW
どんな手順で行うか?
順番に説明する。
ボトムアップ
命令的な会話
「今、駅前にいます。
あなたの家に行くにはどうしたらいい?」
「北口から出て右に曲がり、3つ目の交差点を左に・・・」
宣言的
WHAT
それは結局何なのか?
結論から示す。
トップダウン
宣言的な会話
「今、駅前にいます。
あなたの家に行くにはどうしたらいい?」
「住所は XXX YYY 1-2-3 だよ。」
宣言的 ⇄ 命令的
ナビゲーション
レシピ
トラブル対応マニュアル
アクティビティ図
住所
料理名
活動指針
クラス図
手続き型・関数型
手続き型プログラミング
C/C++ Java BASIC …
プログラムは手順書である。
コンピュータは手順書のとおりに処理を行い、結果を得る。
コンピュータの仕組みをベースとしたプログラミング手法
チューリングマシン ノイマン型コンピュータ アセンブリ
手続き型のコード
CPUやメモリ等を備えた
コンピュータに対する小さな命令の羅列
HOW:どのように行うか?
計算の手順を記述する
・コンピュータフレンドリー
・命令的コード
function sum (x) {
let total = 0
for (let i = 1; i <= x; i++) {
total = total + i
}
return total
}
sum(10) //=> 55
関数型プログラミング
Haskell F# Scala …
プログラムは関数定義の羅列である。
コンピュータは関数に従って値を計算し、結果を得る。
数学・集合論をベースとしたプログラミング手法
ラムダ計算 集合 写像 論理型/制約型プログラミング
関数型のコード
変数を受け取り、結果を表した「関数」
関数定義の羅列
WHAT:それは何なのか?
計算の性質や対応関係を記述する
・数学フレンドリー
・宣言的コード
function sum (0) = 0
function sum (x) = x + sum(x - 1)
function main = sum(10)
//=> 55
宣言的コーディング
「宣言」
宣言的コーディング 何を「宣言」する?
処理の結果・結論
データの構造・性質
全体像・要約
結論を明らかにする。
命令的コーディング
手続き型プログラミングのように
フロー制御で値を書き換える(HOW)
Good:
処理の内容は柔軟
フローチャート的で分かりやすい
Bad:
最終的にどうなるかが分かりづらい
function main (x) {
let result = {}
if (x > 0) {
result.isValid = true
result.double = x * 2
} else {
result.isValid = false
}
return result
}
宣言的コーディング
関数型プログラミングのように
結果の性質を記述する(WHAT)
Good:
最終的にどうなるか一目瞭然
簡潔になる
Bad:
柔軟さに少し欠ける
function main (x) {
let isValid = x > 0
return {
isValid,
double: isValid ? x * 2 : null
}
}
※手続き型言語による宣言的コード
命令的なアタマ
前提条件
先頭から実直に… 結論から逆算して…
最終目的
道筋を考える。
宣言的なアタマ
処理
どのような構造か? 似た性質はあるか?
最終目的
前提条件
処理
処理
分解して結合する。
「宣言」
宣言的コーディング 何を「宣言」する?
処理の結果・結論
データの構造・性質
全体像・要約
結論を明らかにする。
人のためのコード
ものづくりが目的であり、プログラミングはあくまでも手段。
コードを読み書きするのは未だ人間。
読みやすいコード ⇒
書き換えやすいコード ⇒
簡潔でバグの少ないコード ⇒
生産性の高いプロジェクト
保守性の高いコード
品質の高いプロダクト
こだわるワケ。
宣言的コーディング
It's over!
宣言的コーディング
By Shigeki Suwa
宣言的コーディング
- 1,016