質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

5回答

2226閲覧

オブジェクト指向の考え方はこれでいいですか?

退会済みユーザー

退会済みユーザー

総合スコア0

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

3クリップ

投稿2015/07/29 14:13

編集2015/07/30 05:25

php

1 class User{ 2 public $name; 3 public function __construct($name){ 4 $this->name = $name; 5 } 6 public function say(){ 7 echo "My name is ".$this->name; 8 } 9 }

php

1 function User($__construct){ 2 $this_var = $__construct; 3 echo "My name is $this_var"; 4 } 5 User("perapail"); // これを何個も作れる!

奥が深いのはわかりますが、簡単に概要を掴むには上のような考え方でいいのですか?

===========================================================
みなさんありがとうございます!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

私は、オブジェクト指向の基本は、そのオブジェクト(クラス)にどのような責務を割り当てるかということだと考えています。

というと、難しいので砕いて書くと、「オブジェクトを人(や物)だとして、その人にはどういう役割があるのか」を考えることです。
そして、作ったクラスを、new でインスタンス化することで、その人や物が実際に具現化する
とイメージしてみてください。
(ボンッと煙が上がって人が現れるようなイメージで)

Userというクラスがあった場合、

PHP

1 class User{ 2 public $name; 3 public function __construct($name){ 4 $this->name = $name; 5 } 6 public function say(){ 7 echo "My name is ".$this->name; 8 } 9 }

は、Userは名前だけ持っていて、その名前は生まれた時に決まっていて
お名前は?と聞かれれば「My name is xxxx」と答える
という役割を持っている人です。

その人を

PHP

1$instance = new User('perapail');

と書くことで、「perapail」という名前を持った人として具現化し

PHP

1$instance->say();

と書くことで、「名前は何ですか?」と聞いて「My name is perapail」と答えてもらう。

というイメージです。

なので、書かれたロジックでは、Userクラスの考え方としては間違っていないですが
それを具現化(インスタンス化)する部分が無いので、// これを何個も作れる!
の部分は誤りという感じですね。

投稿2015/07/30 01:43

MakotoMiyazaki

総合スコア297

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ご質問(のサンプルコード)の意図に不明な部分があるので、
以下は推測を含んだ回答になります。(上と下が意味的につながると考える)

// これを何個も作れる!

ひとつの関数を何回も呼び出しているのであって、
インスタンスを何個も作っているわけではありません。

もし、クラスからインスタンスを生成する意図なら、下のようにします。

php

1$instance = new User('perapail'); 2$instance->say();

ご質問のふたつあるサンプルコードのうち下の部分を、
この上で書いたコードに置きかえます。

インスタンスの生成には「new」キーワードでクラス名を指定し、
生成したインスタンスを変数に代入(参照)します。

コンストラクタで初期化するためのデータは引数で渡します。
オブジェクト指向言語ではよくある一般的なやり方です。

投稿2015/07/29 23:35

LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

デザインパターンを知ると、少しオブジェクト指向がわかりやすくなるかもしれないですかね。

LIGでphpを使ってわかりやすく解説してる記事がありましたのでご参考ください
http://liginc.co.jp/web/programming/php/136131

投稿2015/07/29 20:52

kzyplus

総合スコア62

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

オブジェクト指向の3(大)原則の1つに「カプセル化」というものがあり、
Userクラスのpublic $name;はカプセル化(データ隠蔽)にそぐわないのですが、何か理由があるのでしょうか?

それと、質問文の下のコードだと出力する関数を一回呼んで終了ですが、上のコードはインスタンス生成を行うので、インスタンスが破棄されない限り、基本的にはnameフィールドが半永久的に保持されます。
出力結果だけ見れば同じ結果になるかもしれませんが、プログラムの意味合いは全く異なります。

投稿2015/07/29 15:14

shiolier

総合スコア1156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/07/29 15:23 編集

回答ありがとうございます まだ学習途中です・・・
guest

0

こんばんわ。

奥が深いのはわかりますが、簡単に概要を掴むには上のような考え方でいいのですか?

再利用できるという意味では、正しいともいえるし、再利用の点でしか見てないと考えると正しくないとも言えます。

ここらへんの認識は個人差があるように思うのですが、オブジェクト指向でプログラムを書くと、だいぶ綺麗にかけて、見通しが良くなるというのが私個人としては、最大の利点だと思っています。(いや、そうではない、なんて反論もある方もおられるでしょうけども。)

オブジェクト指向で書くとなんで、見通しがいいのか?等は手続き型の書き方とオブジェクト指向で書く書き方を、詳細設計を意識しながら書き比べてみるとわかりやすいかと思います。お題としては、学校のテストの集計とかその手の、データを扱うものをお題として書き比べてみることをお勧めします。

投稿2015/07/29 15:14

tenraku

総合スコア148

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/07/29 15:23

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問