はじめに
- 先日、ソースコードレビューを受けた際に「pythonにはアクセス修飾子の概念はないよ」と言われました。
- 「JavaとかRubyにはあったよなー」とか思いつつ、**「Pythonにはどうしてないんだろう」**と感じたため記事を書いてみました。
- Pythonの他にJavaScriptにもないので、そのあたりを解明していきたいと思います!
想定読者
- アクセス修飾子が何かわからない。
- アクセス修飾子って聞いたことがあるけど、なんだっけ。
- アクセス修飾子って聞くだけでワクワクする。
という方は、対象としていますのでベテランの方はスルーしちゃってください!!!
(「ここ違うよ」とかレビューやコメントはお待ちしております。)
そもそも、アクセス修飾子ってなに?
- クラスやメンバからの参照可能な範囲の定義。
- 「お前は使ってもいいよ」「お前は使ってはダメだよ」っていうものを定義します。
- ちょっと、よくわからないので実際の例を見ていきます。
代表的なアクセス修飾子のまとめ
- アクセス修飾子には代表的なものが3種類あります。
-
public
とprotected
とprivate
です。
種類 | 利用目的 |
---|---|
public | 制限無く公開したい |
protected | 基本的に外部からは隠蔽するが、サブクラスやパッケージ内からのみ利用させたい |
private | 基本的に外部からは隠蔽し、クラス内からのみ利用させたい |
アクセス修飾子を図示
- 言葉だけだと、わかりづらかったので図式化。
- 建物で考えてみると、publicが公園。protectedが会社。privateが自宅ってところでしょうか。
- 公園は、誰でも入れる。会社は、社員じゃないと入れない。自宅は、自分だけ。
言語間の差異
- 主要な言語ごとにアクセス修飾子の有無を調べてみました。
- アクセス修飾子がない言語は、基本的にルールベースでアクセス修飾子を表現しています。
言語 | アクセス修飾子の有無 | 備考 |
---|---|---|
Python | なし | クラスに_などつけて見分ける |
JavaScript | なし | クラス_などつけて見分ける |
TypeScript | あり | public, protected, private |
Java | あり | public, protected, private |
PHP | あり | public, protected, private |
Ruby | あり | public, protected, private |
Golang | なし | lowerCamelCaseとUpperCamelCaseで見分ける |
各言語のprivateの定義方法
Python
sample.py
_private_method():
print('プライベート')
JavaScript
sample.js
_privateMethod: function() {
console.log('プライベート');
}
TypeScript
sample.ts
private privateMethod(): void {
console.log('プライベート');
}
Java
sample.java
private void privateMethod() {
System.out.println( "プライベート" );
}
PHP
sample.php
private function privateMethod(){
echo "プライベート";
}
Ruby
sample.rb
private
def private_method()
print("プライベート")
end
Golang
sample.go
func privateMethod()
fmt.Printf("プライベート")
}
アクセス修飾子がない理由(仮説)
- アクセス修飾子を持っていない理由を調べてみましたが、回答を見つけることができませんでした。
(どなたかわかればリンクやコメントください。) - なので、私の仮説を書いてみたいと思います。
仮説①:歴史が浅い言語には存在しない(関係なし)
- 最初、歴史的経緯でアクセス修飾子が不要になったのかなと思いましたが、全く関係なさそうです。
- 意外と若い、プログラム言語の誕生日と年齢。を見た所、pythonやJavaScriptもそこまで誕生が古くないです。
仮説②:シンプル化するため
-
誤解を恐れずに書くとしたら、 アクセス修飾子がなくてもアプリや動作するものが作れる ということだと思います。
仮説③:大規模アプリ開発を前提としていないため
- PythonもGolangも大規模アプリ開発には、他の言語と比べて向いていない気がしています。
- 大規模開発つまり、複数人、大人数で開発することがないためルールベース(_やケース)でも問題ないということなのかなと思います。
仮説④:JavaScriptにアクセス修飾子がない理由は、TypeScriptがあるため
- JavaScriptが生まれた当初は、必要なかったんだと思いますが、大規模開発にも使われるようになってきて必須になりました。
- ただ、Typescriptという代替手段があるため、JavaScriptには実装されてないのではないでしょうか。
【結論】アクセス修飾子はどんな言語であっても利用すべき
- 基本的にアクセス修飾子は使うべきで、PythonやGolangに存在しないのは、言語自体をシンプル化する目的でしかなく、使わなくていい理由にはならない。
- プログラミング初心者や一人開発だとつい、疎かになってしまいがちですがこの機会に覚えて中級エンジニアの仲間入りをしちゃいましょう。