見出し画像

main()は最初?最後?プログラムの書き方

TL;DR

プロジェクト等で決まりがなければ自分に合わせたやり方をすれば良いとは思います。とは言え好きにせいでは不親切なので個人的な指針を書くと、プログラムをトップダウンで書くならmain()が先、ボトムアップで書くなら後かな、と。もっとも、個人的にはどちらにしろmain() は最後かも。

なぜmain()が下?昔は制約が多かった

素朴な疑問

先日まで新入社員向けのIT研修のサブ講師で早起きで通勤していたのが終わり、気が抜けてやる気スイッチが行方不明な今日この頃。
そんなんでSNSを見ていたらmain()は上か下かみたいなポストを見かけました。そう言えば、研修中にもお一方からそのようなことを訊かれました。
どちらでもよいので書きやすい方でとは答えましたが、テキストに合わせておいたら、という感じです。

昔は制約があった

SNSにポストされた方はおそらくこの制約をご存知の方かと思いますが、知らない方のために補足。
昔のC言語は今よりはるかに非力なコンピュータで動かすために、色々と妥協していました。例えば、変数名や関数名の長さ制限とか。今はいくらでも長い名前をつけられますが、昔は20文字とか。さらに書いてもよいけど先頭から8文字しか認識しないよ、なんてことも。

そんな感じで、関数についても呼び出される側は呼ぶ側より先に書かないといけないという制約がありました。
それはあまりにあんまりなので、その後のC言語では先に宣言することができるようになりましたが、互換性を保つために呼び出される側を先に書くルールを採用するプロジェクトも多かったのではないでしょうか。

ボトムアップかトップダウンか?それが問題かも

制約なきが故の問題

もちろん今時のプログラミング言語にはそんな制約はないですから、書く順番は自由。でも、自由というのは不自由の裏返し。そうなるとどっちが先か論争が勃発します。そんな時、手っ取り早く「そういうもんだったから」で押し切るのも無駄な論争を避けるという点では一つの手ではあります。

ただ、それでは芸がないのでもう少し理論武装すると、プログラムをトップダウンで書くか、ボトムアップで書くかで分ければよいのではないかと。

なぜトップダウンは先、ボトムアップは後なのか

プログラムを書くときに、おおまかな方から細かくしていくトップダウンと、逆に詳細な方から積み上げていくボトムアップがあるかと思います。
そうすると、流れ的にはトップダウンならまずはmain()を書いて、それからそこから呼ばれる関数を書いて、となるのが普通かと。
逆に、ボトムアップならば末端の機能の方から書いていくので、最後にmain()が来るのが自然かな、と。

もちろん、何が自然かは個人の見解もあるのでそうじゃないという方もおられるとは思います。これはあくまで私見。指針がないならこうしてみることを検討してみては?程度のものです。

個人的おすすめ:トップダウンで書くメリット

その上で、もうちょっと指針はないかという話であれば、とりあえず研修や独学で学び始めた初学者であれば、トップダウンにしてmain()を先頭にすることを自分はおすすめします。

理由は以下。

  • やりたいおおまかなことから詳細化していく方が考えやすい

  • そもそも詳細な機能の方から書くには慣れが必要

  • リファクタリングを考えると先に詳細な方を考えても修正が必要

  • 部分的に動かして確認しながら進められる

特に最後。初心者の方でいきなり全部を書いてから動かそうとして、山のようなエラーに遭遇して途方に暮れる方は多いです。
まあ、上から順に対応していけばよいのですが、いきなりエラーがどどんと出たら慌てますよね。
それを避けるためにも、ワンステップずつ理解するためにも、プログラムはちょっとずつ書いては動かしするのがおすすめ。

そのためにはmain()が先にあった方がやりやすいと思います。

それでもmain()は最後

以上は、あくまで初学者で指針が欲しいという方向けの話。自分は実際どうするかと言えば、だいたいはトップダウン、かつmain()は最後かな、と。

おいおい書いてきたことと違うじゃないかと思うかもしれませんが、これには裏が。
個人的にはmain()は単なる起点であって「メイン」ではないと考えます。つまり、main()の役割は真なるメイン処理のための下準備などをしてからそれを呼び出し、必要なら後始末をする程度の位置付け。
だから、真なるメイン処理を先頭に書き、そこから呼び出すものから書いていきます。で、最後の最後にmain()を置く。
これはあくまで私見であって、こうするのが普通とか、すべきとかいうものではありません。
要はポリシーを持って書きましょうというだけです。

まとめ:あまりそこで考え込んでも意味がない

というわけでmain()をソースのどこに書くか、それ以前にどうロジックを組み立てていくのかみたいな話を書きました。
初学者はトップダウンで考えて、少しづつ動かして確認しながら書くのがよいのではないか。それならmain()は先だよねというのが自分の考えです。

と言いつつ、個人的にはそこはあまり重要ではないかな、と考えています。
CLIのプログラムを書くならともかく、今時のシステム開発でmain()を書くことも少ないですよね。Webとかフレームワークとか使うようになると、main()とかと関係なく処理するイベント等に応じて関数等を書くことになるので、そうなるとmain()の場所とか関係なくなるので。
とは言えイベントハンドラとそこから呼ばれるものをどう並べるかみたいな話は残ります。個人的にはイベントハンドラが先かな、と。

要は見てもらいたいものを先に書く。main()が本当にメインなら先に書くし、モジュール分けの観点からmain()と別に真なるメイン処理を置くならmain()は最後でよいよね、という考え方です。
一番大切なのは半年後の自分を含めた他人が後からソースを見てわかりやすいのはどうなのか?になります。

拙い記事でございますが、サポートしてもよいよという方はよろしくお願いします。著者のやる気アップにつながります。