Javaの解説本を読んでオブジェクト指向プログラミングという物があることをしりました。その本には「オブジェクトはデータとそのデータを扱うための機能を持っている。この機能はメソッドと呼ぶ。クラスは設計図のような物で変数とメソッドから構成されている。設計図を実際に形にした物がインスタンスである。」と書いてありました。私はオブジェクト=クラスのような感じがしたのですが、実際のところオブジェクト=クラスでいいのでしょうか?
 また、友人に話したところ、オブジェクト指向はサブルーチンに似ているといっていました。私はプログラミングの知識が全くないのでサブルーチンという物が何なのかわからないのですが、サブルーチンとオブジェクト指向の考え方は違うような気がするのです。友人に説明して納得させるにはどうしたら良いのでしょうか?
ぜひ、力を課してください。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

サブルーチンとはプログラムの部品のことです。

サブルーチンAがあったとして、そのサブルーチンは画面のXY座標にアイコンIを表示させるとします。
そして、X座標を10、Y座標を2、Iを「マイコンピュータ」として、サブルーチンAを実行すると、画面の左上あたりに、そのアイコンが表示されるわけです。1つのサブルーチンを作成すれば、座標やアイコンを変えて他のアイコンも表示させることができるので便利なわけです。(Windowsユーザーでなかったらごめんなさい)

オブジェクト指向の場合は、まずアイコンとはどういう存在(オブジェクト)なのか?という考え方をします。どこの座標にいるのか?どんな絵なのか?というような情報がまずあります(クラス)。画面上には幾つかのアイコンがあります(1つ1つがインスタンス)。あるアイコンをマウスでドラッグしたら、画面を移動しないといけないので、インスタンスに対して、マウスの座標に移動せよ!と伝える(メソッド)。という感じです。

オブジェクト指向では、全てがオブジェクトであるので、クラスもオブジェクトであり、インスタンスもオブジェクトです。
xruzさんが最初に言っていたように、メソッドとサブルーチンはノイマン型コンピュータ(普通のコンピュータ)では良く似ています。

できるだけ簡単に書いたつもりですが、果たして理解していただけるかどうか・・・。
    • good
    • 0

 オブジェクト指向の「クラス」は分類,「インスタンス」はその分類に属する実体,と考えてもいいかと思います。



 例えば,「人間」というクラスを考えると,そこには「aton」や「Leroy(敬称略失礼)」のようなインスタンスがあります。「人間」には例えば「喋る」という機能がありますから,それを「人間」クラスにメソッドとして実装すれば,「人間」クラスに属する全てのインスタンスが「喋る」機能を持つようになります。

 サブルーチンには,こういうカテゴリー的な概念は含まれていません。例えば「走る」という機能について考えてみます。オブジェクト指向プログラミングでは,「動物」というクラスを作り,そこに「走る」というメソッドを実装するという方法を取ります。この場合,「動物」クラスのインスタンスではないもの(例えば「植物」)からは,「走る」というメソッドは使えません。一方,サブルーチン化では,単に「走る」というサブルーチンを作ると,それはプログラムのどこからでも再利用できます。

#「人間」からしか使えないほうがいいのか,どこからでも使えたほうがいいのか,
#どちらの方がよいか,ということはここでは論じません。

 ちなみにオブジェクト指向プログラミングにはさらに便利な概念として,「継承」「多態化」という概念があります。上の例で言うと,例えば「動物」クラスの下に,「人間」クラスと「犬」クラスを作ると,「動物」クラスの「走る」メソッドは「人間」インスタンスからも「犬」インスタンスからも使えます(継承)。さらに,人間は二本足で走り,犬は四本足で走るという違いを実装したい場合,継承したメソッド「走る」を*同じ名前で*「人間」クラス/「犬」クラスにおいてカスタマイズできます(多態化)。

#上の「多態化」の例は「継承」に含まれるかも…。ちょっと自信なし。

##Java/オブジェクト指向を学ぶためにC/C++を学ぶ必要はないんじゃないかなぁ。
    • good
    • 0

下の方が答えられてることは非常に正確でわかりやすいとおもいますが、初心者のかたにはちんぷんかんぷんだとおもいますのでひとつアドバイスを。

。。
JAVAを習得する前にC言語を習得されるのがよいと思います。CとC++を習得すればJAVAの基本は2週間程度でほぼ完璧に習得できると思います。
めんどくさいと思われるかもしれませんが、それが一番確実にJAVAを自分のものにする方法だとおもいます。
    • good
    • 0

> 私はオブジェクト=クラスのような感じがしたのですが、実際のところオブジェクト=クラスでいいのでしょうか?



イコールではないと思います。
オブジェクトと言う言葉が、実はいろんな意味に使われます。クラスを意味したり、インスタンスを意味したりするのですが、あくまでもクラスとインスタンスが対語になります。(クラス・オブジェクトとインスタンス・オブジェクトがあると思ってください)
クラスと言う設計図から何台もの(別々の)車(インスタンス)が作られたとき、それぞれの車(インスタンス又はオブジェクト)はクラスに属しますが、クラスそのものではありません。クラスを代表するのはあくまでも設計図です。

> 友人に話したところ、オブジェクト指向はサブルーチンに似ているといっていました。サブルーチンとオブジェクト指向の考え方は違うような気がするのです。

