[ruby-list:50629] Re: Ruby の用語:クラス,モジュール,インスタンス
From:
"5.5" <5.5@...>
Date:
2017-12-28 09:27:28 UTC
List:
ruby-list #50629
まつもと様 5.5 です。ご回答ありがとうございます。 「スーパークラス」「サブクラス」をどっちの意味で使うかを公式に 決めていたくだことは期待してはいけないとのこと,わかりました。 今回の(そしてあとに続く)質問は,るりま(Ruby リファレンスマ ニュアル)の編集に関して必要になったからでした。 私はるりまの中の人ではなく,かつ今のところ大して貢献できていま せんが,用語の整合性など調べています。 JIS のような標準でなくても,このような文書では用語の意味を明確 にする必要があります。 結局,「この文書では〇〇という意味とする」ってやればいいわけで すね。 今回の件で「リスコフ置換原則」について初めて知り,勉強になりま した。 Ruby では,継承はあくまでも楽をするための手段であって,そのため であれば原則を外したってかまやしない,っていう文化なのですね。 Ruby らしいと思います。 実際,Module と Class の関係は素人目にもうまくできているような 気がします。 クラスはモジュールより出でてモジュールに非ず,と。 このあと,いくつか他の用語についてまたご質問したいと思いますが, どうぞよろしくお願いします。 On 2017/12/27 17:27, Yukihiro Matsumoto wrote: > まつもと ゆきひろです > > Rubyの用語の明確な定義などありません。というか、真に明確な定 > 義など存在しないんじゃないかな。 > > 慣習として、Rubyの文脈では「スーパークラス」が好まれ、「親ク > ラス」、「上位クラス」、「基底クラス」などの用語はあまり使わ > れません。「子クラス」、「下位クラス」、「導出クラス」も同様 > で、もっぱら「サブクラス」を用います。 > > で、Rubyに限らずこれらの「スーパークラス」、「サブクラス」関 > 係においては、直接のスーパークラスであるのか、それとも多段の > 継承関係を経由した間接的なスーパークラスであるかは文脈に依存 > して曖昧に扱われています。JIS X 3017のような厳密性を要求され > る文書では「直接の」という言葉をつけて明示しています。 > > さらに言うと、Rubyでは継承関係はあまり重要視されません。理由 > としては、継承関係よりもダックタイピングによる「振る舞い」が > 重視されることがありますが、さらに言うと undef などを用いて > リスコフ置換原則に沿わないクラス定義ができることも関係してい > ると思います。 > > まつもと ゆきひろ /:|) > > > > In message "Re: [ruby-list:50627] Re: Ruby の用語:クラス,モジュール,インスタンス" > on Wed, 27 Dec 2017 01:06:37 +0900, "5.5" <5.5@moji.gr.jp> writes: >> >> 前田様 >> >> 5.5 です。さっそくありがとうございます。 >> >> おおむね理解できました。 >> >> が,やはり,挙げた多くの用語が Ruby の公式の用語として明確に >> 定義されているわけではないのですね。 >> ユーザーとしてはエイヤっと決めちゃっていただきたいのですが, >> そういうことを期待してはいけないでしょうか。 >> >> スーパークラス,サブクラス,インスタンスの三つについては, >> おおざっぱに >> >> (A) 非 JIS 流 >> >> 直接なもののみに使う。 >> 根拠とすべきドキュメントは無い。 >> 現場ではメジャー。 >> superclass とか instance_of? などのメソッド名と整合。 >> >> (B) JIS 流(JIS X 3017) >> >> 間接的なものにも使う。 >> JIS, ISO/IEC で標準化。 >> >> という理解でいいのだと思いますが,併立してるのも厄介ですね。 >> >> >> On 2017/12/26 13:24, Shugo Maeda wrote: >>> 前田です。 >>> >>> 2017年12月26日 9:00 5.5 <5.5@moji.gr.jp>: >>>> Ruby の基本的な用語で,自分の中でちょっと曖昧なものがあるので, >>>> 確実なところを把握したいと考えています。 >>>> あるいは,用語によっては意味が確定していない(合意がない)もの >>>> もあるかもしれませんが。 >>>> >>>> >>>> まずはクラスやインスタンスについてお尋ねします。 >>>> オブジェクト指向言語一般の話ではなく,Ruby 用語についての質問 >>>> です。 >>>> >>>> >>>> [1] クラスとモジュールの関係 >>>> >>>> Class は Module の下位クラスです。 >>>> よって,「クラスはモジュールでもある」と言えそうですが,これは >>>> 正しいでしょうか。 >>>> >>>> Class は Module のすべてを受け継いでいるわけではなく,一部のメ >>>> ソッドを未定義にしているところがビミョーな気がします。 >>> >>> 例えば、クラスはモジュールと違ってincludeできないといった制約もあるので、 >>> 「クラスはモジュールでもある」と考えるのは一般的ではないと思います。 >>> >>>> [2] クラスの上下関係 >>>> >>>> 次の用語はそれぞれまったく同じ意味であると解してよいでしょうか。 >>>> >>>> ・上位クラス,スーパークラス,親クラス >>>> ・下位クラス,サブクラス,子クラス >>> >>> Rubyでは「上位クラス」や「親クラス」とはあまり言わないように思いますが、 >>> そういった表現が使われている場合はスーパークラスのことだと考えてよいように >>> 思います。 >>> >>>> (以下,これが正しいと仮定して進めます) >>>> >>>> class A; end >>>> class B < A; end >>>> class C < B; end >>>> >>>> とあったとき,C は B の下位クラスだが,A の下位クラスであると >>>> は呼ばない,ということでよろしいでしょうか。 >>>> >>>> そうだとすると,「下位クラスまたはその下位クラスまたはその…」 >>>> に当たる用語が欲しいと思います。 >>>> >>>> 「子孫クラス」「先祖クラス」という用語があればよさそうですが, >>>> あまり用例を見ない気がします。 >>> >>> Module#ancestorsは「先祖」ですので、上記のように呼んでもよいように思います。 >>> JIS X 3017では上記の祖先クラスのことを「スーパークラス」と呼んで、代りに >>> 「直接のスーパークラス」という用語を導入していますが。 >>> >>>> [3] クラスとインスタンスの関係 >>>> >>>> クラスが [2] のように定義されているとき,B.new は B のインス >>>> タンスであるが,A のインスタンスとは呼ばない,ということでよ >>>> ろしいでしょうか。 >>>> >>>> だとすると,B や C のインスタンスを A から見た呼び方が欲しい >>>> ですが,そういう用語はありませんでしょうか。 >>> >>> JIS X 3017では、B.newの評価結果を「Bの直接のインスタンス」や「Aのインスタンス」 >>> と呼んでいます。 >>> >>>> また,B.new のクラスは B ただ一つであり,A は該当しない,と >>>> いうことでよろしいでしょうか。 >>> >>> そういう解釈が一般的だと思います。 >>> >>>> [4] 〇〇オブジェクトという呼び方 >>>> >>>> Array のインスタンスを「Array オブジェクト」と呼びますね。 >>>> Array の下位クラスのインスタンスをも「Array オブジェクト」と >>>> 呼ぶことは妥当でしょうか。 >>>> >>>> また,Enumerable をインクルードしたクラス(やその下位クラス >>>> 等々)のインスタンスを「Enumerable オブジェクト」と呼びたい >>>> のですが,妥当でしょうか。 >>>> >>>> これを一般化して,オブジェクト o のクラスの ancestors たち >>>> (つまり o.class.ancestors の要素)すべてについて,o のこと >>>> を「〇〇オブジェクト」と呼べれば,と思うのですが。 >>>> >>>> それがダメなら,それを簡潔に表す方法はありませんか。 >>> >>> 「直接のインスタンス」という用語を導入すれば、「〇〇インスタンス」でよい >>> と思いますが、Rubyの場合はModuleとClassのようにリスコフの置換原則に従わ >>> ない例があるので、そういった場合は「Moduleインスタンス」と呼ぶことにあま >>> り意味はないかもしれません。 > -- 5.5@moji.gr.jp