2017-12-16

忘れられた合理性の追求(3)

(つづき)

今回は具体的なプログラミング技術について少しだけ踏み込んで書いてみます。

約30年前にフリーになったのですが、その頃同じ時期にフリーになった仲間がいました。
それまでの経歴は僕とは違っていて、様々なコーディング規約などに縛られる世界にいたようでした(かなり大手の企業です)。

そんな仲間から聞いた話で、関数は何ステップ以内で書かなければならない、といった馬鹿げた規約があったと聞いていました。

当時はまだオブジェクト指向というものが我々の世の中には存在しない時期でしたから、せいぜいその技術は構造化プログラミング止まりでした。それでも、C言語以外にN88Basicという原始的なプログラミング言語(グローバル変数しかない)も生き残っている時代であり、関数の中だけで有効なローカル変数のありがたみを実感しながらC言語を喜んで使っていたものです。

ところが、当時はまだC言語に const というキーワードがなく、信じられないことに定数のポインタでもポインタの先を書き換えてしまうことができてしまっていました。恐ろしいですね。

しかし、この定数を書き換えてはいけないことくらいは誰に教えられなくても理解していました。コンパイルされたコードを考えても、定数領域はプログラミングコードと同じセグメントにあって、その領域を破壊することがどんなに危険か、というのは説明するまでもない話ですね。

ステップ数が具体的な数値を持って規則とされていることがいかに馬鹿げているか、これについても同様に正常な環境で学んだ人ならばすぐに判るはずです。あえて説明するまでもない自明の理と言えるものです。

あえて少し説明すると、

関数のまとまりというものは、処理の意味的なまとまりであって、数量的な結果とはほぼ無関係です(処理内容ごとに統計を取ってみたらある程度の相関関係はあるかも知れませんが)。そういうコーディングをすることが自然なのです。
意味的にまとめて、そこに関数というインタフェースを介在させることでポータビリティが生まれ、その独立性が高ければ高いほど関数は汎用的になり、存在価値が増します。
しかし、一カ所からのみ呼ばれることが判っている関数であっても、処理の独立性を持たせることで(変数のスコープを限定することなどで)信頼性や保守性が高くなり、処理を積極的に関数化することもあります。

ところで、この話はオブジェクト指向言語の場合は更に複雑に様々な条件が付加されされます。ここではあくまで単純な構造化プログラミングを前提とした話に限定しています。ラムダ式やクラスメソッドの公開、非公開のことなど、ここでは考えないでください!

さて、関数化することの根拠そのものがそういったことですから、そこにステップ数が多すぎるとか、複雑度(ifやswitch case、whileやfor等での処理の分岐の数のことだそうです)が高すぎるとか、そんなつまらないことがコーディング時の考えに入り込む余地など本来あり得ません。
よほど単純な処理を書くことが前提なのでしょうか。一律にどんな処理でも~ステップ以内にしろ、とか、全く理解できない話です。

もし、関数の処理で物量的なことを言うのであれば、明らかに同じ処理が何度か出現しているのに関数化していないとか、複数の異なった処理のまとまりを1つの関数にだらだらと書いてしまっているとか、そんな時は関数に分けましょう、といった話はできますね。


まあ、そんなこんなで、当時フリー仲間から聞いた話は笑い話として受け取っていました。それは30年以上前の話になります。今では遠い遠い昔の、しかも笑い話にもならない下らない噂レベル、そして僕はそんな古代の話は忘れかけていました。

ところがっ!!

(つづく)

0 件のコメント:

コメントを投稿