これはいろんな人から聞きます。見かけはすごく似ていますが、根本が違います。
サブルーチンは、システムの組みやすさで、作成されます。
オブジェクト指向は、世の中の仕組みを分析して、それを忠実に再現するモデルを作ります。(クラスの構成)。その上でそのクラス(最終的にはインスタンス:オブジェクト)を定義します。
オブジェクトプログラミングでは、インスタンスがサブルーチン(実際にはモジュール)のような形で作られていきます。
しかし、最も特徴的なのはサブルーチン(モジュール:実はインスタンス)がプログラムの実行中にどんどん作られていくことです。
クラスと言う設計図をもとにインスタンスをどんどん作り、それを自由自在に実行して処理をしていく。
似ていると言いながら、従来の言語ではありえなかった機能だと思います。
あくまでも、自然界をモデルにしているから出てくる発想と言えます。
    • good
    • 0

私もまだ勉強中の者です。


1.クラスはオブジェクトのひとつでありイコールではありません。
2.サブルーチンはオブジェクトのメソッドとして考えたほうが近いですね。

まだまだ私も初心者レベルですがお互いにがんばりましょうね。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qphpでオブジェクト指向と呼べる設計をするには・・・

phpで、なるべく同じ処理は関数化し、
ひとつの大きな処理としてまとめています。

これは、オブジェクト指向といえるのでしょうか?
オブジェクト指向とはもっと高度で汎用性が高く
たんなる関数化ではオブジェクト指向とはいえないでしょうか?

綺麗なオブジェクト指向とは一体のどようなものなのでしょうか?

どこまでオブジェクト化すれば
オブジェクト指向なのかよく分かりません。
使いまわしがきけばオブジェクト指向なのでしょうか?
他のプログラムに影響を与えなければオブジェクト指向なのでしょうか?

質問が抽象的ですが、よろしくお願いします。

Aベストアンサー

>たんなる関数化ではオブジェクト指向とはいえないでしょうか?

いえない。それは「構造化プログラミング」というものだ。プログラムを処理ごとに整理し構造化する手法だな。

オブジェクト指向は、「処理ごと」に整理するのを超え、「独立して扱える個々のプログラムの集合体」として設計する。これはクラスとして設計される。それぞれのクラスは、他のプログラムに依存せずそれぞれ単独で機能する形で設計されなければならない。そうして設計されたクラスの組み合わせによりプログラム全体を構築する。これがオブジェクト指向プログラミング。

関数は、ただ「一つの機能をまとめたもの」に過ぎない。これに対し、クラスは「機能と、値をパッケージ化」する。そのクラスに必要な機能をメソッドとして用意し、そのクラスを利用するために必要な情報をすべてメンバー変数として自身の中に保持する。そのクラスを利用するのに必要な情報は、すべて自分自身の中にある。そうした独立性のあるオブジェクトとしてプログラムを定義するのがオブジェクト指向。

ただ、PHPの場合、ちょっとしたものだとわざわざオブジェクト指向を持ち出さなくとも作れてしまうので、なかなかオブジェクト指向の考えを実践するのは難しいところがある。オレも、ちょっとしたものならまずクラスなんて定義しないで作っちまうし。すっきりと美しく作られたオブジェクト指向を理解したいなら、PHPの場合、MVCによるフレームワークを勉強するのが割と手っ取り早いんでないかと思うな。CakePHPとかZend frameworkなんかを実際に使ってみると、オブジェクト指向がどういうものか、次第にわかってくるんでないかな。

>たんなる関数化ではオブジェクト指向とはいえないでしょうか?

いえない。それは「構造化プログラミング」というものだ。プログラムを処理ごとに整理し構造化する手法だな。

オブジェクト指向は、「処理ごと」に整理するのを超え、「独立して扱える個々のプログラムの集合体」として設計する。これはクラスとして設計される。それぞれのクラスは、他のプログラムに依存せずそれぞれ単独で機能する形で設計されなければならない。そうして設計されたクラスの組み合わせによりプログラム全体を構築する。こ...続きを読む

Qオブジェクト指向における「クラスA have a クラスB」の関係において,クラスBからクラスAのあるメンバ変数だけを触る方法

クラス10~50個の中規模プログラミングに当たって,以下の問題がよく出てきて,
「簡潔な方法はないものか・・・」と悩んでいます.

●前提条件
【・「クラスAに持たれているクラスB( A have a B 関係)において,
  クラスBからクラスAのあるメンバ変数(プロパティ)だけを触りたい」】

この場合,私はよく以下のようにしてしまい,クラス間の独立性を無くしてしまいます.
●方法1:
・クラスBのコンストラクタに「自分の持ち主であるクラスAのオブジェクト」を引数に取り,クラスBの変数(プロパティ)usedClassAとする.

=======
C言語風に書くと,
<code>
public void クラスA{
  クラスB usingClassB = new クラスB(); // 持っているクラスB
  int commonNum = 0;
  public void AddCommonNum(){
      commonNum++;
   }
   ...
   (その他の処理)
   ...
}

public void クラスB{
   class usedClassA;    // 持ち主のクラスA

   // コンストラクタ
   public クラスB(クラスA _usedClassA){
       usedClassA = _usedClassA;
   }
   public void AddCommonNum(){
       _usedClassA.AddCommonNum();
   }
}
<\code>
となります.

この方法の問題点は,クラスAとクラスBに<双方向の依存関係を作っている>ことで,
クラスAの設計(ここではAddCommonNum())が変更されたときに,クラスBの内容を変更しなければならない可能性があることから,拡張性に欠けると考えています.

そこで,他に何かいい実装方法が無いか,
教えていただけないでしょうか?
特に,このような前提条件に汎用的に使える方法だと尚良いです.

