スポンサーリンク

コードが書ける!数式が書ける!AAが書ける!スタンプが貼れる!

無料の匿名掲示板型SNS「このはちゃんねる

新規会員募集中!

プログラミングにおける分割統治の閃き

286, 2020-02-08

目次

分割統治(ぶんかつとうち)とは?

「分割統治」をご存知だろうか?

分割統治とは、大きな問題を小さな問題に切り分けて、ひとつずつ解決していく手法である。
この分割統治はプログラミングに限らず、色々なジャンルで使うことができる便利な手法だ。

大きな問題も、小さく切り分けると、意外と簡単に解決することが出来る。
それを繰り返すと気が付くと大きな問題が片付いているというカラクリだ。

私も日常的にプログラミングでこの分割統治を実行している。
分割統治を行うことで関数などを小さく切り分けて、コードの健康状態を維持することが出来るからだ。

この分割統治で最近、新たなひらめきを得たので、この記事で紹介したいと思う。

再利用化

その前にもう1つの考えを紹介したいと思う。
ご存知の人もいると思うが「再利用化」という考えだ。

これは、一度作ったものを再度別の用途に利用するという考えである。
「別の用途に」というところがミソだ。
プログラミングの用語で言えばモジュール化しているということである。

この再利用化という考えだが、これは分割統治と深い関係がある。
どういうことだろうか。

分割統治の閃き

実は、分割統治を実行すると、再利用化も同時に実行できていることがあるのだ。

私はCapというアプリの開発をこの5年間続けている。
全体のコード行数は4万行ぐらいなので、個人のプロダクトとしては中規模ぐらいのコード量だ。
このコード量になると、もはや自分で書いた関数や処理をすべて把握することは不可能である。

しかしCapの健康状態は優良に保たれていると言っていい。
これはなぜかというと、念入りな分割統治とリファクタリング、それから数々のアーキテクチャの失敗を繰り返したからである。

今回フォーカスしたいのはCapにおける分割統治についてだが、先ほども言ったように、分割統治を実行すると、開発者が気付かぬうちに再利用化も実行できていることがある。
これはどういうことか?

CapはCUIアプリケーションで、数々のコマンドを持っている。GitやGoをイメージしてもらうとわかりやすい。
それらのコマンドはモジュールになっていて、それぞれのコマンドが独立して動く。
ここまでは一般的な分割統治だ。

最近の開発で、このコマンドを再帰的に呼び出す処理が必要になった。
たとえばテンプレート言語の文法からCapのコマンドを呼び出すといった処理だ。
私は身構えて実装を進めたが、意外なことに実装はすんなりと終わった。

それはなぜかというと、コマンドの再利用化がうまくいっていたからだ。
コマンドが再利用化できているので、あとはこのモジュールをインスタンスにして実行すればそれで終わる。

大事な点は、私はコマンドの再利用化をあまり意識していなかった点である。
つまり、コマンドの作成当時、私は再利用を念頭に入れていなかった。
最初に作成したコマンドは5年の開発期間の内の最初の1年目である。この時点でコマンドの再利用化は考えていなかった。
テンプレート言語の実装が4年目ぐらいになってからだったが、この実装時、1年目に作ったコマンドは再利用化がすでに出来ていた。私はそれを意識していないにもかかわらず。

これはどういうことかというと、このコマンドの再利用化は分割統治と、一般的なmain関数のインターフェースがもたらしたものであるということだ。
main関数のインターフェースというのは、コマンドの持つインターフェースのことで、これはargcとargvを持つmain関数と同様のインターフェースである。全てのコマンドはこのインターフェースを持っている。

私はテンプレート言語内でコマンドを再帰的に呼び出したときに、このひらめきを得た。

分割統治とは再利用化のプロセスの中にある

分割統治は、再利用化と関連が深い。そしてそれは再利用化に至るプロセスの中にある。
分割統治を考えるということは、再利用化へ向かって進むということだ。
私はこのひらめきを得た。

モジュールを作る段階で、4年先に再利用される想定をするというのはとても難しい判断だ。
しかし、分割統治を実行し、モジュールとして独立させて、インターフェースを統一すれば、それはたやすい。

どんなに複雑なコマンドであっても、インターフェースが整理されていて使いやすくなっていて、戻り値が使いやすければ、それは複雑さを排除した単純なコマンドになる。
そしてそれを実現させるには分割統治が必要ということになる。

書いてみると、ただの関数の話だが、しかしこれはどういうことだろう。
関数は本来単純なものだが、書き手が複雑にしているのかもしれない。複雑なインターフェース、貧相な戻り値、プリミティブでないデータへの依存……。
インターフェースはシンプルにしたいところだ。戻り値も柔軟性のある値がいい。例外が使えれば例外を使う。プリミティブでないデータへの依存は、プロジェクトが抽象化されていくと避けては通れない問題だ。

話がそれたが、分割統治を実行することは関数を単純にし、モジュール化してインターフェースをシンプルにするということになる。そしてそれは再利用性が高まり、使いやすいものになる。
分割統治を念頭に置くことは悪くない精神論だと思う。

おしまい

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク