generated at
mainの処理を上部に書く

最も重要な処理が最も目に留まるところに書くべき
上から徐々に抽象度を下げる方向で読むことができる

最も重要な処理というのは、多くの場合Interfaceということになる
moduleやfunctionのInterface
引数と返り値に相当する処理が最初の方に来て欲しい
1ファイルのスクリプトならmain関数がmainの処理ということになる
main関数を最も上部に書いていると良い



コーディングする際に、1つのfileのどこにmain関数を書くかは人によって異なる
ここで、main関数と呼んでいるのはそのfile内でrootとなるような関数のこと
そのfileの主人公的な処理のことを指しているmrsekut

例1
main関数を下部に書く
code
-- 上の方に小さめの関数を用意して f x = .. g x = .. -- 下部で結合する main = .. g . f

例2
main関数を上部に書く
code
-- 一番上にmain関数を書いておく main = .. g . f -- 下部に小さな関数を書く f x = .. g x = ..


mrsekutは例2の方が良いと思っている
一番大事な処理が一番目に入る場所にあるべき
ここでは関数の話をしているのでmain関数がfileの一番上にあるが、
型の表現力がある言語の場合は、型の定義を一番上に書くmrsekut
Code Readingしていくときに末端から読んでいかないだろう
mainの処理を見て、気になったら末端へ飛んでいくように読むはず
だったら一番上にmainがある方がいい
また、抽象度を揃えて書くようにしていれば、mainを読んでから、どの末端を次に読むべきかが自然と決まる


例2の中でも更にいくつか書き方がありうる
例2-1code
main = do big1 big2 -- big1に関するものをまとめて書く big1 = small1_2 . small1_1 small1_1 = .. small1_2 = .. -- big2に関するものをまとめて書く big2 = .. small2_1 = .. small2_2 = ..
例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
これは言語の仕様上、回避することができない
ts
const P: React.FC = () => { const a = ... const b = ... const c = ... // ↓これがmain処理なので本当は上部にあるべき return <div>...</div> }
強いて言えば関数に切り出すことでスッキリさせることはできる


Haskellでは = の直後にmainの処理を書いて、サブの処理を where に書く
これは理想の形
例.hs
msort :: Ord a => [a] -> [a] msort [] = [] msort xs = go $ map (: []) xs where go [a] = a go xs = go $ pairs xs pairs (a:b:t) = merge a b : pairs t pairs t = t

しかし、hoistingができないようなスクリプト言語や手続型の言語ではこのようには書けない
関数の定義が呼び出しより前にある必要がある
JSでは const f = () => .. と書いてたら無理だが、 function f() {..} と書けば耐えるとかがある


この辺の話、『Clean Code』とかに書いてそうだけど、どうなんだろうmrsekut
予想通り書いてたmrsekut
pp. 67-68にサラッと書いてた
全く意味がわからないが、著者(訳者)は逓減規則と呼ぶらしい





英語の語順がだいぶそんな感じあるな
大事なことを先に言う、後で装飾する