クラス10~50個の中規模プログラミングに当たって,以下の問題がよく出てきて,
「簡潔な方法はないものか・・・」と悩んでいます.

●前提条件
【・「クラスAに持たれているクラスB( A have a B 関係)において,
  クラスBからクラスAのあるメンバ変数(プロパティ)だけを触りたい」】

この場合,私はよく以下のようにしてしまい,クラス間の独立性を無くしてしまいます.
●方法1:
・クラスBのコンストラクタに「自分の持ち主であるクラスAのオブジェクト」を引数に取り,クラスBの変数(...続きを読む

Aベストアンサー

 こんにちは。
 簡単な話、共通のプロパティクラスを作成して、ClassAとClassBが其れを参照したり更新したりすれば、ClassAとClassBは左程依存しないのでは。
 一応C++で、其れらしき事をしてみましたので、参考程度に。

#pragma warning(disable : 4786)
#include<map>
#include<string>

//プロパティオブジェクトココから
struct IVariantHolder
{
  virtual ~IVariantHolder(){ }
};

template<class __TP>
struct CVariantHolder : public IVariantHolder
{
  typedef typename __TP variant;

  explicit CVariantHolder(const variant& val) : m_val(val){}
  ~CVariantHolder(){}

  variant& Get(){ return m_val; }
  const variant& Get() const { return m_val; }
  operator variant&(){ return m_val; }
  operator const variant&() const { return m_val; }
private:
  variant m_val;
};

struct CPropertyData
{
  typedef std::map<std::string, IVariantHolder*> map_t;
  template<class __TP>
  bool AddProperty(const __TP& tp, const std::string& sPropertyName)
  {
    if(GetProperty(sPropertyName))return false;
    return m_map.insert(std::make_pair(sPropertyName, new CVariantHolder<__TP>(tp))).second;
  }
  IVariantHolder* GetProperty(const std::string& sPropertyName)
  {
    return const_cast<IVariantHolder*>(
                static_cast<const CPropertyData&>(*this).GetProperty(sPropertyName)
                     );
  }
  const IVariantHolder* GetProperty(const std::string& sPropertyName) const
  {
    map_t::const_iterator it = m_map.find(sPropertyName);
    return it == m_map.end() ? 0 : it->second;
  }
private:
  map_t m_map;
};

template<class __TP>
static __TP* Lock(CPropertyData* property, const std::string& sPropertyName)
{
  CVariantHolder<__TP>* pVal = dynamic_cast<CVariantHolder<__TP>*>(property->GetProperty(sPropertyName));
  return pVal ? &pVal->Get() : 0;
}
//プロパティオブジェクトココまで

//テスト用の構造体
struct CommonStruct
{
  CommonStruct(long _l, short _s, char _c) : l(_l), s(_s), c(_c){}
  longl;
  shorts;
  charc;
};

//クラスAとクラスBココから
struct ClassB;
struct ClassA
{
  ClassA(ClassB* p, CPropertyData* property) : m_useClassB(p), m_property(property)
  {
    //ココでメンバ変数(プロパティ)の領域を動的に作成する
    m_property->AddProperty(int(0), "commonNum");
    m_property->AddProperty(CommonStruct(4, 2, 1), "commonStruct");
  }
  void DisplayProperty()
  {
    ::printf("%s %d %s\n", "[commonNum : ", *::Lock<int>(m_property, "commonNum"), "]");

    CommonStruct* p = ::Lock<CommonStruct>(m_property, "commonStruct");
    ::printf("%s <%d><%d><%d> %s\n", "[commonStruct <l><s><c> : ", p->l, p->s, p->c, "]");
  }
private:
  ClassB*m_useClassB;
  CPropertyData*m_property;
};

struct ClassB
{
  explicit ClassB(CPropertyData* property) : m_property(property){}
  void AddCommonNum()
  {
    int* pi = ::Lock<int>(m_property, "commonNum");
    (*pi)++;
  }
  void SetCommonStruct(long l, short s, char c)
  {
    CommonStruct* pc = ::Lock<CommonStruct>(m_property, "commonStruct");
    new (pc) CommonStruct(l, s, c);
  }
private:
  CPropertyData*m_property;
};
//クラスAとクラスBココまで

//お試し
int main()
{
  //両方に共通なプロパティオブジェクト
  CPropertyData property;

  //クラスBに渡す
  ClassB b(&property);

  //クラスAにクラスBとプロパティオブジェクトを渡す
  ClassA a(&b, &property);

  //クラスBでプロパティを操作する
  b.AddCommonNum();
  b.SetCommonStruct(10, 20, 30);

  //クラスAでプロパティを表示する
  a.DisplayProperty();
  return 0;
}

 こんにちは。
 簡単な話、共通のプロパティクラスを作成して、ClassAとClassBが其れを参照したり更新したりすれば、ClassAとClassBは左程依存しないのでは。
 一応C++で、其れらしき事をしてみましたので、参考程度に。

#pragma warning(disable : 4786)
#include<map>
#include<string>

//プロパティオブジェクトココから
struct IVariantHolder
{
  virtual ~IVariantHolder(){ }
};

template<class __TP>
struct CVariantHolder : public IVariantHolder
{
  typedef typename __T...続きを読む

Qオブジェクト指向設計について

オブジェクト指向設計に興味を持って、いくつかオブジェクト指向の本を読んでみたのですが、
どうもオブジェクト指向に関する基礎知識の説明ばかりで、
オブジェクト指向でどのように設計するのか、どのように生かされるのか、
肝心な部分がいまいちピンときません。

オブジェクト指向による設計に重点を置いたお薦めの書籍などありましたら是非教えてください。

Aベストアンサー

私も「オブジェクト指向のこころ」がお勧めです。
http://www.amazon.co.jp/dp/4894716844
通して読むと、オブジェクト指向の考え方が分かります。

他には下記のものもお勧めです。
「オブジェクト指向でなぜつくるのか」
http://www.amazon.co.jp/dp/4822281957/

「アジャイルソフトウェア開発の奥義」
http://www.amazon.co.jp/dp/4797347783/

「Code Complete第2版〈上〉」(6章にクラスの解説が有る)
http://www.amazon.co.jp/dp/489100455X/

Qオブジェクト指向全般、及び、クラス設計について。

オブジェクト指向全般、クラス設計についての質問です。

当方、C#の日曜プログラマであり、数年まえから趣味のプログラミングを楽しんでおりました。
これまではあまりOOPに関する深い部分の理解をしないままなんとなくプログラミングをしてきましたが、このほど、そこらへんの理解を深めるべく名著と呼ばれる以下の書籍を買い漁って理解を深めようと模索しておりましたが、どうも、しっくりきません。

リファクタリング プログラミングの体質改善テクニック(マーチンファウラー)
オブジェクト指向でなぜつくるのか(平澤章)
デザインパターンとともに学ぶ オブジェクト指向のこころ(アラン・シャロウェイ)
(これ以外に名前は失念してしまいましたが、UNLの書籍も読みました)

それぞれの書籍を読んで「うん。なるほど。」というある程度の理解はできているつもりですが、如何せん、自分のコードで・・・となると、ちょうど作文の最初の一文が見つから無いときのような、そんな感覚に襲われてしまします。

これまでの自分のプログラミングというのは、「動けば良い」という部分が最優先であり、かつ、それのみにしかこだわって無かったことも原因としてはありそうです。

その中でも、特に戸惑ってしまうのが、「何をクラスにするのか」という最も基本的な部分です。

今習作として、2ch用ブラウザのコードを書いていますが
クラス候補としていくつかのものを、確信の無い状態で挙げてはみますが
ワード及び原則としての「責務」「単一責任の原則」「高凝集度」「疎結合」・・・
(それぞれの用語や原則の意味は、ある程度理解しているつもりですが)
これらの用語の海で溺れてしまっている感覚で、何をクラスとすればよいのか?という部分で
すでにアップアップしているような感じとなってしまいます。

また、個々のオブジェクトの関連において、あるオブジェクトを保持するのはどのオブジェクトである
べきか?また、あるオブジェクトにメッセージパッシングするのはどのオブジェクトであるべきなのか?等など・・・このあたりについても、一向に頭の中の霧が晴れてくれません。

このような、悩みを解消する考え方、方法、その他おすすめの書籍でも構いませんが、ご助言いただけませんでしょうか?

よろしくおねがいします。

オブジェクト指向全般、クラス設計についての質問です。

当方、C#の日曜プログラマであり、数年まえから趣味のプログラミングを楽しんでおりました。
これまではあまりOOPに関する深い部分の理解をしないままなんとなくプログラミングをしてきましたが、このほど、そこらへんの理解を深めるべく名著と呼ばれる以下の書籍を買い漁って理解を深めようと模索しておりましたが、どうも、しっくりきません。

リファクタリング プログラミングの体質改善テクニック(マーチンファウラー)
オブジェクト指向でなぜつく...続きを読む

Aベストアンサー

私も質問者さんと同じように、原則だの設計手法だのに振り回されてコードが書けなくなった経験があります。今でもたまに手が止まってしまいます。
>ちょうど作文の最初の一文が見つから無いときのような、そんな感覚に襲われてしまします。
というのは痛いほどよくわかります。
作文で手が止まってしまうのは、そもそも文章を書き慣れていないと、どうすれば相手に自分の考えが伝わるのか、それ以前に自分が何を伝えたいのかもわからない、読んだ相手がどう思うのか想像出来ないからではないでしょうか。「何を求められているのか」という判断基準そのものが無いが故に手の付け方もわからない状態です。
ソフトウェアの設計も似たようなもので、どんな機能が必要で、どんな問題が起こりうるのか、何処が頻繁に変更され、どんなコードなら自分や他人が把握しやすく、保守しやすいか、みたいなのは、最初のうちは見当つかないものです。熟考すれば出てくるものでもありません。


知識をつけると、最初は問題ではないものまで問題に見えてきます。
そうした段階で分析を行っても、書いていてモヤモヤする、何となく気持ち悪い、違和感がある、みたいな理由しかでてきません。しかし、それは本当に取り組むべき問題ではありません。
実作業に支障を来していないコードを、問題に仕立て上げようとしているだけです。
経験豊富なプログラマなら納得出来る理由を説明し、より良い解決策を提示して設計を見直すかもしれません。
しかし、改善すべき明確な理由も方向性も見えていないのなら、手のつけようがありません。
恐らく何処まで経験を積んでもそういう霧は晴れません。そもそも何が必要になるか、何が問題になるのか、みたいな予知を完全に行うことはできないからです。常に不安はつきまといますし、想定外の仕様変更なんていくらでも出てきます。具体的な形になって使い方が解ると、新たな使い道が見える事も少なくありません。そうしてソフトウェアは進化していっています。
拭いきれない違和感との戦いは終わりがないのも問題です。これこれを達成すればひとまずOKという基準を作るのも設計の一環です。
ならば、真っ先に取り組むべき問題は、書いていてイライラする、実作業に支障が出ているところです。
ある機能を呼び出すのに長~いコード何度も書かなければならなかったり、機能を追加するたびにプロジェクト中の修正を必要としたり、一見関係ないコードを修正すると頻繁にバグったり…。


私が今のところこういう状態に陥ったとき、一番巧くやれている方法は、本やネットで得た知識は一旦シャットアウトして、形にする。そして実際に使い続けてみる。また、複数の方法で作ってみて比較する、です。
そうして問題点を洗い出し、再設計を行います。
これを何度も繰り返します。
いわゆるスパイラルモデルというやつですが、「想定される問題」ではなく、プロトタイピングで「顕在化された問題」に対して取り組むのが重要だというのが私の現在の結論です。勘のきかない経験の少ないコードほどそう感じます。逆に何度も組んだことがあるコードは、繰り返し回数が減り、結果的にウォーターフォールになります。


あるオブジェクトを何処が持つべきか、見当がつかなければ、とりあえずグローバルな場所に置いておきます。
C#ならシングルトンとして作ってクラスメソッドで取得させるとか、メインフォームに置いとくとかです。
作り込んでいくうちに、全く関与しないクラス、殆ど全ての機能からアクセスされるオブジェクトなど、関連性はある程度明確になりますし、グローバルにアクセス出来るオブジェクトの問題点もそのうち直面します。
そのとき、再び本を開いてみてください。書いてある意味がまるで違うことに気がつきます。それを何回も何回も繰り返して、ようやく理解したことになるんだと思います。


だらだらとした長文で「結局経験っすよー」みたいな話ばかりで申し訳ありません。
ですが、少しでも切っ掛けが掴めれば幸いです
参考URLは私が以前した、似たような質問のURLです。ご参考までに。

参考URL:http://oshiete.goo.ne.jp/qa/4167313.html

私も質問者さんと同じように、原則だの設計手法だのに振り回されてコードが書けなくなった経験があります。今でもたまに手が止まってしまいます。
>ちょうど作文の最初の一文が見つから無いときのような、そんな感覚に襲われてしまします。
というのは痛いほどよくわかります。
作文で手が止まってしまうのは、そもそも文章を書き慣れていないと、どうすれば相手に自分の考えが伝わるのか、それ以前に自分が何を伝えたいのかもわからない、読んだ相手がどう思うのか想像出来ないからではないでしょうか。「何を求...続きを読む

Qオブジェクト指向の特徴

プログラミングにおいて

Java言語などのオブジェクト指向とは

「クラス(設計図)からインスタンス(実体)を量産できる。」がオブジェクト指向ではないプログラミング言語との決定的な違いなのでしょうか?

またオブジェクト指向とオブジェクト指向ではない言語の決定的な違いや
実際に実務において経験した感覚的な違いなどがあれば教えてください。

インターネットに乗っていない些細なことでも構いません。

Aベストアンサー

数学の世界では、関数(写像) の引数には定義域というものがあって、範囲外の値を入力することは許されません。

しかし、定義域を変えて新しい関数を定義することはできます。

例えば対数関数 log x の場合、定義域は x>0 ですが、x=0 の時、log 0=-∞ と定義することもできます。

高校数学では、x<0 を可能にするために log|x| とすることが多いのですが、多値関数の概念を学ぶと

cosπ+i sinπ=e^(iπ)
log(-1)=i(2n-1)π

のように負の対数も定義可能になります。

オブジェクト指向の概念はこれと似ており、入力側の型や範囲を拡げて定義することで既存のプログラムの書き換えをする手間を減らそうというものです。

Qオブジェクト指向とモジュール設計

プログラミング設計の基礎について勉強しているのですが、どうしても、オブジェクト指向とモジュール設計の違いがわかりません。
どちらも、システム(プログラム全体)を機能ごとに分割して各パーツごとにプログラム設計~テストまでを行ない、完成させたパーツを組み合わせてシステムを完成させると言う解釈をしているのですが、オブジェクト指向とモジュール設計のちがいがみつけられません。
この解釈自体が間違っているのでしょうか?

Aベストアンサー

オブジェクト指向設計の特徴は以下の通りです。

(1) データとその処理方法(メソッド)をひとまとまりのものとして扱います。データは原則として
  直接外部からアクセスされるのではなく、必ずメソッドを使って処理されます。
  [情報隠蔽・カプセル化・抽象データ型]
(2) 従来のやり方では、あるデータが他のデータを持っている、あるデータが他のデータに
  含まれるという関係(HasA関係)に着目して構造化を図るのが普通でしたが、オブジェクト指向設計
  では、それに加えて、あるデータというか概念が他の概念の一種特別な場合であるという関係
  (IsA関係)に着目して構造化を図ります。特別な概念は一般的な概念の持っている性質を継承します。
  [継承・導出クラス・フレーム理論]
(3) 従来のやり方では、処理の一部分、共通な処理などをサブルーチンとして独立させることにより、
  処理の構造化を図っていました。オブジェクト設計では、焦点が処理ではなくオブジェクトに
  なりますから、ある処理(メソッド)の共通部分を独立させるというよりも、その中で他の
  オブジェクトのデータの処理に関わる部分を他のオブジェクトに委託するという形になります。
  (厳格なオブジェクト指向の考え方では、オブジェクトから他のオブジェクトに送られる
  メッセージと、メッセージを送られたオブジェクトが実際に処理するメソッドを区別しますが、
  最初はそこまで意識する必要はないかもしれません。)
  [メッセージ・アクター理論]

あまり分かりやすい説明になってないですね。[]内に関連するキーワードを挙げておきましたから、
参考にして下さい。

オブジェクト指向設計の特徴は以下の通りです。

(1) データとその処理方法(メソッド)をひとまとまりのものとして扱います。データは原則として
  直接外部からアクセスされるのではなく、必ずメソッドを使って処理されます。
  [情報隠蔽・カプセル化・抽象データ型]
(2) 従来のやり方では、あるデータが他のデータを持っている、あるデータが他のデータに
  含まれるという関係(HasA関係)に着目して構造化を図るのが普通でしたが、オブジェクト指向設計
  では、それに加えて、あるデー...続きを読む

Qオブジェクト指向の利点とは?

汎用機でCOBOLのSEを10数年やってました。(今は自営業)
COBOLはプロセス型の言語といわれているのに対して
C言語はオブジェクト指向型の言語といわれています。

私はC言語やJAVAで開発したことはないのですが、
C言語、すなわちオブジェクト指向の利点ってなんでしょう?
JAVA、C言語はオブジェクト指向ですよね。

私はソフトウェア開発技術者の資格など持っていますのでオブジェクト指向の表面的な意味は分かります。
ですが実際、アプリ開発時・運用時にどのような利点があるのかがイマイチ分かりません。
「どっちでもいいんじゃないか」なんて思ってしまいます。
プロセス指向(VB、COBOL等)とオブジェクト指向(C言語、JAVA)の差異って何なんでしょう。

よろしくお願いします。

Aベストアンサー

当方は、単なる学部卒の人間ですので、もっとおおざっぱな回答を試みます。(ていうか、そういった事しか出来ないだけなんですが。)

>C言語はオブジェクト指向型の言語といわれています。

C言語も、VBも、COBOLも、確か、同じ「手続き型言語」の一種ですよね。で、それとは別に「非手続き型言語」が何タイプかあり、その中の一つとして、オブジェクト指向型の言語(C++やJavaやSmalltalkなど)があったものと思われます。(以上、第3世代に属する高水準言語です。)

最近も、以下のJavaカテゴリの方で、「オブジェクト指向とは何たるか?」について、回答しておきましたので(#5の所)、そちらの方も参考にされたら、と思います。

「教えて下さい☆」
http://oshiete1.goo.ne.jp/qa2864855.html

上記の過去ログ内にも書かれていますが、「オブジェクト指向の利点」の一つに、「デザインパターンを利用することが出来る」というのが挙げられます。このデザインパターンとは、手短にいえば、過去の熟練したソフト設計者の方々が、数々の試行錯誤の上に得られた、オブジェクト指向設計を行う上で定石とも言える効率的な設計手法(パターン)をまとめたものです。当初は、C++を元に作成され、一番最初に提唱した4人の方々に敬意を表して、GoFパターンとも呼ばれています。(GoFとは、Gang of Four「4人のギャング」の頭文字を取ったもの。)

現在では、この汎用的な23のデザインパターン以外にも、Javaで言えば、J2EEの技術に特化した「J2EEパターン」なるものも存在したりします。こういった事から、若手であまり設計などの経験に乏しい技術者でも、そのような便利な設計手法を利用することができ、一から過去の設計者の方々が経験した、様々な成功や失敗などの体験を繰り返すことがなくなるわけですね。(まあ、実際にはあくまでも手段であって、全部のデザインパターンを使うといったこともないですし、かなり抽象的で難しい事もあってか、逆に使用しない方がいい、といった場合もあるらしいですが。)

あとそれから、以下の書籍の15ページの所に、次のような記述があります。

「ゼロから学ぶC/C++ フリーのコンパイラで気軽に始めよう!」
(編:日経ソフトウェア編集,発行:日経BP社,2005年1月24日 第1版第1刷発行)

「(前略)いったい、オブジェクト指向プログラミングができると何がうれしいのでしょうか。端的に言えば、効率よくプログラムを開発できるようになるのです(図7)。そもそもプログラムをオブジェクトの集合体としてとらえることで、プログラムの構造がぐっと見やすくなります。2000個の変数と1000個の関数から構成した売上管理プログラムだって、わずか数十種類のクラスに整理することが可能なのです。これが開発効率を高めるのは容易に想像できるでしょう。開発時だけでなく、後からプログラムの機能を追加したり、改造を加えることも容易になります。(後略)」

この文章自体がまさに、「オブジェクト指向の利点」を言い表していますね。同じページ内にも「*19 もちろんC言語でも再利用可能なソフト部品を実現できますが、C++のクラスのほうが継承(後述)などによって、より再利用しやすい部品を作ることができます。」といった記述もあります。

最後に、現在Javaの開発においては、Strutsを始めとした「MVCフレームワーク」が主流となっていますが、これ自体もまた、実際には「MVCパターン」というデザインパターンの一種を活用したものとなっています。このことに関して、以下の過去ログでは、「それじゃあ、なぜそのような新しい技術であるフレームワークを利用するのか?」といったような質問がなされています。

「ストラッツ(Struts)って本当にいいの?」
http://oshiete1.goo.ne.jp/qa2049016.html

ここで回答された方々の内容いずれもが、まさに「オブジェクト指向の利点」となっていますね。実際に、M(Model)とV(View)とC(Controller)の3つに分けることによって、担当する部分をより明確にして、切り分けているのです。部品化による恩恵が、こういった所にも表れているわけですね。

参考URL:http://www.ascii.co.jp/books/books/detail/4-7561-4155-2.shtml

当方は、単なる学部卒の人間ですので、もっとおおざっぱな回答を試みます。(ていうか、そういった事しか出来ないだけなんですが。)

>C言語はオブジェクト指向型の言語といわれています。

C言語も、VBも、COBOLも、確か、同じ「手続き型言語」の一種ですよね。で、それとは別に「非手続き型言語」が何タイプかあり、その中の一つとして、オブジェクト指向型の言語(C++やJavaやSmalltalkなど)があったものと思われます。(以上、第3世代に属する高水準言語です。)

最近も、以下のJavaカテゴ...続きを読む

Qオブジェクト指向プログラミング学習向けのサンプルプログラム

「これは参考になるよ」というような、
オブジェクト指向プログラミング学習向けのサンプルプログラムを教えていただけませんか?
言語はDelphiです。
Delphiに限らず、他言語(Java、C#、C++あたり)でも結構です
(移植しますので、出来ればCUI、GUIが少ないものが理想です)
よろしくお願いいたします。

Delphiにてオブジェクト指向プログラミングを学んでいます。
書籍等で、基本的なことは学びました。
理解度およびスキルを上げるために、実際にプログラミングしたいと思います。
(入門書を利用してや、
自分で考えながらのテスト的なプログラミングには限界を感じてまして^^;)

Aベストアンサー

回答がついていないようなので、一応回答します。
残念ながら、そのような目的に最適なサンプルプログラムなるものには心当たりがありません。

しかしながら、そもそもオブジェクト指向プログラミングを学ぶ為に実際のプログラミングをしたいのであれば、サンプルをいくら見ても無駄だと思います。

オブジェクト指向において、一番重要なのは、ある問題を解決する為に、その問題領域をいかにオブジェクトとして表現できるようになるかです。
従って、学習用のテーマを自分で決めてというのではなく、そもそも実際に役にやつものや、作ってみたいものを決めて、それを実現する為にコーディングしてみるというのでなければ、何ら有用なものは身につかないのではないかと思います。
そして、行き詰まったときにこそ、他人の作ったプログラムというのが、初めて意味を為すのだと、私は思います。

こういう処理をする際のサンプル、こういう結果を出す為のサンプルというのであれば、多分あげてくれる人はたくさんいたのでしょうが、ここまで回答がついてないのは、そもそもオブジェクト指向を学ぶのに最適なプログラムなんていう漠然としたものが非常にあげにくいのもあるでしょう。

私は、Delphi(というよりObjectPascal)については良く知らないのですが、同じオブジェクト指向といっても、言語仕様によるできること出来ないことの差はことの他大きいです。Javaで作ったプログラムを、C++へ移植するとか、その逆とかは、不可能ではありませんが、そう簡単でもありません。
クラスとインスタンスの基本的な概念は良く似てても、Javaでは多重継承はできません。Perlのオブジェクト指向対応は、(あくまで個人的な主観では)中途半端で、わかりにくく、少なくともクラス思考の他の言語とは、共有できるノウハウが少ないような気がします。VisualBasic6も、表向きにはオブジェクト指向対応なる文言がありましたし、クラスを定義してインスタンス化できたからといって、私の中ではあれば、オブジェクト指向言語とは到底呼べないと思っています。私は普段Rubyを使ってますが、仕事ではJavaもC++も使う機会があります。場面によって言語の選択は変わりますが、選択はそれなりに慎重に行います。理由は、一度作り始めてしまったら、他言語への移植はとても大変だからです。

さて、私の知る限りPascalは手続き型言語の代表格です。
後付けのオブジェクト指向化は、言語仕様を破綻させないように実装するのが非常に難しいのは、PerlやVBを見るまでも無く明らかなんですが、どの程度の表現力があるか分からない以上(質問者さん自身、オブジェクト指向初心者である以上、その評価は無理でしょうし)、他言語のサンプルをいきなり使うのはとてもリスキーだと思います。

まずは、具体的に作りたいものを考えましょう。何かユーティリティの類でもいいし、ゲームでもいいです。そして、それを自分なりにオブジェクト指向チックに設計して、作ってみることです。そして、デザインパターンの本を一冊買ってきて、設計に詰まったら、それを読んでもう一度考えましょう。順番は前後しても問題ありませんが。一般的なデザインパターンの実装も、JavaにはJavaのC++にはC++なりのやり方があります。DelphiにはDelphiなりのやり方があるのではないでしょうか。

※個人的なお奨めは、目的がオブジェクト指向プログラミングなのであれば、一度JavaかRubyに浮気することです。お手軽さ感ではRubyの方がいいかもしれませんが。その上でDelphiに戻ってくれば、より広がった視野でDelphiという言語を見ることが出来るのではないかと思います。

回答がついていないようなので、一応回答します。
残念ながら、そのような目的に最適なサンプルプログラムなるものには心当たりがありません。

しかしながら、そもそもオブジェクト指向プログラミングを学ぶ為に実際のプログラミングをしたいのであれば、サンプルをいくら見ても無駄だと思います。

オブジェクト指向において、一番重要なのは、ある問題を解決する為に、その問題領域をいかにオブジェクトとして表現できるようになるかです。
従って、学習用のテーマを自分で決めてというのではなく、そも...続きを読む

Qオブジェクト指向、理解しやすい?

 最近、Javaの解説書や解説サイトを見ていて、しばしば、「Javaは完全なオブジェクト指向だから理解しやすい」といった記述を見かけます。(「プログラムが見やすくなる」とかではなく)
 Javaに限った話ではないのですが、個人的に、オブジェクト指向の概念は、プログラミング初心者の最大の関門ではないかと勝手に思っています。僕はPHPから入ったのですが、ある程度基本事項をマスターした後も、オブジェクト指向だけは長い間苦手としてきました。(最近やっと慣れてきたところです。)
 そこで伺いたいのですが、最初にやったプログラミング言語がオブジェクト指向だったという方、オブジェクト指向の概念は、

1.わかりやすかった
2.そこでつまずいた
3.特に意識せずに通り過ぎた
4.その他

いずれでしょうか?

※最初にJavaについて書きましたが、これはただの例なので、オブジェクト指向言語全般についての質問であるととらえてください。

Aベストアンサー

自分は最初の言語がVB6.0とJavaでした(VB6.0は業務で、Javaは個人的に)
なので、最初の言語がオブジェクト指向かどうかは微妙な所です。
(VB6.0はオブジェクト指向言語だと思ってないので)

で、オブジェクト指向の理解については、
2.そこでつまずいた
ですね。
本に書いてある内容は別に難しくも何ともないのですが、
それが何で便利なのか?構造化プログラムとどう違うか?がよく分からなかった。
(完全に独学だったのもありますが)
これを乗り越えなくてはオブジェクト指向を理解する意味ないですから。

また、オブジェクト指向自体も、オブジェクト指向プログラミングと
オブジェクト指向設計/分析とに大きく分かれると思いますが、
それを混同していたというのもありました。
※「モノと捉える」と言いながら、一方で「インターフェース」なんてものが出てくる。
インターフェースって「モノ」なのか?…とか考えてた。

ただ、分かった時はすぐでしたね。ちょっとずつ分かった、という感じではなかった。
真っ暗な部屋でドアが中々見つからなかったのに、部屋の明かりを点けたらそれまでが嘘のように分かった。
そんな感じです。
UMLで設計の勉強したのと、デザインパターンをかじりだしたのがきっかけです。
ずいぶん回り道した気がする…

オブジェクト指向は、ちゃんとした設計で作れば管理しやすく再利用性も高い技術です。
逆に言えば、設計に手を抜くとかえって扱いづらく再利用性のない無駄なコードにもなります。
そういう意味で実践で敬遠されてるのかもしれないですね。
何にしても、奥が深い技術なのでまだまだ勉強中です。

自分は最初の言語がVB6.0とJavaでした(VB6.0は業務で、Javaは個人的に)
なので、最初の言語がオブジェクト指向かどうかは微妙な所です。
(VB6.0はオブジェクト指向言語だと思ってないので)

で、オブジェクト指向の理解については、
2.そこでつまずいた
ですね。
本に書いてある内容は別に難しくも何ともないのですが、
それが何で便利なのか?構造化プログラムとどう違うか?がよく分からなかった。
(完全に独学だったのもありますが)
これを乗り越えなくてはオブジェクト指向を理解する意味ないですか...続きを読む

Qオブジェクト指向プログラミングへの架け橋

C言語で「構造化プログラミング」を独学しました。目標は科学技術計算(シミュレーションを含む)です。現在、「オブジェクト指向プログラミング」に興味があるのですが、C言語をかじった者は、「オブジェクト指向プログラミング」としまして、C++へ移行するのが自然なのでしょうか。それとも、C++にこだわらず、JAVA言語などのトレンドに移行すべきなのでしょうか。C言語を独学した者が学ぶべき「オブジェクト指向プログラミング」言語は何でしょうか。お教えください。また、「オブジェクト指向プログラミング」に適した書籍もお教え頂けると助かります。よろしくお願いします。

Aベストアンサー

オブジェクト指向自体は根本的には「一連の処理と必要な値を使いやすくまとめておく」ことなので、これからどうするかについては好きにして下さいとしか…。
当然、オブジェクト化すること自体が抽象化なので実行速度は遅くはなっています。

楽をしてアプリケーションのような物を作りたければJAVA(遅い)などのほうがいいし、
徹底的に「速い数学や計算」をやりたければ逆にFORTRANとかのほうがいいと思われます。
アプリケーションを作るには多少の苦労はあっても、いつでもどこでも誰にでも幅広く便利な物を使いたければC++です。

ちなみにオブジェクト指向ってのは曖昧な抽象概念なので、
オブジェクト指向だと思える程度の実装があり、
使用者もひねくれずにオブジェクト指向と思って扱ってる限りは、それは全部オブジェクト指向です。


どう思えばいいのかと言うと、
コンストラクタを呼んで、メソッドを使って、デストラクトする方針であれば全部オブジェクト指向です。
それだけです。具体的な仕組みは一切問われません。

そのようにしかできないように設計されてる言語などは、強制的なオブジェクト指向です。
別にそんな仕組みは、普通のCでも作れます。(ある程度動的管理の処理が必要ですが)。


オブジェクト指向と言うのは、プログラムのデザインとして人間にとって必要だから「しょうがないので」導入する物の一つであって、
その辺は好きにしてください、というのが結論です。
オブジェクトかどうかで言語を選ぶ意味はほぼないと思われます。

オブジェクト指向自体は根本的には「一連の処理と必要な値を使いやすくまとめておく」ことなので、これからどうするかについては好きにして下さいとしか…。
当然、オブジェクト化すること自体が抽象化なので実行速度は遅くはなっています。

楽をしてアプリケーションのような物を作りたければJAVA(遅い)などのほうがいいし、
徹底的に「速い数学や計算」をやりたければ逆にFORTRANとかのほうがいいと思われます。
アプリケーションを作るには多少の苦労はあっても、いつでもどこでも誰にでも幅広く便利な物を使い...続きを読む


人気Q&Aランキング

おすすめ情報