[#47605] Rubyでも「private」イコール「非公開」? — Makoto Kuwata <kwa@...>

桑田といいます。

12 messages 2010/11/04
[#47606] Re: Rubyでも「private」イコール「非公開」? — Yusuke ENDOH <mame@...> 2010/11/04

private constant 提案者の遠藤です。

[ruby-list:47611] Re: Rubyでも「private」イコール「非公開」?

From: Makoto Kuwata <kwa@...>
Date: 2010-11-06 07:16:47 UTC
List: ruby-list #47611
桑田です。

2010/11/6 ytakagi <ytakagi@m5.dion.ne.jp>:

> はじめまして、かな。
> 興味深い内容なので、思わず出てきました。
>
> 実質的に 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

In This Thread