この記事の概要
対象者
- 実務的なPythonコードを書きたい人
- プログラムの良い設計とはどのようなものなのかを知りたい人
- PyQで「設計」のクエストをしたけれどピンと来なかった人
記事を読むのにかかる時間
- 約8分
質問内容
PyQには「設計」というコードの組み立て方を学ぶ課題があります。
こちらの問題に関するご質問をいただきました。
「何度も行う処理を関数にまとめる」というクエストがあり、生コードを 関数にまとめるというのがありました。まとめた関数が配置されたコードだと、毎回その関数 を読み解く必要があり、かなり煩わしさを感じ、一つの関数にまとめて書くほうがいいのではないかと思いました。 関数がたくさんあっても徐々に読み解けるようになって、煩わしさは解消されるものなのでしょうか。
回答
問題中にも解説がありますが、単純に「同じ処理だから」という理由だけで共通の関数にするのはオススメしません。 1つの機能に対する処理を関数にまとめます。テストもこの機能単位(関数やクラス)で実装します。
また、関数は内部の実装を確認しなくても、何をするものかわかっていれば使えます。 「Xというデータを渡したらYという結果を返す(もしくは何か処理をする)」と認識しておけばいいです。
そのために、なるべく何をしている関数かわかる関数名をつけます。
例えば、クエスト「33-2: 関数にするポイントと設計」 1問目で定義している関数ですと read_csvという関数名なので「csvのデータを読込みその結果を返してくれる関数」と予測がつきます。 2問目のwrite_csvは、「渡したデータをcsvに書き込んでくれる関数」と予測がつきます
そうは言っても、PyQの問題のような短いプログラムですと関数やクラスの良さがわかりづらいです。 欲しい処理を上から順に書いて置いたほうが読みやすいと思います。
実際の業務
実際の業務では沢山の「他人が書いたプログラム」と「自分が過去に書いたプログラム」を組み合わせてアプリケーションを作っていきます。
毎回、すべてのプログラムを読むのは時間的に無理です。また、すべての機能を把握して1人で実装するのも時間がかかります。
(すでに存在するライブラリなどを再作成することを、すでに世の中に存在する車輪を再度作ることに例えて「車輪の再発明」などと揶揄します)
機能を関数にまとめて、他の人でも簡単に利用できる状態にしておくことが重要です。
実際、自分が書いたプログラムでもしばらく経ってから読むとまったく覚えのないコードになっています。 プログラミングはなるべく分かりやすい機能ごとに分割して、それごとにテストをしておくと、仕様追加や仕様変更が発生しても該当部分を修正し、試験するだけでよくなります。
もし、全ての処理を1つの関数内に書き、そこに修正を加えると前回の作成時と同じ分量の試験を行う必要が出てきます。
このようにプログラムは、機能ごとに処理を分割して記述していくという思考で設計されます。
これを踏まえて、クエスト 「関数にするポイントと設計」 の問題文と解説を読んでいただけませんでしょうか。