オフィスアワーがそろそろ始まるよ!()

Zen のインタフェースの特徴

Zen のインタフェースとポリモーフィズムの特徴について説明します。

ポリモーフィズムの実現方法としては、インタフェース継承による実現方法が広く知られています。Java の interface や C++ の抽象クラスです。このインタフェース継承は、オブジェクト指向的な階層によるインタフェースを提供します。

Zen ではオブジェクト指向的なアプローチとは異なるアプローチを採用しています。

以降では、オブジェクト指向的なインタフェースの例として C++ の抽象クラスと比較しながら、Zen のアプローチを説明します。

オブジェクト指向的なインタフェース

C++ の抽象クラスのようなオブジェクト指向的なインタフェースには次のような特徴があります。

  • 継承するインタフェースを明示する
  • インタフェース経由で呼び出される実装は実行時に決まるため柔軟性がある

オブジェクト指向的なインタフェースでは、実行時の柔軟性を得るために次のような欠点を持つことになります。

  • 仮想関数テーブル経由で間接的に関数を呼び出すため実行時のコストが高くなる
  • 仮想関数テーブルを保持するためにバイナリサイズが増加する
  • 関数の呼び出しが実行時に解決されるためコンパイル時の最適化がかかりにくい

Zen のインタフェース

Zen のインタフェースには次のような特徴があります。

  • 実装するインタフェースを明示しない
  • インタフェースを明示しないため構造体に後からインタフェースを付け足すことが可能
  • インタフェース経由のメソッド呼び出しに余分なコストがかからない
  • 仮想関数テーブルによるバイナリサイズの増加がない
  • メソッド呼び出しがコンパイル時に解決されるため最適化がかかりやすい

オブジェクト指向的なインタフェースと比較した場合、Zen のインタフェースはコンパイル時に解決されるため、実行時の柔軟性に欠ける部分があります。 この問題は、*vtableとの使い分けにより克服しています。

また、構造体定義にインタフェースを明示しないことから、どのインタフェースを実装しているか、構造体定義だけから読み解くことができません。 そのため、インタフェース定義を変更する場合、その影響範囲がわかりにくくなります。 幸いなことに、組込み関数 @is() を使ったテストを簡単に書くことができます。 テストを活用し、実装しているインタフェースを明示すると良いでしょう。

このように、Zen のインタフェースによるポリモーフィズムでは、実行時のコストを最小にしながら、新しいインタフェースへの対応を容易とするアプローチを採用しています。

Chapter 1

Chapter 2

Chapter 3

Chapter 4

Chapter 5

Chapter 6

Chapter 7

Chapter 8

Chapter 9

Chapter 10

Chapter 11

Chapter 12

Chapter 13

Chapter 14

Chapter 15

Appendix

Error Explanation

☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2020 connectFree Corporation. All rights reserved. | 特定商取引法に基づく表示
Zen, the Zen three-circles logo and The Zen Programming Language are trademarks of connectFree corporation in Japan and other countries.