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!