良い抽象化のために、抽象化の成否に関して判断基準を持てるだろうか。

ソフトウェアアーキテクチャの基礎ではモジュールの抽象度 \(A\) を次のように与えている。

\( A = \frac{\sum{m^a}}{\sum{m^c}+\sum{m^a}} \)

上の式で、 \(m^a\) は、モジュールの抽象的な要素(インターフェイスまたは抽象クラス)を表している。そして、 \(m^c\) は、具体的な要素(非抽象クラス)を表している。

1や0に近すぎる抽象度は抽象化に関する失敗を示唆してくれる。機械的に計測できそうという大きな強みもある。しかし抽象度のみをもって抽象化の成否まで判断するのは難しそうだ。

異なる観点の話としてはDescriptive Variable Names: A Code Smellが面白かった。この記事ではポリモーフィズムがもたらし得るメリットとして下記を挙げている。

Introducing polymorphism can constrain the space of possible implementations and make it simpler to mentally verify correctness of a piece of code. Completely polymorphic type signatures don’t permit descriptive variable names, but they do vastly constrain the space of implementations.

もしこちらを機械的に計測するとしたらメソッドのシグネチャに現れる型の内訳を使うのだろうか。しかし仮に計測できたとして数値目標を立てられるとも思えない。

行き詰まってしまったが、それは「抽象化の成否」を漠然と考えてしまったためのような気がする。より意味のある検討には具体例の収集が必要かもしれない。