Re: interface と型チェックの有無

基本的にみずしまさんのコメントにつきるんだけど、なんとために「視点による」と書いたのか分かってもらえてないようで。普通、比較するときは複数の面について比較するでしょ。ある面について違うから比較できないなんて話にはならないよ。

interface と型チェックの有無 - odz buffer

「比較」という言葉の意味が違うということでしょう。


自分がもともと

前に書いた通りですね。型チェックのあるなしで「違う」と見なすのであれば、静的な言語と動的な言語ではそもそも機能の比較ができないでしょう(どうせ全て「違う」と見なされるのだから)。

クラス、インターフェース、型チェックの有無 - usagidropの日記

で書いたときは、「本質的に同じかどうか」という意味で使ってます。「JavaのinterfaceとObjective-Cのprotocolは本質的に同じ機能だが、Rubyのmoduleは本質的に違う」と言及するようなことを「比較する」といってます。そのため、『複数の面について比較』ということはそもそもありえない。


もともとの話の流れは、次の通り。

  • Java以前にはinterfaceというものは存在しなかった』発言
  • Objective-CのprotocolはJavaのinterfaceと同じ機能(というかGoslingがObjective-Cを真似ただけ)
  • → 『機能は同じでも、目的が違えば違う機能』発言
  • → 目的が違っても、機能が同じなら同じ機能に決まってるじゃん。何が違うの?
  • プロトコルとインターフェースの比較
  • → それはinterfaceとprotocolの違いじゃなくて、JavaObjective-Cの違いでは?interfaceとprotocolは本質的に同じものなのに、型チェックの有無などが理由で「違う」とされれば、そもそも静的言語と動的言語では機能の比較をしようがない。


この話の流れで、「比較」という言葉を使ってます。言葉の使い方が間違っているといわれれば、そうかもしれない。誤解させて申し訳ない。


書き直すと、こんな感じでしょうか。

前に書いた通りですね。型チェックのあるなしで「違う」と見なすのであれば、静的な言語と動的な言語ではそもそも機能の比較「機能が本質的に同じかどうか」という議論ができないでしょう(どうせ全て「違う」と見なされるのだから)。


それから、型チェックが本質的な機能かどうかという点ですが、

そういうわけで、Java の interface が静的型付けのための仕組みととらえると、静的な型チェックの有無は本質的な部分でしょ、というのが私の主張。

interface と型チェックの有無 - odz buffer

自分としては、型チェックの機能はJavaの機能であって、interfaceの機能ではないと考えています。これは

で書いた通り。「型チェックがあること」と「intefaceという機能があること」は別々の話だと思います。言語仕様として両者が結びついているのは構いませんが、両者を分けて考えることはできるので、型チェックのあるなしがinterfaceの本質的な部分とは思いません。


あと、みずしまさんのコメントですが、

interfaceを静的型として使えなければ、Javaのような言語ではあまり意味が無いどころか、非常に困ったことになりますね(型の継承が単一継承に制限されるので)。

Javaで困ったことになるのは確かですが、意味がないとは思いません。interfaceやprotocolは、クラス継承とは別にオブジェクトの性質や関連性を表現するための手段として、大変有効です。自分には、interfaceの最大の利点は型チェックであると静的言語派の人は考えているように見えますが、モデリングに興味のある人間からみると、複数のオブジェクトに共通する性質をクラス階層とは関係なく表現できることこそがinterfaceやprotocolの最大の利点です。これには型チェックの有無は関係ありません。


例えばComparableというintefaceは「オブジェクト同士が比較可能である」という性質を表しています。これに型チェックの有無は関係ないですよね?PHPでも5.0からinterfaceが導入されましたが、型チェックのないPHPでもComparable interfaceは十分意味を持ちます。決して意味がないなんてことはありません(静的に型チェックができたほうが嬉しいという主張ならわかります)。


・・・


とここまで書いて気づいたんですが、自分は「仕様と実装とを分離する」という感覚ではinterfaceを使ってないなあ。オブジェクトが「どんな性質や機能を持っているか」を表すのがinterfaceで、「その性質や機能とは具体的にどんなものか」を記述するのがclassという感覚。結局は「仕様と実装を分離する」のと同じなんだけど、自分の頭の中ではObjective-Cの「@interfaceと@implementation」をJavaの「interfaceとclass」にマッピングしているような気がする。Objective-Cの@interfaceとJavaのinterfaceは機能が違うんだけど、自分は同じ目的で使っているみたいだ。


その意味では、「Objective-Cの@interface+@protocol」=「Javaのinterface」なのかもしれない。面白そうなネタなので、あとで考える。