mainの処理を上部に書く
最も重要な処理が最も目に留まるところに書くべき
上から徐々に抽象度を下げる方向で読むことができる
最も重要な処理というのは、多くの場合Interfaceということになる
moduleやfunctionのInterface
引数と返り値に相当する処理が最初の方に来て欲しい
1ファイルのスクリプトならmain関数がmainの処理ということになる
main関数を最も上部に書いていると良い
コーディングする際に、1つのfileのどこにmain関数を書くかは人によって異なる
ここで、main関数と呼んでいるのはそのfile内でrootとなるような関数のこと
そのfileの主人公的な処理のことを指しているmrsekut.icon
例1
main関数を下部に書く
code:code
-- 上の方に小さめの関数を用意して
f x = ..
g x = ..
-- 下部で結合する
main = .. g . f
例2
main関数を上部に書く
code:code
-- 一番上にmain関数を書いておく
main = .. g . f
-- 下部に小さな関数を書く
f x = ..
g x = ..
mrsekut.iconは例2の方が良いと思っている
一番大事な処理が一番目に入る場所にあるべき
ここでは関数の話をしているのでmain関数がfileの一番上にあるが、
型の表現力がある言語の場合は、型の定義を一番上に書くmrsekut.icon
mainの処理を見て、気になったら末端へ飛んでいくように読むはず
だったら一番上にmainがある方がいい
また、抽象度を揃えて書くようにしていれば、mainを読んでから、どの末端を次に読むべきかが自然と決まる 例2の中でも更にいくつか書き方がありうる
code:例2-1code
main = do
big1
big2
-- big1に関するものをまとめて書く
big1 = small1_2 . small1_1
small1_1 = ..
small1_2 = ..
-- big2に関するものをまとめて書く
big2 = ..
small2_1 = ..
small2_2 = ..
code:例2-2code
main = do
big1
big2
-- bigなものをまとめて書く
big1 = small1_2 . small1_1
big2 = small2-2 . small2_1
-- smallなものをまとめて書く
small1_1 = ..
small1_2 = ..
small2_1 = ..
small2_2 = ..
その大きめの処理の中で使われるような小さめの処理をどこに書くのか
個人的には前者2-1の方が良いと思っている
関心が近いものは近くに書くべき
これはhaskellのwhereでの定義ともマッチする
仮にbig1でもbig2でも使われるような小さな関数があれば、それはfileのさらに下部に定義すればいい
React Componentを書くときに、returnの前に変数をダラダラ書くのも本当はやりたくないmrsekut.icon
これは言語の仕様上、回避することができない
code:ts
const P: React.FC = () => {
const a = ...
const b = ...
const c = ...
// ↓これがmain処理なので本当は上部にあるべき
return <div>...</div>
}
強いて言えば関数に切り出すことでスッキリさせることはできる
Haskellでは=の直後にmainの処理を書いて、サブの処理をwhereに書く
これは理想の形
code:例.hs
msort [] = []
msort xs = go $ map (: []) xs
where
go xs = go $ pairs xs
pairs (a:b:t) = merge a b : pairs t
pairs t = t
しかし、hoistingができないようなスクリプト言語や手続型の言語ではこのようには書けない 関数の定義が呼び出しより前にある必要がある
JSではconst f = () => ..と書いてたら無理だが、function f() {..}と書けば耐えるとかがある
予想通り書いてたmrsekut.icon
pp. 67-68にサラッと書いてた
全く意味がわからないが、著者(訳者)は逓減規則と呼ぶらしい 大事なことを先に言う、後で装飾する