From: Makoto Kuwata Date: 2010-11-06T16:16:47+09:00 Subject: [ruby-list:47611] Re: Rubyでも「private」イコール「非公開」? 桑田です。 2010/11/6 ytakagi : > はじめまして、かな。 > 興味深い内容なので、思わず出てきました。 > > 実質的に private が存在しないということだと、 > 言語としてカプセル化が保証できない、という事になるかと > 思うのですが、それは美しくないのではありませんか? > 「カプセル化が保証できない」という言葉から察するに、 インスタンス変数をprivateにすることと、メソッドをprivateにすることを 混同されておられませんか? Rubyでは、インスタンス変数は勝手にprivateになる (publicにできない) ので、 どちらかというとカプセル化を保証してくれる言語です。 「privateが存在しない」というのはPythonのほうでしょう。 > > pythonを以前いじったことがありますが、 > なかなかスマートなやり方をしていたと思いました。 > > private を指定すると、 > > property名の後ろにこっそり アンダースコア2つだかなにかが付け加えられ、 > 外部からアクセスできなくなるというやり方だったかと思います。 Pythonを知らない人には誤解を招きそうですね。 補足すると、Pythonの場合は次のようになっています。 ・メソッド名やプロパティ名の先頭が「_」だと、非公開であると見なされる。  これは言語仕様ではなく、単なる紳士協定。 ・メソッド名やプロパティ名の先頭を「_」2つにすると、クラス名が自動的に  付加される (これは言語仕様)。  これによって、名前が意図せず重複するのを避けている(外部からアクセス  できなくするものではない)。 > > このやり方だと、いざという時に緊急避難的にアクセスすることも出きるし、 これはその通りですが、 > 普通にはjava のprivate と同じ扱いでもあります。 これはさすがに違います。Pythonのは単に名前がかぶらないようにしている だけで(*1)、「Javaのprivateと同じ」というのは語弊があるかと思います。 例えるなら、「Javaの匿名クラスはクロージャだ」と主張するようなもの。 (*1) それが悪いというわけではなく、仕組みが簡単なわりに一定の効果を   あげている、いいアイデアだと思います。 > そんな感じだと分かりやすいのではないでしょうか? Rubyでも、「非公開なものは先頭に "_" をつける習慣にしましょう」という 主旨でしたら、賛同します。 定数の場合はそうもいかないので、"_" で終わるようにするとか。 #「_FooBar」でも定数と見なすように言語仕様を変更するとかは難しいかな。 Pythonと同じように、名前が「_」2つで始まる場合はクラス名をつけるという のは、コンテキストが入り乱れるRubyでは難しいかもしれません。 -- regards, makoto kuwata