趣味でつながる、仲間ができる、大人世代のSNS、趣味人倶楽部(しゅみーとくらぶ)

よくあるご質問

オブジェクト指向とクラス

最近の言語(JavaとかC#)は大体がクラス単位でプログラミングするようになっている。どうもそのことをオブジェクト指向というらしいが今ひとつ意味がよくわからない。

もちろん一つのクラスで全てプログラムすることもできるけど、ある程度やってると、適当に機能別にクラス分けしたほうが理解しやすいし、あとあと扱いやすいことがわかってくる。

クラス記述の利点はいくつかあると思うけど大きくは、
・そのほうがわかりやすい。特にシステムが大きくなると。
・再利用しやすい。(クラス単位で再利用する)
・マイクロソフトなどすでにできているクラスを部品として利用できる。

ということになる。最近は良いプログラムを書くこととさらにいかに良いクラスを作るかがプログラミングの重要な点になっている。

便利になった反面、そういうことを考えることが多くなったということがオブジェクト指向ということなのだろうか。

よくわからない。

コメント

けんくんさん

2014年09月06日 10:49

tenderさん

そうでしたか、年寄りの記憶がお役に立てて、嬉しい限りです。

それにしても丁寧なご報告、tenderさんのお人柄が偲ばれます。

tenderさん

2014年09月06日 10:27

けんくんさん
 ご紹介いただいた続編も入手しておきました。出版社は変更になり近代科学社からの刊行になっておりました。またカバーは上巻のハードカバーからソフトカバーに変更、きっと一旦は刊行が困難になり、翻訳者の尽力で再刊されたものと思われます。
 いずれにしても古書でしか入手できませんが、DFDを用いた上流工程の説明は色あせず、システムエンジニアとして座右に備えたい書籍だと思いました。
あらためてご紹介ありがとうございました。

けんくんさん

2014年08月26日 21:49

tenderさん

共感いただいて、嬉しい限りです。

なお、本書は主としてシステムの静的な側面を扱ったものですので、イベントとかプロセスとかが問題になる動的なシステムに関しては、同じ著者、訳者、出版社から出ている続編の、

続・オブジェクト指向システム分析 ー オブジェクト・ライフサイクル

に詳しく説明されています。

同書には、ドメインとかサブシステムとかの概念の解説もあり、大規模システムの開発にあたって重要な事柄についても解説があります。

そんな大規模システムではないと言う場合でも、ちゃんとした手法に則って開発を進めていけば、結果的に効率的かつ高品質のシステムになると言う考え方です。

ご参考までに。

tenderさん

2014年08月26日 19:49

けんくんさん
書籍を入手しました。
きちんと書かれている良書ですね。
DFDやRDBを使っている、ここに書かれていることがUMLによってより具体化しているのですね。

けんくんさん

2014年08月24日 09:07

けんさん

別のスレでも議論させていただいています。

オブジェクト指向と言うのは、手法ではなく、考え方(Way of Thinking)なので、いきなり手法から入るとおかしなことになりがちです。

システム設計の前段であるシステム分析の段階からオブジェクト指向でなければ、ちゃんとしたものにはなりません。

かく言う小生も、その昔ある本を読んで、目からウロコが落ちた覚えがあります。

オブジェクト指向システム分析 ー 上流CASEのためのモデル化手法
S.シュレイアー/S.J.メラー 著
本位田真一/山口亨 訳
啓学出版

です。

1990年出版の本なので、手に入れるには結構大変かも知れませんが、平易な解説、優しい文体と言うこともあり、オブジェクト指向に関する最良の教科書だと思います。

何せ、人間が古いので、古い文献しかお示しできないことをお許し下さい。

ご参考までに。

けんさん

2014年08月23日 22:55

けんくんさんのコメントを読みなおしてます。

カッコつけたことを書きましたが、現実は楽なのでプロパティをパブリックにしてプログラミングしてあちこちからアクセス。やってはいけないことです。ここ一週間あるデータが書き換わってしまうバグの原因を探し続けてます。

オブジェクト指向が効率的なんてとても言えないスパゲッティプログラムで情けなくなります。このへんに本当の隠蔽の意味があるのかと今あらためて思い直してます。

C#をやり始めた時からコツコツと作ってきたプログラムで、曲がりなりにも機能しているので大規模修正は至難。どうすればよいか途方に暮れています。

tenderさん

2014年08月22日 21:17

ありゃ、 Neonsign はプラスとマイナスが逆ですねーー ^^;
訂正します、申し訳ありません。

1.クラス名 (Identifier) Neonsign
2.オブジェクト状態    ( Status 、変数 ) (ーは、隠蔽する )
  ーブリンク開始時刻・・省略時は現在から
  ーブリンク回数
  ーブリンク感覚
3.オブジェクトの行動、 ( Behavior、メソッド、関数) (+は公開する)
  + ブリンクタイマーの設定()
  + ブリンク開始()
  + ブリンク終了()

けんくんさん

2014年08月22日 17:23

オブジェクト指向は、ソフトウェアの生産性向上を図る流れの中で生まれたものなので、個人で作成する小規模なシステムではあまり必要性を感じないかも知れません。
大規模なシステムでは、多くの人が開発に関わるため、担当するパート同士で、インターフェースの整合性を確保する必要があります。 つまりどんな情報をどんな形で交換するかと言うことが、極めて重要で、それがきちんとできていないと、大混乱に陥ります。
また、将来仕様変更する必要が生じた場合の対応においても、オブジェクト指向は強力です。
 パート間のインターフェースにおいて、最も重要なことは、交換する情報が少なければ少ないほど効率的な開発が可能であり、トラブルも少ないと言うことになります。
  tenderさんの例で言うと、Neonsign と言うオブジェクトは、ブリンク開始時刻など複数のデータ(オブジェクトのプロパティと呼びます)と、それらデータを操作(変更)する関数(メソッドと言います)をひとつのクラスととして実装されます。
 このとき、ブリンク間隔とブリンク回数の間に何らかの関係があるとします。 例えば、回数が少なければ、それに応じてブリンク回数を減らすとかの条件です。 オブジェクト指向では、クラスのメソッドを使ってブリンク回数や間隔を変更することになるので、Neonsign クラスを使う人は、ブリンク間隔とブリンク回数の間の関係について知っておく必要がありません。
 オブジェクト指向では、ブリンク回数と間隔の関係がクラスの内部に隠蔽されるようプログラミングするからです。 (そうじゃない書き方もできるので、クラスを使えば何でも良いと言う訳ではありません)
 Neonsign のような単純な例では大した違いはないように思われるかも知れませんが、大規模なシステムになると、大きな違いになってきます。 また、将来コードを変更したり、一部のコードを他のアプリに流用したりする場合にも大きな違いが生じます。

けんさん

2013年09月26日 23:56

>転校少年Yさん

なるほど。プログラムを作るよりもハードルが高そうですね。やっぱりプログラミングはWindowsでやることにします。それにしても最近、いい発想が浮かばなくなってきました。これも老化なのかなあ。

転校少年Yさん

2013年09月26日 02:24

>けんさん

iPhoneやiPadのアプリを作るには、MacのPCが必要です。
Objective-Cという、プログラミング言語も覚えなくてはなりませんし、
アップルにデベロッパー登録しなければ、自作アプリのインストールも
出来ないと聞きました。
デベロッパー登録をするには、毎年アップルに高額なデベロッパー登録料を支払わなければなりません。、

けんさん

2013年09月25日 22:41

>転校少年Yさん

私も初代iPadを持ってます。もっぱら読書用です。iPadアプリはGoodReaderなど優れたものが非常に安価でたくさんあります。それを見ると自作するのは・・・と思ってしまう。

もちろんクロス開発でしょうけど、Windowsでもできるんでしょうか?

転校少年Yさん

2013年09月25日 07:06

>tenderさん

タブレットアプリは、まだ勉強中です。
僕も、職業プログラマ時代は、ずっと手続き型言語でしたので、
オブジェクト指向の考え方を理解するのに、とても苦労しました^^

tenderさん

2013年09月25日 06:02

転校少年Yさん 

さらに、
タブレットのプログラムをお作りなので、意識はされておりませんが既にオブジェクト指向のプログラムをおく身になっているはずです。

tenderさん

2013年09月19日 18:18

Star☆Dustさん

お気楽に^^

何でも最初は難しく考えがちですよ!

転校少年Yさん

2013年09月19日 18:01

オブジェクトとは何か・・・
クラスとは何か・・・

難しい話ですが、クラスとはオブジェクト(インスタンス)を
生成する為の設計書のようなものだと思います。

転校少年Yさん

2013年09月19日 17:46

なんだか、難しいお話をされていますね。

昔、アセンブラを使って開発をしていた頃に、マクロはよく使いました。
僕自身、マクロ定義をしてマクロを作った事もあります。
アセンブラ言語においてのマクロとは、機械命令の集合体です。

うまく説明できませんが、クラスはマクロから発展したものとは、
また違った概念だと思います。
オブジェクト指向には、クラスのインスタンス化という作業が
存在するからです。

けんさん

2013年07月28日 08:23

一般にオブジェクトといえば対象ですから、そうなりますね。しかしクラスシステムのプログラム言語ででオブジェクト指向と言えばクラス指向と言ってもいいんではないかと自分は思っています。変数やコマンドはどんな言語でもありますし違いはクラスがあるかないかですから。

昔、アセンブラにマクロというのがありました。クラスはそれから発展したものでしょうか。マクロはただの部品という感じでしたが、今のクラスはひとつの世界というイメージですね。

tenderさん

2013年07月27日 20:39

訂正 ブリンク感覚ではなくブリンク間隔でした。

オブジェクトとは
・識別子
・状態
・行動
を持ち、プログラミング記述ができるもの

クラスとは、そのオブジェクトの設計図、型紙、と説明されています。

例1:
 ねこ −− クラス
       状態 ーー 体重、目の色、ひげの数、毛の模様
       行動 −− 走る()、寝る()、ひっかく() 

 うちのタマ 、となりのブチ −− クラスを具現化したオブジェクト

となります。さらに
 
ネコバス 
   −− ねこクラスを継承し、
       新たな状態(たとえば乗車定員)と、
       新たなメソッド(たとえば車輪で走る)
    を追加したオブジェクト

のように拡張することも可能です。


オブジェクトは、HDにしまってあるクラスをメモリー展開し、プログラムとして走行させた状態とも解釈できます。

tenderさん

2013年07月27日 04:22

このクラスを概念的に設計してみました。
けんさんのご主意と相違点があれば訂正おねがいします。

1.クラス名 (Identifier) Neonsign

2.オブジェクト状態    ( Status 、変数 ) (+は公開する)
  +ブリンク開始時刻・・省略時は現在から
  +ブリンク回数
  +ブリンク感覚

3.オブジェクトの行動、 ( Behavior、メソッド、関数) (ーは、隠蔽する )
  − ブリンクタイマーの設定()
  ー ブリンク開始()
  ー ブリンク終了()

以上です。

けんさん

2013年07月26日 23:23

もうひとつ、クラスについてなるほどと思った例。

ウインドウの一部をチカチカさせる(ネオンサインのように)プログラムを書くとします。クラスを使わないと、

 ブリンク時間を決めるタイマーの設定
 ブリンク時間開始
 ブリンク時間終了(タイマーのイベントになりますが)

多分この3つぐらいのサブルーチンが必要になると思います。例えばC#ではクラス記述でそれらをひとつのクラスで定義できます。定義が出来ればあとは

 blink.Start(label1); 
/blinkがクラス、Startはメソッド、/label1はチカチカさせたいコントロール

これだけです。ごちゃごちゃした部分はクラスの中で作ってしまえばもう気にする必要もありません。再利用もクラスのソースをドラッグするだけ。かなりわかりやすくなったと思いました。

これは単純な機能のクラスですが、大きく複雑な機能のクラスはもっと威力を発揮するでしょう。予め定義をきちんとしておけば(UMLなどで)分業することも楽になります。そしてだんだんとプログラミングよりそういうクラスを書きたいという欲求が強くなっていきます。