約 5,857,319 件
https://w.atwiki.jp/mopsprogramming/pages/171.html
ヘンなタイトルですが(^^;;)。 オブジェクト指向の話は、「プログラムの全体構成を考える」という視点からしたつもりでした。大抵のオブジェクト指向解説は、そういうことを強調しますし、実際、オブジェクト指向という発想自体からして、そういう大きな話から出てきたもののようです。でも、そんな「全体構成」とかいうような大仰な話は、相当上級者になって、長ーいプログラムを書くようになってから問題になるんで、1000行程度のプログラム(慣れる程、一括把握できるコードの長さには耐性がつく)なら、どうやったっていいといえないこともないわけです。いや、まあ、汚いコードを書く癖がつくとまずいのかな。ま、でも、小さいレベルで整理されたコードを書く、ってのは、オブジェクト指向云々よりも、そのプログラミング言語の文法上の特性の方が強烈に影響を及ぼすもんなんですね。Smalltalkなんかみたいに、文法的特性そのものがオブジェクト指向ってなら、短いプログラムに関してもオブジェクト指向の話をせざるをえませんが、C言語系とかだと変数やパラメターの使い分けとか、Mopsだとスタックの使い方、LISPとかなら関数の作り方とか、そういうところのうまさが、小さいレベルでは効いてくるように思われます。 で、なにがいいたいのかというと、その大上段からの抽象的オブジェクト指向論がどーでもよく思われるような小さなプログラムでも、クラスとオブジェクトは使うことはあるだろうと。たとえ、ハイブリッド言語であっても。じゃあ、そういうとき、クラスとかオブジェクトを、どう考えて、どう扱えば、納得がいくかと、そういう話を書いてみようと思うわけです。まあ、自分個人の実感でしかないんですが。 マネージャー で、自分の中では、「マネージャー」というのが、一番しっくりくる感じがしています。つまり、「オブジェクトとはマネージャーである」と。カタカナ英語なのが、アレなんですが。 普通、マネージャーといわれて最初に連想するのは、私なんかの世代(中年)の日本人男性だと、学校の運動部で、雑用とか、記録付けとかしてくれる女の子、なわけです(ひとによるか)。ま、男子の場合も多いんですが、女子のマネージャーって、なんか憧れてたな。縁はありませんでしたが。あ、いや、どうでもいいことですね。これに対して、ここでいうマネージャーは、もっと英語のmanagerに近い意味です。会社とかでマネージャーというと、支配人とか支店長クラスの、かなり役が上の管理職です。「管理職」てのが、そもそもマネージメントの訳じゃないですかね。マネージメント、というと、管理、統治、支配、差配とかで、要は、マネージャーというのは、人とかモノとかを監視して、予定通り動くように上から操作する人、ですね。 もうひとつ、古くからのMacintoshユーザ(プログラマ)なら、マネージャーといって欠かすことができないのは、ツールボックスのAPI群ですね。だいたい、機能のまとまり毎に、ファイルマネージャーとか、ウィンドウマネージャーとか、名前がついていますね。この区分けは「モジュール」ということでしょうね。OSが提供してくれる入力/出力とか、いろいろな機能を、意味のまとまり毎に分類したものが、ナントカマネージャーということです。オブジェクトをマネージャーとみる発想からすると、このツールボックスのいうマネージャーは、マネージメントツールの集合体、という感じで、それ自体がマネージャー(つまり、動作主体っぽい感じ)という感じはありません。操作とか動作とか、要は、実行コードの意味内容で分ける、というのが、伝統的なモジュールの考え方だろうと思われます。Pascal系の、ModulaとかOberonとか、そんな感じですね(よく知らないので、いい加減)。オブジェクト指向ってのは、結局、機能の中心にデータを持ち込んだことで、そのデータに名前をつけて人格化し、そいつが何かをしてくれてる、っていう比喩的な見方が可能になったわけですね。ま、以前からのプログラマの方には、いわずもがなのことでしたか。 OSの方も、メニューとかウィンドウとかボタンとかは、OS側のオブジェクトとして提供します。昔は、これらは、データの構造体(レコード)として中身の定義も公開されていたので、アプリケーションの側で同じ型のデータ構造を作って、適当にデータを詰めた上で、これをシステムオブジェクトと見なしてくださいな、とお願いすることができました(らしい)。全部そうだったわけではないかもしれませんが、ウィンドウは少なくともそうだったようです。個人的には、そういうのの方が透明でいいなと思うんですけど、そうなると、システムのバージョンアップの都合で、データ構造を変更しようとしたとき、そういう自前でシステムオブジェクトを作っている全アプリケーションを書き直さないといけないことになるわけです。それで、今は、中身の構造を隠しておいて、その上に作用する関数を通してのみデータを操作するようになっています。これはオブジェクト指向の情報隠蔽の効用のひとつですね。まとまり(モジュール)毎の内部的変更がしやすくなる、というわけです。 そんなわけで、Mopsオブジェクトは、それ自体、Mopsの中でのオブジェクトであるのですが、システムオブジェクトをも伴う場合は、そのポインタをシステムから受け取って当のMopsオブジェクトの中に保管するようになっています。"NEW "というメソッドは、大抵、そのシステムオブジェクトを獲得するためのメソッドになっています。 こういう風に考えるとき、ウィンドウとかメニューとかファイルとか、そういう対象といわゆるオブジェクトを同一視してしまいがち、ってか、自分は初めそうだったんですが、それは、あまり正確じゃありません。というのは、例えば、ウィンドウオブジェクトは確かに一回に一個のウィンドウしか扱いませんが、いったん壊して(閉じて)もう一回作ると、じつは、同じように見えても、全く異なるウィンドウを今度は扱っているのです。そういう点からいうと、ウィンドウオブジェクトは、一回に1個のウィンドウしか扱えないけれども、ウィンドウそのものというよりも、それを通じてウィンドウを操作するための窓口、あるいは、その操作のエージェント(代理人)のようなものと考える方がいいわけです。 そうすると、オブジェクトにメッセージを送るのは、ウィンドウとかファイルに直接メッセージを送って何かやってもらうってことを意味しているんじゃなくて、そのウィンドウとかファイルのエージェントにメッセージを送って、こういう風にしてくださいな、とお願いする。そうすると、そのエージェントが、ウィンドウとかファイルとかをよしなに生成・加工・廃棄等をしてくれると、そういうことになります。そういう風に、ひとつ媒介があって、その媒介がオブジェクトと呼ばれていると考えると、けっこう全体がすんなり理解できると、私は感じています。すると、オブジェクトは、対外的には、自分の支配下にある対象(システムオブジェクトやデータそのもの、つまり、オブジェクトの内部データ)を代表する地位にあり、対内的にはメッセージに応えて、その支配下の対象を適切に保守・維持・管理・変更すべく気を配っているのであって、マネージャーという感じがうまく当てはまるように思われるのです。 前へ 次へ 目次へ トップページへ
https://w.atwiki.jp/cschola/pages/27.html
クラスの実体 実体の生成 クラスは型であり、それだけでは実体はありません。 実体を宣言するには以下のように記述します。 クラス名* 変数名; この実体の事をオブジェクト、またはインスタンスと呼びます。 1つのクラスに対し複数のオブジェクトを作ることが出来ます。 Character* hero;// Characterクラスの実体「hero」を定義 Character* slime;// Characterクラスの実体「slime」を定義 ポインタを使う理由 (難しいので今は読み飛ばし読み飛ばして、後で戻って見直すことをお勧めします。) 上記の方法だと、オブジェクトはスコープ { } 内でしか生存できません。 スコープが終了するとint型など普通の変数同様そこで破棄されます。 しかしそれでは都合が悪い場合が多く存在します。 そこでオブジェクトのポインタとnewを使いスコープが終了しても生存し続けるオブジェクトを作ることが出来ます。 オブジェクトの生成 ポインタの確保と定義を別々にする場合。 Character* hero; hero = new Character("勇者", 10, 2); 一行で生成する場合 Character* hero = new Character("勇者", 10, 2); オブジェクトの破棄 newしたオブジェクトは明示的に削除しない限りメモリに残り続けます。 必要のなくなったオブジェクトは必ずdeleteでを破棄しましょう。 delete hero; オブジェクトの変数へのアクセス ポインタを使って定義されたオブジェクトは - (アロー演算子)を使ってアクセスします。 hero- Damage(5);// 勇者に5ダメージ cout "HP " hero- HP endl;// 勇者のHPを表示 ファイル分けでのクラス作成 では実際にプログラムを書いてみましょう。 基本はクラスごとにファイルを分け、ヘッダーで定義、ソースで実装を記述します。 ファイル名はクラス名と同じにするのが好ましいです。 /*--------------Character.hの中身----------------*/ #pragma once #include iostream #include string // キャラクタークラス class Character{ public // アクセス修飾子 //【メンバ変数】 std string name;// 名前 int HP;// 体力 int STR;// 攻撃力 //【メンバ関数】 Character(std string name, int HP, int STR);// コンストラクタ ~Character();// デストラクタ void Damage(int damage); // ダメージ関数 }; /*--------------Character.cppの中身----------------*/ #include "Character.h" using namespace std; // コンストラクタ Character Character(string name, int HP, int STR){ this- name = name; this- HP = HP; this- STR = STR; } // デストラクタ Character ~Character(){ // 何もしない } // ダメージ関数 void Character Damage(int damage){ this- HP -= damage; cout name "は" damage "のダメージをうけた" endl; } /*--------------main.cppの中身----------------*/ #include "Character.h" int main(){ using namespace std; // Characterクラスの実体「yuusya」を作成 Character* hero = new Character("勇者", 10, 2); hero- Damage(5);// 勇者に5ダメージ cout "HP " hero- HP endl;// 勇者のHPを表示 delete hero;//「hero」を削除 return 0; } 問題 第1問 上記のCharacterクラスに、防御力を表すint型変数 DEF を追加せよ。 第2問 上記のCharacterクラスのコンストラクタを name, HP, STR, DEF を初期化するように書き換えよ。 第3問 上記のCharacterクラスに、メンバ変数の値を全て表示する関数 Draw_Status() を追加せよ。 また、main.cpp でCharacterクラスの実体を1つ作り、Draw_Status() を呼び 内容を表示せよ ※実行例 名前:勇者 HP:10 STR:2 DEF:255 第4問 mainでCharacterクラスの実体を3つ作り、それぞれ Draw_Status() を呼び、内容を表示せよ testcounter 合計 - 今日 - 昨日 -
https://w.atwiki.jp/sevenlives/pages/471.html
GoF? オブジェクト指向 疎結合 開閉原則?
https://w.atwiki.jp/macca/pages/13.html
分析 設計
https://w.atwiki.jp/nicepaper/pages/225.html
これまでのオブジェクト指向入門1~5では「インスタンス化し、アロー演算子(- )を使ってメソッド呼び出したり」「インスタンス化するタイミングでコンストラクタを使いメソッドを呼び出したり」していました。 今回はインスタンス化しなくても呼び出す方法についてまとめていきたいと思います。9月20日記事 目次 これまでの方法はインスタンスメソッドと呼ばれる 静的メソッド コード どっち使えばいいの? まとめ これまでの方法はインスタンスメソッドと呼ばれる インスタンス化をしてから、プロパティやメソッドを呼び出していくという方法でした。 静的メソッド インスタンス化しなくてもクラスそのものに属し、インスタンスメソッドとかかわりがないような独立して存在しているような状態は静的メソッドを使います。 コード Class ?php class Static_Method{ public static function addition($num1,$num2){ return $num1 + $num2; } } 呼び出す方 ?php require_once ( ../class/Static_Method.php ); $num1 = 4; $num2 = 5; print $num1."+".$num2."は".Static_Method addition($num1,$num2)."です。"; Static_Methodがクラス名、additionがメソッド名です。classの方では、public static functionとなっているのに対して、呼び出す方ではインスタンス化せずにクラス名とメソッド名を ではさんで記述して引数に変数を渡しています。 どっち使えばいいの? 時々現場でも議論になることがあります。インスタンスを意識した場合にはインスタンスメソッドで、そうでない場合には静的メソッドです。どちらでも可能な場合がありますが、概念的にどちらを使うべきかを意識するためには、やはりインスタンス化された時にアロー演算子を使って値の処理を色々したい場合、インスタンスメソッドで 別にアロー演算子を使わなくてもよく、値の処理が絡まない場合は静的メソッドを利用します。うまく説明できているとは限りませんので、 「インスタンスメソッド 静的メソッド 使い分け」などで検索してみてください。この部分の理解はクロスチェックが必要です。 まとめ オブジェクト指向最初の方は静的メソッドでもインスタンスメソッドでいい場合が多いですが、インスタンスするまでもなさそうな場合は静的メソッドを使うようにするといいと思います。 次はPHPでオブジェクト指向入門7~静的プロパティ~です。 以上
https://w.atwiki.jp/kameda/pages/1.html
https://w.atwiki.jp/xwingmini2/pages/26.html
オブジェクト Object 船、障害物、デバイスはすべてオブジェクトである。プレイエリア内のオブジェクトの正確な位置は管理され、ゲーム効果によって制限される。 船はオブジェクトをロックすることができる。 船はオブジェクトの上を通過することができる。
https://w.atwiki.jp/hogazurou/pages/66.html
GoF
https://w.atwiki.jp/hear_br0wn/pages/61.html
オブジェクト指向プログラミング(Object Orinted Programming=略してOCP) Java、C#、Perl、Ruby、PHPなどにも取り入れられている 「クラス」「インスタンス」「プロパティ」「メソッド」などで成り立っている。 ●自動車を例に考えてみる 【自動車「プリウス」】 ・車種 :普通車 ・ドア数 :4ドア ・形 :セダン ・燃費 :45km/L ※グレードによるオプション ・タイヤ :普通、スタッドレスなど ・排気量 :680cc、1200ccなど ・色 :青、白、黒など ・内装 :革素材、布素材など 一概に「プリウス」といっても、店で売られているものは「プリウス-タイプS]「プリウス-タイプR]など 内装やエアロパーツ、出せるスピード、色などさまざまな種類のものがある。 ●クラスとインスタンスに当てはめて考えてみる 工場で完成したもの = クラス お店で販売されているもの = インスタンス と仮定してプリウスを作るとき、 同じ設計図(ひな形)を元に、すべての「プリウス」に共通するもの(工場で完成したもの)を作成し、 オプションだけをそれぞれ別々につけたもの(お店で販売されているもの)を作ってグレード別でお店で販売。 つまり、 大元の共通部分を作成し、そこから細かい部分を加えたり、減らしたりして別なものをつくる考え方。 ●MovieClipに当てはめて考える。 ※シーンとライブラリをうまく使い分ける 【クラス】 ・ライブラリに前車共通部分を含めた「プリウス」を作成 【インスタンス】 ・ライブラリからシーンに「プリウス」をもってたもの ⇒「プリウス-タイプS」「プリウス-タイプR」などそれぞれの名前をつけられる(それぞれのインスタンス名) 【インスタンスのカスタマイズ(プロパティ)】 ・シーンに持ってきた「プリウス」にオプションパーツをつけられる ⇒インスタンスにそれぞれのオプションを指定できる 【メソッド】 ・前に動かす、バックする、曲がるなどの命令 ※プロパティとメソッドは一緒に扱われることがおおいので、 運転手が車に乗っているのを前提とした時の、車の「概観」と「運転」、と考えるとわかりやすいかも。 ●クラスとインスタンス var インスタンス変数名 = new クラス名(); ※配列・オブジェクト変数もこの一種 var 配列名 = new Array() var オブジェクト変数名 = new Object() ●プロパティ(属性) ※インスタンスがもともともっている性質で、そのインスタンスがムービークリップか、ボタンか、グラフィックかでその性質が変わる。 ⇒位置情報、大きさ 【プロパティの参照】 インスタンス名.プロパティ名 インスタンス名.プロパティ名 = プロパティの値 ●メソッド(関数・命令) ※「メソッド」は関数(一連の処理がまとめられた部品のようなもの)で、ターゲットによって使えるもの、使えないものがある。 【メソッドの参照】 インスタンス名. メソッド名(引数1,引数2,・・・); ○プロパティとメソッドは携帯にたとえるとわかりやすいかも。 電話する、メールするなどの機能がメソッド。 機種・色・画面の大きさなどがプロパティ 例:ライブラリ内のムービークラスにスクリプトを記述 ⇒スクリプト
https://w.atwiki.jp/devindex/pages/17.html
コンストラクタ引数なし 引数あり 補足 デストラクタ ステップアップtry、catch、finally、using クラス 参考 コンストラクタ 引数なし public コンストラクタ(){ } 引数あり public コンストラクタ(引数){ } 補足 並べることでオーバーロード可能 デストラクタ ~コンストラクタ(){ } ステップアップ try、catch、finally、using 例)ファイルの読み込み +第1段階……tryなし String str; StreamReader FILE = new StreamReader(ファイルパス);while((str = FILE.ReadLine()) != null){System.Console.WriteLine(str);//表示} +第2段階……try、catch、finallyあり String str; try{StreamReader FILE = new StreamReader(ファイルパス);while((str = FILE.ReadLine()) != null){System.Console.WriteLine(str);//表示}}catch(System.IO.FileNotFoundException ex ){System.Console.WriteLine(ex.Message);System.Console.Read();//エンターで終了return -1;}finally{//後処理if (FILE != null){FILE.Close();}} +第3段階……try、catch、usingあり String str; try{using(StreamReader FILE = new StreamReader(ファイルパス)){while((str = FILE.ReadLine()) != null){System.Console.WriteLine(str);//表示}}}catch(System.IO.FileNotFoundException ex ){System.Console.WriteLine(ex.Message);System.Console.Read();//エンターで終了return -1;} クラス 参考 http //www.labasp.net/CsharpNote/mTips/Moji/index.html