オブジェクト指向とはようするに具体的にいうと何でしょうか?
ボックスにいれて…。
とかの表現がいまいちピンときません。
これは私の考えですが、
メソッド(一連の動作)をあるていど製作し、使いまわせるようにする方法じゃないかと思っています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答11件
0
ベストアンサー
関連のあるデータと関数をひとまとまりにして整理する方法のことです。
オブジェクト指向でなくても1個のソースファイルが大きくなり過ぎたら複数のファイルに分割しますよね。そのとき、無意味に分割するのでなく、関連のある関数同士はまとめて1つのファイルにしておくでしょう。
このように、
・関連のあるもの同士はまとめておく
・関連のないもの同士は分離しておく
のがソースコードを把握しやすくするコツです(どんな言語であれ)。
で、関連があるかをどのように判定するかですが、オブジェクト指向ではまずデータに注目します。関連のある変数はまとめておきます。
例えば給与計算ソフトであれば、firstName, lastName, birthDate...などという変数は1人の社員に属するものなので1つのクラスにまとめます(これはCやCOBOLにも構造体、レコード型があるようにオブジェクト指向以前からある発想です)。さらにその変数にアクセスする・操作する関数も関連があるということでクラスにまとめておきます。
基本的にクラスは他のクラスの中の変数を直接いじれません。クラスを分けるということは、「このデータはうちの領分。よそのデータの操作はよそにお任せする」という区切りを入れることだからです。区切りをはっきりさせることで「まとめ、分離」が実現されます。区切られていることで、「この変数を書き換える関数はこのクラスの中にあるのだな」と探す範囲を限定できます。このメリットは他人が書いたソースコードを読むときに大きく感じられます。
実際に何をクラスに分けるかは経験・センスが要求されるところで、人によって意見が分かれる場合もあります。
「オブジェクト指向とは何か?」というような本を読むと、現実世界のモデルがどうとか、抽象的なことが書いてあって悩むかもしれませんが、クラスや継承を使いこなせない段階でそういう説明を読んでもまず理解できません。まずは「整理の技術」と理解しておくのがおすすめです。
投稿2015/08/27 03:56
編集2015/08/27 03:59総合スコア196
0
色々なところで色々な説明を見ますが、理解してから読むと「その通りだなー」って思うんですが、
それまでは逆に「うん・・?」となることが多い印象のオブジェクト指向。
なんかいい例えないかなーと思って考えたことを書いてみたいと思います。
(分かりやすいかは人それぞれな例えなので、あくまで一例としてw)
いきなりですが、ファンタジー的な発想をします。
なぜかというと、オブジェクト指向はよく「現実のものをプログラムに落としこんでー」とか書かれてますが
普通はものは勝手に動きませんし、そう都合よくありません。
なのでファンタジー的な要素のほうがむしろ分かりやすいかな、と思ったからです。
クラス
ひな形、とか設計図、とか説明されます。
今回はこう想像してみてください。
「あなたは魔法使いで、妖精を呼び出すことができます。その妖精がどう動くか、なにをしてくれる妖精なのかはあなた自身が決めることができます」
この妖精が「どう動くか、なにをしてくれるか」を決めるのがクラスの振る舞い、設計図です。
そして「こういう妖精がほしい!」と思ったとします。(例えば、命令したらテレビの電源を入れてくれる、とかなんでもいいです)
インスタンス化
ただ、こういう妖精がほしいと「思った」だけでは妖精はまだいないのでなにもしてくれません。
次に行うのはその妖精を実際に「呼び出す」ことです。
この呼び出すという動作が「インスタンス化する」ということです。
思い描いた妖精を呼び出し、テレビを付けて、と命令する。この命令がメソッドの実行ですね。
さて、実際に妖精が呼び出せるとして、その妖精の見た目はなんでしょう? どういうのを想像しましたか?
小さい? 大きい? 人の形をしてる? 羽根は生えたりする? 性格はどんな感じ?
当然、こうした妖精の見た目や性格なども決められるので色々設定したくなるでしょう。
この見た目や性格を決めるのがクラスのメンバ変数(フィールドだったりプロパティだったりインスタンス変数だったり、呼ばれ方は色々)です。
例えば妖精の身長は30cm、みたいなのがまさにそれっぽいですね。(なのであとから40cm、とか設定を変えればそのサイズの妖精が呼び出される)
そして一度どういう妖精かを決めてしまえば、呼び出す度に毎回決める必要はありません。
例えば10匹呼び出せば10匹が同じ振る舞いをする妖精が呼び出されます。
と、だいぶ斜め上な方向に話をしましたが、オブジェクト指向というのはこうした「便利なものを自分なりに設計して創りだして使う」というのがイメージです。
そしてもっと言うと(今回の例えを使うなら)、役割が違う妖精を作り出し、それぞれの妖精同士で連携を取りながら大きな仕事をさせる、というのがオブジェクト指向的プログラミング、ということになります。
さて、これらを踏まえて、あえて擬似コード風にするなら以下の感じです。
class Fairy { int height = 30; turnOnTV() { // テレビを付ける } } var fairy = new Fairy(); fairy.turnOnTV();
大事なところはほとんど説明していないですが、あくまでどんなものかをイメージしてもらえたら幸いです。
投稿2015/08/27 02:05
総合スコア2283
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
オブジェクト指向とは!!
大きな問題ですが、小さい問題でもあります。
ぶっちゃけた話、理解の仕方は無限大ですので、質問者さんが納得いけばそれでよいのです。
ですので、あんまり説明されないような方法でお話してみます。
オブジェクト指向という言葉には実は2つの大きな要素があります。
1.データを効率よく分類すること
2.動作をまとめて効率よくすること
【データを効率よく分類すること】
データを分類するというのは、例えば、
人間=>霊長類=>動物=>生き物
のように、カテゴリー分類することです。
継承とはこの逆順のこと、つまり、でかいカテゴリーからどんどん細分化していく事が継承です。
よく例として紹介されるのが、
文字列=>キャラクター=>オブジェクト
のような関係性ですね。汎用性の高い物から順に細分化していく事がわかります。
【動作をまとめて効率よくすること】
昔中学校ぐらいの数学でやったと思いますが、
x^2+2x+1 = (x+1)^2
ってのありましたよね。
プログラムも似たような物で、ゴチャッとしていても、実はこことここが共通しているから、こう抜き出すともっとシンプルになるよね、というのがあります。
メソッドの使いまわし、と言われている部分はここになりますね!
コードを沢山書いていると、そのうち自分なりの答えが出てくると思います。
楽しんで、いろんなコードを書いてください!
投稿2015/08/27 08:00
総合スコア289
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
オブジェクト指向とはパソコンとマウスのようなものです。店に行けばたくさんの会社から様々なマウスがでています。しかし、ほとんどのマウスも差し替えて使うことが出来ます。これは全てのマウスがかきの二つを最低限保証しているからです。
・「パソコンに接続できる」
・「クリックできる」
・「クリックされたことをパソコンに送る」
さて、オブジェクト指向のキーワードについて補足させていただきます。
・クラス:パソコンやマウス
・インスタンス:SurfacePro、店に売り出されているマウス等
・継承:「上記のマウスの最小限機能」と「各会社のマウス」または、「シリーズの後継機」と「その前」の関係
・多相性:「どんな会社でも繋ぐことができる」や「繋ぐ方法は様々、USB,BT,WiFi」
・隠蔽:マウス内の処理は外部から操作できない、使う側はクリックするしかない。また、データのやり取りや内容は外部からは見えない。
ここでも同様の質問があります。
投稿2015/08/27 01:56
総合スコア18155
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
すでにBAが出ていますが。
オブジェクト指向とは、
『世の中は全て、オブジェクトと、オブジェクトの関わり合いでできている』
と言う考え方の事です。
世界の捉え方の話です。
プログラムは関係ありません。
オブジェクト指向を理解しないまま、
オブジェクト指向プログラムを理解しようとしても無理だし、
オブジェクト指向はただの世界の捉え方の話ですから、
メリットとかの話が出てくる事がそもそもおかしい。
正しい知識をつけていただきたいなと思います。
投稿2015/09/04 14:06
総合スコア60
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/07 07:46
0
実践的に自分が最初思うことは、関数群と違いクラスにすると、返す値が多数になったときに便利、ということ。
関数は、出てくる部分が原理的に一つしかない。で、複数の結果を得るのがやりにくい。
クラスなら、プロパティを必要なだけくっつけておいて、使いたい時に値をとったり、代入したりできる。
関数だけですべての処理をしていると、返す値が多数になるとすぐに対応できなくなるからなのか、関数の返値にはエラーコードを持たせる、という習慣が普通になっている。
そうやって関数をif文で囲って並べまくってエラー処理とかどうなの?って疑問。
関数が関数で無くなってるよ、って思いませんか?と誰かが言ったらしい。
こういうのを止めようよということだから、エラー処理はtry, throw 構文で行くよってことが一緒に説明されるわけで。どのみち関数が関数として死んでるなら、クラスというボックスの中で死んでくれってこと、かもしれない。
あと、演算子に作用させることができるというメリットがある。これ、何かと忘れ去られる気がする。
オブジェクトに演算子を作用させると、それはメソッドになるんですよ。
文字列の連結を「+」で、みたいな単純なことでも、オブジェクト指向じゃないと無理ってこと。実際、文字列連結を、全部concat()関数でって嫌じゃないですか?
関数オンリーだと、対象をどうこうするというイメージですべてが動くが、オブジェクト指向だと、自分でどうこうしてというような指示の出し方になる。それがキャラ化している感覚になって可愛い。
結局これ。
投稿2015/09/02 16:23
総合スコア30
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
前に読んだSwiftの入門書に、オブジェクト指向を「たい焼き」に喩える説明があって、すげーわかりやすかったです。
下記に似たようなたい焼きの説明がありました。
“たい焼き”であま~く理解するJava文法と言語仕様
プログラムの書き方のスタイルって
要は、こうやったら効率上がるんじゃね?とか
バグ少なくなるよ!的なものだと思うので
質問者さんのおっしゃるような、メソッド使いまわすとかで概ね合ってると思います。
投稿2015/08/27 03:08
総合スコア37
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「オブジェクトがメッセージを互いに送り合って処理を実現する」ことらしいです。
HelloWorldを書いてみます。
普通に書いてみます。
static void Main(){ Console.WriteLine("HelloWorld"); }
オブジェクト指向っぽく書いてみます。
static void Main(){ Screen screen = new Screen(); Greeter greeter = new Greeter(screen); greeter.SayHello(); } class Greeter{ private Screen screen; Greeter(Screen screen){ this.screen = screen; } void SayHello(){ string message = "HelloWorld"; screen.Print(message); } } class Screen{ void Print(string message){ Console.WriteLine(message); } }
投稿2015/08/27 02:47
総合スコア13521
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
はじめて見る競技(スポーツ)は、ルールがわからず、見どころがわからずに楽しめないということがあります。詳しい人に説明を受けてもやはりピンと来ない。しかし、下手なりにやってみると楽しみがわかったりします。また、やってみても好みに合わないこともあります。
オブジェクト指向も同じで、やり方がわかり、利点を説明されてもいまいちピンと来ないのはよくある話だと思います。makoto-nさんが今まで書いていたやり方がオブジェクト指向で書くとこんなに簡潔に書け、気持ちがよかったとなることが、一番だとおもいます。また、やってみたけどやはり手続き型や関数型の方がいいやと思えばそれはそれで良いと思います。
「やってみなはれ」(鳥井信治郎)
投稿2015/08/27 02:34
総合スコア2883
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「ボックスにいれて…。 」のボックスが何を指しているのか不明ですが。。。
要は、モノに状態(変数)とふるまい(メソッド)を持たせたものがオブジェクトです。
上記の設計がクラスとよばれ、それらを製造(インスタンス化)してプログラムで使用します。
例えば
・Aってクラスがあったとして、それをインスタンス化したa,bを生成
A a = new A();
A b = new A();
・Aクラスにはxと言う変数があって、それを格納するためのメソッドsetXがある
a.setX(1);
b.setX(2);
・Aクラスには標準出力に、変数xを書き出すメソッドprintがある
a.print();
b.print();
上記の例で言うと、a,bの扱い方はAクラスで定義されているので同じですが、
それぞれ別のオブジェクトとして扱われるので、それぞれの変数xは汚染されません。
つまり、結果:12 と出力される
クラスを継承したり、振る舞いだけを定義するクラスがあったりと、学び始めるとたくさん出てくると思いますが、
要は、上記であげたようなクラスの寄せ集めで書くプログラムをオブジェクト指向といいます。
投稿2015/08/27 01:42
総合スコア61
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
紙という概念があります。
色、厚さ、大きさ、柔らかさ
折ることができる、文字を書くことができる、
色々な属性があると思います。
私が、makoto-nさんの目の前に、「紙」を差し出した時、それはオブジェクトとして扱われます。
もしかしたらその紙は「折り紙」かもしれませんし、「コピー用紙」かもしれません。
コピー用紙を10枚渡したら、一枚一枚は別のコピー用紙(別のオブジェクト)です。
一枚目のコピー用紙は「あいうえお」と文字を書く
二枚目のコピー用紙は折って小さくする
と、それぞれのオブジェクトに対して動作することができるのです。
これがオブジェクト指向の基本になります。
投稿2015/08/27 01:33
総合スコア856
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/27 01:43
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。