科学と家事とプログラミング (python を中心に)

python 温度計測 湿度計測 DS18B20 USB9097

超構造化(03) 処理の抽象化

処理の抽象化

if/else や for のブロック(入れ子)を指して、処理の抽象化という言葉が使われることがある。 荒っぽい理解としては、それらのブロックにより「部分/全体関係」が明確になるという理解で良いだろう。 部分/全体関係が構築されるだけで、どうしてそれを抽象化と呼ぶのか? 抽象が含意するところは文脈によって様々だが、ここでは、反対語である具体との関係に注目しつつ、部分全体関係を捉えなおしてみよう。 部分に注目すれば、

その "具体的" な実装によらない、部分の定義/把握が可能となる

全体に注目すれば、

"具体的"な部分(要素)の詳細に立ち入ることなく、全体(の構造)を把握できる。

せっかくの構造化だから、全体の流れという表現は避けてみた。 ここでの抽象化は、モデル化とか仕様化でも意味はほとんど同じ。 機能や役割が同じなら(具体的な詳細/実装は違っていても)、その部分を等価なもので置き換えられるということ。 このことを強調すれば、抽象(化)は「同じとみなす/みなせる」という理解につながる。つまり、抽象化は同一性あるいは互換性を意味する。少し否定的なニュアンスを含んだ言い方をすれば、細かな違いは「まるめてしまう」ということ。仕様化の場合は、明証性や検証可能性に重きを置いた言い方だし、モデル化の場合は、ある目的や枠組みの中で(道具として)役に立つことが期待される。この「ある枠組みの中で」というのがとても大事なのだけど、それはさておき、こうして、部分/全体関係としてのブロック構造を手に入れた時、if/elseや for のブロックを一言で言い当てられれば、それは上手なプログラムと言って良い。この手の話は、サブプログラム(FORTRAN の subroutine とか, C の function)を対象として説明される事はあっても、if/else や for 文のブロックを対象とした説明は見かけない。いつでも成り立つというわけではないが、

ネストに立ち入ることなく全体を把握できるか?

より一般的には、

上下の階層を気にせず、特定の階層に思考を集中できるか

という視点は大事にしてもらいたい。

抽象と部分の独立性

抽象というコトバが指す意味が分かりにくい場合も多いが、上で使った「具体的な○○に依らない/立ち入らない...」というフレーズで言い換えると、ストンと腑に落ちる場合もあるかと思う。より広範な議論は、"情報系+α ことのは辞典"の伊藤潔さんあたりが参考になる。if/else や for が保障するのは、実行制御(処理の順番)に限った独立性の話であって、ネストをまたいで設定/参照されるデータやフラグがあると、総合的な部分の独立性 (コード断片の部品としての扱いやすさ)は容易に損なわれてしまう。話の続きは、「条件分岐vs 場合分け」にて…

f:id:sken20k:20180210113944j:plain