Python
JavaScript
オブジェクト指向
Python3
アクセス修飾子

PythonやJavaScriptにアクセス修飾子がない理由を考えてみた


はじめに


  • 先日、ソースコードレビューを受けた際に「pythonにはアクセス修飾子の概念はないよ」と言われました。

  • 「JavaとかRubyにはあったよなー」とか思いつつ、「Pythonにはどうしてないんだろう」と感じたため記事を書いてみました。

  • Pythonの他にJavaScriptにもないので、そのあたりを解明していきたいと思います!


想定読者


  • アクセス修飾子が何かわからない。

  • アクセス修飾子って聞いたことがあるけど、なんだっけ。

  • アクセス修飾子って聞くだけでワクワクする。

という方は、対象としていますのでベテランの方はスルーしちゃってください!!!

(「ここ違うよ」とかレビューやコメントはお待ちしております。)


そもそも、アクセス修飾子ってなに?


  • クラスやメンバからの参照可能な範囲の定義。

  • 「お前は使ってもいいよ」「お前は使ってはダメだよ」っていうものを定義します。

  • ちょっと、よくわからないので実際の例を見ていきます。


代表的なアクセス修飾子のまとめ


  • アクセス修飾子には代表的なものが3種類あります。


  • publicprotectedprivateです。

種類
利用目的

public
制限無く公開したい

protected
基本的に外部からは隠蔽するが、サブクラスやパッケージ内からのみ利用させたい

private
基本的に外部からは隠蔽し、クラス内からのみ利用させたい


アクセス修飾子を図示


  • 言葉だけだと、わかりづらかったので図式化。

  • 建物で考えてみると、publicが公園。protectedが会社。privateが自宅ってところでしょうか。

  • 公園は、誰でも入れる。会社は、社員じゃないと入れない。自宅は、自分だけ。

image.png


言語間の差異


  • 主要な言語ごとにアクセス修飾子の有無を調べてみました。

  • アクセス修飾子がない言語は、基本的にルールベースでアクセス修飾子を表現しています。

言語
アクセス修飾子の有無
備考

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("プライベート")
}


アクセス修飾子がない理由(仮説)


  • アクセス修飾子を持っていない理由を調べてみましたが、回答を見つけることができませんでした。
    (どなたかわかればリンクやコメントください。)

  • なので、私の仮説を書いてみたいと思います。


仮説①:歴史が浅い言語には存在しない(関係なし)


仮説②:シンプル化するため


  • wikipediaを見ると、PythonGolangシンプルとか軽量といった言葉が使われています。


  • 誤解を恐れずに書くとしたら、 アクセス修飾子がなくてもアプリや動作するものが作れる ということだと思います。



仮説③:大規模アプリ開発を前提としていないため


  • PythonもGolangも大規模アプリ開発には、他の言語と比べて向いていない気がしています。


  • 大規模開発つまり、複数人大人数で開発することがないためルールベース(_やケース)でも問題ないということなのかなと思います。


仮説④:JavaScriptにアクセス修飾子がない理由は、TypeScriptがあるため


  • JavaScriptが生まれた当初は、必要なかったんだと思いますが、大規模開発にも使われるようになってきて必須になりました。

  • ただ、Typescriptという代替手段があるため、JavaScriptには実装されてないのではないでしょうか。


【結論】アクセス修飾子はどんな言語であっても利用すべき


  • 基本的にアクセス修飾子は使うべきで、PythonやGolangに存在しないのは、言語自体をシンプル化する目的でしかなく、使わなくていい理由にはならない。

  • プログラミング初心者や一人開発だとつい、疎かになってしまいがちですがこの機会に覚えて中級エンジニアの仲間入りをしちゃいましょう。