研究テーマ:
Leaky Abstraction に関する
ケーススタディ
新山 祐介

Leaky Abstraction とは?

  1. ある日、連想配列の使い方をおぼえた:
    put(k,v); v = get(k);
  2. 要素を入れていくうちに激遅くなった。
  3. 「なんで?」
    • → 内部のハッシュ関数がヘボかった。
    • じつは、あんまり沢山ものを入れてはいけないらしい。
      「でも、そんなの聞いてないyo!」

Leaky Abstraction の定義

Leaky Abstraction の例

Leaky Abstraction の例

Leaky Abstraction はなぜ悪か

研究テーマ

Leaky Abstraction の定義

Leaky Abstraction の分類

仕様のリークって?

つまり、仕様できちんと説明されていないもの。

  1. 暗黙の条件 (が抜けている):
    • いつ使えるか: parseInt(s)sが実際に数のとき。
    • いつ使えないか: 2**n, x/y

仕様のリーク・つづき

  1. 言語の意味が狭義すぎる:
    • C++ における「文字列」 … "foo" は文字列ではない
    • fopenファイル開く
      • 「ファイル」 … OS が定義するファイル。
      • 「開く」 … OS の操作としての open。
    • KeyEventは、 コンポーネント中でキーストロークが起きたことを 表すイベントです」

仕様のリーク・つづき

  1. loaded word あるいは表現を圧縮しすぎ
    • 「文字列を整数に変換します」
    • 「HTTP接続を開きます
      「開く」 … DNS, TCPハンドシェイク, 証明書の受信, 署名の確認, HTTPリクエスト送信

つまるところ Leaky Abstraction とは

作業計画

Leaky Abstraction 例 1

オーバーヘッドが小さい (人間が気にかけるレベル)

Leaky Abstraction 例 2

オーバーヘッドが中程度 (人間はときどき忘れることがある)

Leaky Abstraction 例 3

オーバーヘッドが大きい (ほとんどの場合、人間は詳細を把握しようとしない)