オブジェクト指向をサイト等を参考に自分なりに解釈した結果、
車だったら、車内部のプログラムや構造は知らないけど運転はできる、
鈴木さん(人)だったら、年齢や所在地は知らないけど話すことはできる
となったのですが、このような考え方でいいのでしょうか?
(これも具体的ではないのでいまいちわかってはいないのですが…)
出来ればプログラミングを全く知らない人でもわかるような具体的な回答お願いします
追記
グローバル変数というのもわからないのでよろしければ一緒に教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答9件
0
こんにちは。
たぶん、オブジェクト思考ではなく、オブジェクト指向のこうとをお尋ねになっていると思います。
車だったら、車内部のプログラムや構造は知らないけど運転はできる、
鈴木さん(人)だったら、年齢や所在地は知らないけど話すことはできる
これもオブジェクト指向プログラミングで得れる特長(情報の隠蔽)ですが、オブジェクト指向はもう1つ大きな特長があります。抽象化/具体化の仕組みです。
例えば、「生命→動物→脊椎動物→哺乳類→犬→ポチ」みたいにだんだん具体化していく流れがあると思います。(逆に辿ればだんだん抽象化しています。)
そして、犬が「おすわり()」って関数を持っているなら、ポチだけでなく近所の犬のジョンも「おすわり()」できます。今、目の前にたくさんの犬がいた時、全部「おすわり()」できます。しかし、猫のタマに「おすわり()」と命令するとエラーが返ってきます。(言語によってエラーが返ってくるタイミングは異なります。コンバイル時だったり実行時だったり。)
例えば、脊椎動物が「bool 卵から生まれる()」関数を持っている場合、哺乳類では「bool 卵から生まれる()」関数を{return false;}と実装するでしょう。そして、そこで実装しておけば、一々犬や猫では「bool 卵から生まれる()」関数を実装する必要がありません。
これが、継承やポリモーフィズムの機能です。
大きな違いだけ把握しておけば、細かい違いを一々気にしないで一緒くたに取り扱えるって本当に便利です。
グローバル変数は、全ての関数からアクセスできる変数です。プログラムの開始~終了まで有効です。
対して、言語によって異なりますが、概ねローカル変数はそれを定義している{}ブロック内だけで有効な変数です。またメンバ変数はそれを定義しているクラスのインスタンスの一部です。
投稿2015/11/25 05:20
編集2015/11/25 05:35総合スコア23272
0
結局のところ、オブジェクト志向とは、「主語」があるプログラミングをしましょうという事だと思います。
オブジェクト志向以前の言語は「Aする。」とか、「BにCする。」といった感じで「主語」のない命令しか出来ませんでした。
これに対して、オブジェクト志向言語は「AがBする。」とか「AがCをBする。」といった、「主語」のある命令ができます。
我々、日本人は「主語」のない文を使い慣れているためこの差は大したことがないように感じますが、欧米人は違います。英語などの欧米の諸言語は「主語」のない文がほとんど出てこないからです。そのため、彼らの場合、「主語」のない命令よりある命令の方が自然に感じます。
この「主語」のある命令がしたいという考えからできたのがオブジェクト志向言語です。
これらのことから、オブジェクト志向とは、「主語」のあるプログラミングをしましょうという事であると言えます。
投稿2016/09/26 00:54
総合スコア18
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
>>プログラミングを全く知らない人でもわかるような具体的な回答お願いします
電池の具体的な構造とか素材とか知ってますか?私はそれらは知りませんが、目覚まし時計が遅れてきたら電池を交換すれば、改善することを知っています。電池は電力を提供し、それらは使用するとともに衰えていくという概念を知っているからです。
「電池」というという物体が「電力を提供するもの」という概念はまさにオブジェクト指向です。
「いろいろ書いてあるプログラム」を物体としたとき、それは「何かしらを提供するもの」という概念で扱うことができます。まったく「いろいろ書いてあるプログラム」の内容を読まずとも問題はなく、それが何を提供する「もの」なのかを考えればいいわけです。
電池の入れ替えと同様に「問題を扱いやすい抽象的なレベル」で考えられるのがオブジェクト指向のメリットです。
さて、プログラミングのオブジェクトやオブジェクト指向のあり方は実は言語により異なっています。ただ、今書いたような「プログラムを概念ごとにまとめて扱う」というところは共通していると思います。
投稿2016/05/19 15:11
編集2016/05/19 15:18総合スコア1895
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
なんか古いのがあがってますね。:-)
出来ればプログラミングを全く知らない人でもわかるような具体的な回答お願いします
プログラミングはコンピューターの黎明期から綿々と研究されてきて
その時々においていろんなアイデアが供されてきました。
で、進化の延長上に現れたのが「オブジェクト指向」です。
これを理解するためには、過去の歴史を紐解くのが分かりやすいのですが…
ということで、上記のリクエストは(ぶっちゃけ)難しいです。
体裁上の特徴を紹介することはできますが、オブジェクト指向の
何がうれしいか? という肝心なところを理解するためには
こちら側へ来てもらうしかないかなあ、と。:-P
投稿2016/05/19 14:04
総合スコア7458
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんばんは。
オブジェクト指向についてということでしたので、少々雑多にはなりますが、説明させていただきます。
まず、オブジェクト指向というのは、現実世界で起こるようなことを抽象的なモデルに落とし込み、プログラム上で実現するための技法です。
これだけでは少々分かりにくいので、具体的な例をあげながら説明しますね。
例えば、「動物」という概念がありますよね。これは非常に抽象度の高いものです。
そして、動物という集合の中には、「犬」だったり「猫」だったりがいるわけです。
しかし、「犬」と「猫」では、鳴き方ですとか、走るスピードですとか、その他にも色々違いますよね。
そういったことをオブジェクト指向では、うまくモデル化していくわけです。
モデル化の仕方を見ていきますね。
まず、動物ができることとして
「動物」→ 「走る」 「鳴く」
があるとしましょう。
これらのことは当然「犬」も「猫」もできます。しかし、それぞれの行動の結果は異なりますので、以下のようになるでしょう。
「犬」→ 「70km/h」 「わんわん」
「猫」→ 「110km/h」 「にゃー」
このように同じ行動でも、振る舞い方が違うわけです。つまり、
「動物」が「走る」と「??」
に対して、動物のところを「犬」や「猫」にしたときに
「犬」が「走る」と「70km/h」
「猫」が「走る」と「110km/h」
となる。
そして、プログラムとして実現するときには、最初の
「動物」が「走る」と「??」
というのを呼び出すときに、「動物」の部分を「犬」や「猫」に入れ替えるだけで、実行の振る舞いを変えることができるわけですね。
これがオブジェクト指向の基本的な考え方です(多層性)。
さて、次はグローバル変数についてですね。
グローバル変数というのは、どこからでも参照できる変数だと思ってください。
int a = 1; void func() { int b = 1; } a++; // グローバル変数は参照できる b++; // エラー
こんなコードだったときに、一番外に書いてあるのがグローバル変数ですね。これはどこからでも参照できます。
しかし、bは関数の中に定義されているので、外からは見れません(ローカル変数)。
これがグローバル変数の説明になります。この辺りは、スコープの話ですので検索してみると色々出てくるかと思います。
以上です。参考になれば幸いです。
投稿2016/05/19 13:48
総合スコア10
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
車だったら、車内部のプログラムや構造は知らないけど運転はできる、
この理解はあってます。
例えば、Javaで文字列を扱うとしてStrngを使いますが、
Stringの中身がどう動いているかは知らなくても、
https://docs.oracle.com/javase/jp/6/api/java/lang/String.html
のようなリファレンスを見れば、Stringを使いこなすことは可能です。
鈴木さん(人)だったら、年齢や所在地は知らないけど話すことはできる
逆にこれは仕様であって、オブジェクト指向であるかないかの論点からは外れていると思います。
「グローバル変数」という用語は、オブジェクト指向から少しずれていると思うので、
考えなくていいです。「変数のスコープ」を勉強してみてください。
投稿2016/05/18 22:36
総合スコア1124
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
一応、質問のものも当たっていると思います。
私が読んだサイト (どこだったか忘れた... 確か、オブジェクト指向の説明を批判して、オブジェクト指向とは何か。というのをC++で説明していたサイトだったはず。) では、
大雑把に言えば、
従来 ( オブジェクト指向以前 ): 処理できればいい
オブジェクト指向以降: 処理とデータを一まとめにし、タスク分散をはかる
みたいです。
たとえば、
Cでint data を処理する場合、
関数 abc は たまたま int data を処理することになっただけ。
という感じですが、
C++等のオブジェクト指向だと、
class ClassA というクラス の担当を int data関連として処理させる。
そして、役割分担。
また、
クラス:レシピ
オブジェクト: レシピをもとに作った実際のもの
みたいなもの。
投稿2016/05/18 06:12
総合スコア4958
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
とてつもなくざっくりした回答をしてみます.
オブジェクト指向とは,
全ての機能をひとまとめにした物です.(すごくざっくり)
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
例えば,ミュージックプレイヤーの処理の流れを見てみましょう.
オブジェクト指向の対の手続き型処理(関数型処理とも)だと,
/* 音楽を再生 */ function play(ファイル名){ 処理内容 } /* 音楽を停止 */ function stop(){ 処理内容 } /* 音楽を一時停止 */ function suspend(){ 処理内容 } /* 再生時間の移動 */ function seek(再生する時間){ 処理内容 } ………
のように定義し,それぞれをplay()
やstop()
,seek(15)
のように指定します.
では,オブジェクト指向ではどうなるか?
class 音楽の操作{ //クラス名(オブジェクト指向!!) //音楽を再生 void play(ファイル名){ 処理内容 } //音楽を停止 void stop(){ 処理内容 } //音楽の再生場所の移動 void seek(時間){ 処理内容 } }
などのように書きます.
このクラス(class)がオブジェクトと呼ばれるものを作成する大元で,処理をまとめられます.
例えば,
music = new 音楽の操作
といった形でオブジェクトをmusicという変数に指定してやると,
music.play("ongaku.mp3")
や music.stop()
, music.seek(12)
のように管理できます.
オブジェクト指向の何が便利か?
それは,オブジェクトを作れば作った分だけすっきり管理できます.
例えば,
music1.play("file1.mp3") music2.play("file2.mp3") music3.play("file3.mp3") music1.seek(12) music3.stop()
などのように簡単に管理できます.
手続き型言語ではこうはいきません.
面倒です.
次にグローバル変数とは,
どこからでも呼び出すことのできる変数です.
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
普通,変数は定義したカッコの中でしか使えません.
function func(){ 変数A = 3 //変数Aに3を代入します } print 変数A //「変数Aは存在しません」というエラーが出ます
ですが,グローバル変数だと
変数G =10 //グローバル変数 function func(){ 変数A = 10 //変数Aに10を代入します 変数G = 3 //変数Gに3を代入します(エラーは出ません) } print 変数A //「変数Aは存在しません」というエラーが出ます print 変数G //「3」と表示されます
という風に,どこからでも参照できるのです.
投稿2015/11/25 06:26
編集2015/11/25 06:27総合スコア2004
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。