Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

  • 先日、ソースコードレビューを受けた際に「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に存在しないのは、言語自体をシンプル化する目的でしかなく、使わなくていい理由にはならない。
  • プログラミング初心者や一人開発だとつい、疎かになってしまいがちですがこの機会に覚えて中級エンジニアの仲間入りをしちゃいましょう。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした