プロパティのアクセス修飾子をprivateにしてもゲッターやセッターで値を変更できるのなら意味なくないですか?
なんのためにprivateにするのですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答5件
0
プロパティのアクセス修飾子をprivateにしてもゲッターやセッターで値を変更できるのなら意味なくないですか?
はい、publicなゲッターやセッターを付けるのであれば、変数自体がprivateである意味はあまりなくなります。
ということで、クラス設計を行う場合には、ゲッター・セッターを用意するかから考えないといけません。
なお、これはPHPの場合で、他言語では事情が異なることがあります。たとえば、Rubyではプロパティはすべてprivate相当で、アクセサメソッドを立てないと外から使えません。また、JavaではJavaBeanといって、getHoge/setHogeというアクセサメソッドを使うよう標準化されている場面がありますので、合わせないといけない場面もあります。
投稿2019/06/23 12:30
編集2019/06/23 12:38総合スコア147054
退会済みユーザー
2019/06/23 12:36
退会済みユーザー
2019/06/23 12:54
0
おす、おらgoku!
おめーが疑問を抱く気持ちはおら、すげーよく分かっぞ。
だから最短距離で回答を書くな。
メンバメソッドをpublicにすっか隠蔽すっかって問題はな、
技術的な話のように見えて、実は政治的な問題なんだ。
例えば、おめーがソフトウェア開発を受託して作るとすっだろ。
だけど、客がおめーの努力を全く理解せずに勝手な事ばっか言い出したとすっだろ?
そしたら、おめーはそんな奴の面倒みたくねぇよな?
もう、開発やめるよな?
そういう時に役立つのがprivateやprotectedだ。
最初の契約で、な、ソースコードは公開しません、
ただし、publicメソッドの仕様書は作成して公開します。
私の仕事に不満があるのであれば、その仕様通りの物を作ってくれる別の業者を探してください。
って言うんだ。
結局な、技術者の立場っていうのは、すっげぇ弱い。
世の中の問題を抽象化して誰でも出来るようにするのが技術者だろ?
だけど本気でそれをやったら、技術者ってのは要らなくなってお払い箱になるんだ。
ひでぇ話だろ? でも、それがこの世の中だ。
そんな話、沢山見てきたからな。
だから隠蔽すんだ。
本当に大切な事は、隠蔽する。
自分の仕事にいちゃもん付ける奴が出てきたら、
そいつと距離を置くしか無い。
そん時にな、自分が一生懸命修行してその成果で創り上げたものを
別の誰かに安い金で奪い取られないように、
予め対策をしておくのがprivateやprotectedだ。
仕事だから、全部非公開では出来ない。
「仕様」は技術者の物ではなく、発注者の物だからな。
だが、技術は技術者の物だ。それだけは守る。
だから、publicメソッドは仕様書として明確に公開するが
その裏側の処理については技術者個人の能力の問題なので、
何があろうと他人には渡しませんよ、
という強い意志表示がprivateなんだ。
分かっかなぁ?
大体世の中の奴らはへったくればっかりだから、
こういうところでプログラムを書いてる奴はほとんど居なくて
あんまり理解してもらえねぇとは、おら、分かってっぞ。
あと、もしかしたら分かってねぇ奴が居るかもしれねぇと思うので補足しておくと、
そうした上でコンパイル言語の場合はコンパイルするし、
スクリプト言語の場合は暗号化して納品するんだからな。
投稿2019/06/23 11:47
編集2019/06/23 11:54退会済みユーザー
総合スコア0
2019/06/23 12:58
退会済みユーザー
2019/06/23 13:08
退会済みユーザー
2019/06/29 16:18
2019/06/29 22:14
退会済みユーザー
2019/06/30 00:53 編集
退会済みユーザー
2019/06/30 02:22
2019/06/30 04:34
退会済みユーザー
2019/06/30 05:02
2019/06/30 05:07
退会済みユーザー
2019/06/30 05:16
2019/06/30 05:18
退会済みユーザー
2019/06/30 05:34
退会済みユーザー
2019/06/30 08:28
2019/06/30 08:29
退会済みユーザー
2019/06/30 08:31
退会済みユーザー
2019/06/30 08:31
2019/06/30 08:33
退会済みユーザー
2019/06/30 08:35
2019/06/30 08:39
退会済みユーザー
2019/06/30 08:39
退会済みユーザー
2019/06/30 08:40
2019/06/30 08:41
退会済みユーザー
2019/06/30 08:42
2019/06/30 08:56
退会済みユーザー
2019/06/30 09:00
退会済みユーザー
2019/06/30 09:06
0
オブジェクト構造の抽象化(隠蔽化)のためです。
オブジェクトの操作は、メソッドを通じて行うので、オブジェクトのプロパティがどういう構造になっているかということは、そのクラスのオブジェクトを利用する側のプログラムには開示しません。
新たなメソッドが必要となったときに、プロパティの型などを変更する必要があるかも知れません。このときに、プロパティを直接アクセスしていると、そういうプログラム全部の修正が必要となります。
メソッド経由でアクセスしている場合は、そのメソッドの仕様を変えない限り、アクセスする側のプログラムは修正不要です。
オブジェクト志向的に考えると、そもそもプロパティをパブリックに出来るという機能は、簡単なプログラムのための簡易手段と言うことになります。
プロパティ主体で設計してセッターゲッターを機械的につくるのでなく、メソッドの仕様を設計して、そのメソッドが書けるようにプロパティを設計します。
例えば、あまり良い例ではないのですが、文字列をプロパティに持つとして、その長さを返すメソッドがあった場合に、
・文字列長を別途プロパティに持って、文字列をセットするときに文字列長も更新する
・文字列だけを持って、長さを返すときはそのときに関数で求める
という2つの方法が考えられますが、速度しか違わないので、機能的にはどちらでも良いわけです。
設定回数<<参照回数 なら前者の方法を取るのが良いし、設定回数>>参照回数なら後者の方法が良いです。
最初の設計後に、回数の関係が逆転したならそこだけ書き換えることも考えられます。
あまり良い例ではないというのは、そもそも「長さを返すメソッド」が本当に必要かちゃんと考えたのかというところですね。
投稿2019/06/23 12:18
総合スコア86590
退会済みユーザー
2019/06/23 12:22
退会済みユーザー
2019/06/23 12:26
退会済みユーザー
2019/06/23 13:22
退会済みユーザー
2019/06/30 02:25
0
過去にも同じような質問をされた方がいらっしゃるのですが、個人的にはこちらの回答者さんの回答がとてもわかりやすかったです!
こちらの回答にも書かれている通り、事前に入る値にバリデーションをかけられたり、ゲッターで使用する際のデバッグなどに使えるのが便利だと思います。
ですので、ただ値を入れるか取るかのために使うのでは、おっしゃる通りあまり意味をなさないかもしれません。
参考にしていただけると幸いです!
投稿2019/06/23 11:11
編集2019/06/23 11:13総合スコア679
0
privateにすることでフィールドやメンバの存在を隠す事が出来ます。
カプセル化と言いますが、勝手に変えられては困る変数や中間処理にあたる関数などの存在を外部から隠す事が出来ます。
これにより外部からアクセスする時、本来なら2つ呼ばないといけない関数があったとして「1つの関数を呼ぶだけで処理できるように見えるようにする」ことが出来る等、保守性が向上するメリットがあります。
詳しくは下記をご参考下さい。
http://www.objective-php.net/basic/capsule
投稿2019/06/23 11:16
総合スコア702
退会済みユーザー
2019/06/23 12:50
退会済みユーザー
2019/06/23 13:10
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。