ページ 2 / 3
Re: 返信@yu0627
Posted: 2005年11月30日(水) 02:48
by 淡幻星
ちょうど先日に友人と「オブジェクト指向とはなんぞや!?」との
議論をしたところだったので、食いついてみますw
> オブジェクト指向=構造体の中にプロシージャや変数も入っている。
> 「.」使うところから最初こう思っていました。
オブジェクト指向=クラスって思っちゃいますよね^^;
私もそうでしたw
でもまぁ、あながち大きくずれてもないかと思いますが・・・どうでしょうね?^^;
Posted: 2005年11月30日(水) 18:29
by マティ
淡幻星 さんが書きました:オブジェクト指向=クラスって思っちゃいますよね^^;
私もそうでしたw
でもまぁ、あながち大きくずれてもないかと思いますが・・・どうでしょうね?^^;
自分も同意見ですが、VB(VBA)にある
Valiant型がありますよね!あれが、オブジェクト指向の象徴だと思っています。
(大昔に読んだ内容なので保障できませんが)
オブジェクト指向では、関数提供者は、ユーザが引数にどのような型でパラメータを指定しても処理を行えるように関数を作成する義務がるよに書かれていました。その為、関数の内部では、
①パラメータの内容を解析し
②内部変数に置き換え(置き換えの出来ない場合はエラーを適切に出す。)
③処理を行う
これでは、ゲームやドライバーは作れねーと思いそれ以来オブジェクト指向を避けて通っています。
・そのころはクラスの概念はあったかな?
NeXT(知らないだろうな~)あたりからだったような気がする
・今は、クラスは作りますよ!
ちなみに、引数にオブジェクトを指定した場合は、その型を認識する為のヘッダーが付いてきます。
また、複数の型に変換できるような、文字列はそれぞれの型も持ちます。
・VBでValiant型を使用し、数字(文字列)を設定しても意外と普通に処理が出来るのはこの為です。
毎回、数値型に変換はしません。
Posted: 2005年11月30日(水) 20:04
by イグトランス
> オブジェクト指向では、関数提供者は、ユーザが引数にどのような型でパラメータを指定しても処理を行えるように関数を作成する義務があるように書かれていました。
オブジェクト指向は一種の考え方や捉え方のようなものであって、これやVariantのような具体的なことはオブジェクト指向とは無関係だと私は思います。
これよりは「オブジェクト指向=クラス」のほうがまだ正しいものに近いと思います。
Posted: 2005年11月30日(水) 21:04
by マティ
イグトランス さんが書きました:オブジェクト指向は一種の方法論のようなものであって、これやVariantのような具体的なことはオブジェクト指向とは無関係だと私は思います。
イグトランスさん、データ型から始まった程度にとらえて下さい。
Variant型を例に出したのは、一番具体的だと思ったからです。
大昔は、C++なんて言語は無かった(高校生には買えるような金額ではなかった?)ので、C言語でオブジェクト指向を目指すと、下記のような問題があったってことです。
実装はCでもいい(URLの説明はC++とCの関係が逆になっています)
内容はこんな感じ さんが書きました:・クラスは構造体で代用する(事実、C++ の class は C++ の struct とほとんど同じであり、C の struct の拡張版である)
・new や delete にあたるものをクラス毎につくる
・メンバ関数(にあたる関数)の第1引数は、操作対象となるオブジェクトへのポインタとする(これは C++ の this ポインタのような役割をする)
DOS環境で、以下の概念はあったかな?
・コンストラクタやデストラクタの連鎖は手動で行う必要がある
・コンポジションは、普通にできる
・継承は少し工夫が必要だろう
・ポリモーフィズムは、たとえば関数ポインタをうまく使えばできるだろう
・クラススコープがないので、識別子名の衝突を避けるための命名法を工夫する必要がある
流れ的には、『データ(htmlやmpegを含む)からロジック(クラス)そしてシステムへとオブジェクト(対象となる物)の範囲が時間と供に広がって来ている』って事ですよね!
Posted: 2005年11月30日(水) 23:24
by イグトランス
マティさん さんが書きました:イグトランスさん、データ型から始まった程度にとらえて下さい。Variant型を例に出したのは、一番具体的だと思ったからです。
ああ、納得しました。
つい突っ走ってしまいすいませんでした。
Posted: 2005年12月01日(木) 16:16
by 淡幻星
マティさん さんが書きました:流れ的には、『データ(htmlやmpegを含む)からロジック(クラス)そしてシステムへとオブジェクト(対象となる物)の範囲が時間と供に広がって来ている』って事ですよね!
オブジェクト指向って、ずいぶんと昔からあったんですね~。
・・・あ、そういうわけでもないですか。『広げていくこと』がオブジェクト指向、かな?
うーん、『システムへの広がり』ってのは、良く分からないです^^;。
先日の友人との雑談では「オブジェクト指向=カプセル化して他人のライブラリを(楽に&安全に)ガンガン使っていきましょう! 中身は気にしないのです(必要なものは1セットにまとまってます)。ブラックボックス化バンザイ。」という結論に達しました。これで友人、すっきり納得してくれました♪
私は、こういう見方をしてますが、どうでしょう?^^;
Variant型の例は、まさにそんな感じだと思いましたよ。
Posted: 2005年12月01日(木) 18:45
by マティ
淡幻星 さんが書きました:先日の友人との雑談では「オブジェクト指向=カプセル化して他人のライブラリを(楽に&安全に)ガンガン使っていきましょう! 中身は気にしないのです(必要なものは1セットにまとまってます)。ブラックボックス化バンザイ。」という結論に達しました。これで友人、すっきり納得してくれました♪
私は、こういう見方をしてますが、どうでしょう?^^;
Variant型の例は、まさにそんな感じだと思いましたよ。
使用する側から見ると、その通りだと思います。
イグトランス さんが書きました:オブジェクト指向は一種の考え方や捉え方のようなものであって
の通りです。自分も経験から理解しているふりをしていますので・・・詳しいことは、情報系出身者に質問してみで下さい。
自分の経験を、極論で書いています。
オブジェクト指向は、物の考え方と捕らえてください。考え方なので
日々進化して行きます。
(基本的に、使う側が
楽に確実に処理できるかを目的にしていると思います。)
淡幻星 さんが書きました:オブジェクト指向って、ずいぶんと昔からあったんですね~。
・・・あ、そういうわけでもないですか。『広げていくこと』がオブジェクト指向、かな?
オブジェクト指向は
『広げていくこと』ではありません。
大昔から他人のライブラリを使用する事は行われてきましたが、オブジェクト指向とは言いませんよね!
(ActiveBasic以外の言語は、LIBをリンクしますよね!LIBはライブラリの略でバイナリーで提供されます。)
ライブラリを使用するには、パラメータ等のデータ型を明確に指定しなければ実行できません。パラメータ等のデータ型をOBJECT型とし、どの様なデータを指定してもライブラリが使用できる事を目指したのが最初のオブジェクト指向だったと思います。
(技術は日々進歩し)
次の段階で、プログラムのソースコードに関してもオブジェクト指向の考え方が導入されます。
これがクラスにあたると思います。クラスを整備していくと似たようなクラスが作成されますよね!共通の処理は手を入れなくても良いように継承って考え方も出てきました。
(技術は日々進歩し)
.NetFrameworkでOSのAPIを気にしなくても良い方向に進んでいますよね!これもオブジェクト指向の進化ですよね!
(.NetFrameworkはWin以外でも使用できる)
WinVistaの最初の案では、OSのAPIもWinFX(.NetFramework)を標準にすると言っていました。
これからも、ユーザが楽に確実に物を作れるようにするかって事で進化&統合化して行くと思います。
極論でした。間違いもあると思います。ごめんなさい
ここまで話が大きくなると、知識の無いおじさんは、投稿したのは失敗だったって反省しています。
返信@yu0627
Posted: 2005年12月01日(木) 20:18
by yu0627
数日見ないうちにこんなに返信がありました。皆さん、ありがとうございます。
.NetFrameworkでOSのAPIを気にしなくても良い方向に進んでいますよね!これもオブジェクト指向の進化ですよね!
(.NetFrameworkはWin以外でも使用できる)
WinVistaの最初の案では、OSのAPIもWinFX(.NetFramework)を標準にすると言っていました。
OSのAPIを気にしなくてもよい方向に進んでいるということは、.NET FrameWork自体がWinAPIに変わる物を用意したということでしょうか。
Win以外で.NET FrameWorkが使えるのははじめて知りました。
WindowsVistaは本屋の立ち読みで情報を時々仕入れていました。最初はWinFXという開発セットをつけるとかありましたが...。
結局実装されないということでした。
オブジェクト指向は、物の考え方と捕らえてください。考え方なので日々進化して行きます。
(基本的に、使う側が楽に確実に処理できるかを目的にしていると思います。)
そうなんですか。確かに考え方なら日々進化していきますよね^^;
Variant型ってその名のとおりどんなデータ型でも意識せずにつかるらしいですね。
まだ
AB以外の言語に触ったことはないのでわかりませんが。
まだプログラミングを始めて
一年も
経っていない初心者ですのでまだまだ分からない事もたくさんありますが。
Posted: 2005年12月01日(木) 21:39
by イグトランス
ちなみに世間的にはこんな感じのようです。
オブジェクト指向プログラミング - Wikipedia
オブジェクト指向プログラミングとは相互にメッセージを送りあうオブジェクトの集まりとしてプログラムを構成する技法である。
さらに本文を読み進めていくと上記メッセージ送信ともう1つ、
C++の抽象データ型のスーパーセットという定義もあると書いてありますね。
Posted: 2005年12月01日(木) 22:55
by マティ
すみません。私が話をゴチャゴチャにしていました。
イグトランスさんに紹介を頂いたホームページには、以下の用語の説明もありました。
オブジェクト
オブジェクト指向においては、データと手続きを一体化して保持している存在。オブジェクトは、外部からのメソッド呼び出しでメッセージを受け取り、内部で処理を行い、他のオブジェクトにメッセージを送ったり、自己の状態を変更する。オブジェクトが集まったものが実行プログラムになる。
オブジェクト指向
オブジェクト指向とは、オブジェクト同士の相互作用としてシステムの振る舞いをとらえる考え方である。
Posted: 2005年12月02日(金) 02:11
by Sinryow
スレッドの内容から外れてきているようにも思えますが,あえて。
私の個人的な捉え方ですが
オブジェクト指向プログラミングが必要なのは(
=私がクラスを用いるのは),
動作(メソッド)の制御するところとならないところで,変数が書き換えられないことが保証される必要がある場合と考えています。
そうでなければ,例えば変数だけが必要なら構造体でよいですし,(変数と連動しない)関数だけが必要なら単に関数宣言をすればよいのですから。
※逆に言えば,私はカプセル化が必要ない時は基本的にクラスを使っていないということです
あと,マティさんがおっしゃっている「ユーザが引数にどのような型でパラメータを指定しても処理を行える」ということは,
Wikipediaの「オブジェクト指向 - 背景」の項にありますが,Smalltalkの設計思想がそれにあてはまるそうです。(この辺りの考えは,一部ですがJavaにもあると思います。)
しかしそのような考えは,C++なんかだとテンプレートとかオーバーロードの扱いになるので,それをオブジェクト指向とみなすのはどちらかといえば現在の主流ではないような気がします(完全に根拠はありませんが)。
※
2005.12.3 0:42 「オーバーロード」を追記。
【余談】
最近Perlのオブジェクト指向プログラミングに挑戦してます。興味がある方,いろいろ話し合いませんか?
(ここでやると迷惑になるので,私のサイトの掲示板でお願いします。)
返信@yu0627
Posted: 2005年12月02日(金) 17:53
by yu0627
スレッドの内容から外れてきているようにも思えますが,あえて。
確かに外れてきていますよね...。(ハンガリー記法→オブジェクト指向)
オブジェクト
オブジェクト指向においては、データと手続きを一体化して保持している存在。オブジェクトは、外部からのメソッド呼び出しでメッセージを受け取り、内部で処理を行い、他のオブジェクトにメッセージを送ったり、自己の状態を変更する。オブジェクトが集まったものが実行プログラムになる。
オブジェクト指向
オブジェクト指向とは、オブジェクト同士の相互作用としてシステムの振る舞いをとらえる考え方である。
やはり難しいですね...。オブジェクトはこの説明文を見ると”箱”ですかね。
外から入ってきたメッセージを内部で変換して自分の”箱”の種類(?)を変更したりほかの”箱”にメッセージを送る。
そして、その”箱”が集まったものがプログラムですかね...。
Re: 返信@yu0627
Posted: 2005年12月02日(金) 19:44
by NoWest
やはり難しいですね...。オブジェクトはこの説明文を見ると”箱”ですかね。
> 外から入ってきたメッセージを内部で変換して自分の”箱”の種類(?)を変更したりほかの”箱”にメッセージを送る。
> そして、その”箱”が集まったものがプログラムですかね...。
そんなに難しいとか考えなくても良いですよ。
そもそもオブジェクト指向というのは構造化プログラムと同時期に生まれていましたが、構造化プログラミングと全く異なる考え方ではありませんので今も昔も対立しているわけではありません。
ただ、構造化プログラミングが「情報は情報、手続きは手続き」でそれぞれ別にまとめようと考えたのに対し、オブジェクト指向は「情報とそれを扱う手続き」を1つにまとめようと考えただけです。
とにかく試してみるのが一番ですよ。
コード: 全て選択
#N88BASIC
' ↓ ここからプログラムが実行されます
/* 構造化 */
Type MYDATA
Age As Long
Name[255] As Char
End Type
Sub InputAge(ByRef dat As MYDATA)
Dim s As Long /*バグなのかINPUTで構造体のメンバに値が入力されない*/
Input "年齢を入力してください。 >",s
dat.Age=s
End Sub
Sub InputName(ByRef dat As MYDATA)
Dim s As String
Input "名前を入力してください。 >",s
lstrcpy(dat.Name,StrPtr(s))
End Sub
Sub PrintMyData(ByRef dat As MYDATA)
Print "名前 ",MakeStr(dat.Name)
Print "年齢 ",dat.Age
End Sub
Dim MyData As MYDATA
InputName(MyData)
InputAge(MyData)
PrintMyData(MyData)
コード: 全て選択
#N88BASIC
' ↓ ここからプログラムが実行されます
/* オブジェクト指向 */
Class CMYDATA
Private
Age As Long
Name[255] As Char
Public
Sub InputAge()
Input "年齢を入力してください。 >",Age
End Sub
Sub InputName()
Dim s As String
Input "名前を入力してください。 >",s
lstrcpy(Name,StrPtr(s))
End Sub
Sub PrintMyData()
Print "名前 ",MakeStr(Name)
Print "年齢 ",Age
End Sub
End Class
Dim MyData As CMYDATA
MyData.InputName()
MyData.InputAge()
MyData.PrintMyData()
2つを比較すると構造化では関数の引数が構造体なのですが
オブジェクト指向ではクラスが関数を呼び出してますよね。
つまり、
「あんなふうに、こんなふうにしなくてはいけない」というのがオブジェクト指向ではありません。
「どのような見かたでどのようにプログラムを分割したか」です。
※もちろん、このようにした方が良いというな定石は既に完成されつつありますが、オブジェクト指向そのものが完璧ではありませんのでアスペクト指向などの新しい手法がオブジェクト指向の上に構築され、問題も補完されつつあります。しかし、それ自体も完璧ではありませんので、結局の所プログラマの腕次第という所です。
兎に角、慣れなのでぜひ挑戦してみることをお勧めします。
返信@yu0627
Posted: 2005年12月02日(金) 20:21
by yu0627
2つを比較すると構造化では関数の引数が構造体なのですが
オブジェクト指向ではクラスが関数を呼び出してますよね。
NoWestさん、サンプルソースを使っての詳しい説明ありがとうございます。自分でやってみて大体理解できました。
確かに難しく考えすぎでした。「Class」内でメンバ関数およびメンバ変数を定義し、「Private」はそのクラス内だけアクセス可能なもの、「Public」はプログラム内のどんなところからでもアクセス可能ということですね^^
あとはこれをどのように利用していくか...。自分でいろいろとやっていきたいと思います。
#あ、クラスってもちろん
DLL内でも
使用可能ですよね!?
【追記】
今回ソースを見てかなりオブジェクト指向の意味が分かるようになりました。
オブジェクト指向第一弾としてDLLを作ってみようと思います。
Re: 返信@yu0627
Posted: 2005年12月02日(金) 21:35
by NoWest
> 確かに難しく考えすぎでした。「Class」内でメンバ関数およびメンバ変数を定義し、「Private」はそのクラス内だけアクセス可能なもの、「Public」はプログラム内のどんなところからでもアクセス可能ということですね^^
> あとはこれをどのように利用していくか...。自分でいろいろとやっていきたいと思います。
そうです。
とにかくチャレンジしかありません。
オブジェクト指向が難しく感じられるのはポリモーフィズムとかインヘリタンスとかカプセル化とか初めて聞いた人がよく分からないようなものがオブジェクト指向が持つ特徴だとか思われていることです。
確かにそうだといえばそうなのですが、それらは「データと手続き」を一緒にまとめるという根源的な仕組みがもたらした副産物ですから、今それを使いこなす必要はありません。最初は「変数と関数が1つに収まってる便利な機能」ぐらいの理解で十分です。
> #あ、クラスってもちろん
DLL内でも
使用可能ですよね!?
>
勿論使用できます。
ただし、COMコンポーネントのようにDLLからオブジェクトを外に出すのには一工夫必要ですが。。。