関連記事 ⇒ さくらのマネージドサーバに変更することに

4月 102011
 



[note]
Javaのクラスの呼ぶ、呼ばれるをCOBOLのサブルーチン、子サブ、SUBの感覚と似てると思ったのが悩むのを増やしたのかもしれません。似てるところと違うところが解れば馴染めるはずなんですけど。
[/note]

そうですね、

・サブルーチンは、例えば、数学の試験のときに、計算する為に横で、計算用紙をもらってちょこちょこ計算する様な感じです、その計算結果をテストの答案用紙に書いてしまえばそれ以上計算用紙は必要ない感じかな。(サブルーチンを使い回しする事もありますが、簡単に言えば、ちょっと計算した結果を返してもらう感じです)

・クラスはもっと大きい単位です。どちらかというとプログラムのまとまった塊です、先ほどの数学の試験でいうと、テストを受けている人間と言えるかもしれません。このたとえばテストを受けている人間Aさんが、子供Bを生んで、その知識やスキル、遺伝子を伝えたり、勉強を教えたりして、子供Bも似たような処理をできる様に育てるというか、継承させる事がクラスでできる事です。サブルーチンは単なる一時的に派遣されてくるパートタイムのお手伝いさんのようなもので、伝えた事しか、やってくれないのですが、クラスの場合は、自分と同じ能力を持って、同じように考えてやってくれるといった感じでしょうか。





[note]

参考 サブルーチン
サブルーチン(英: subroutine)は、コンピュータプログラミングにおいて、プログラム中で意味や内容がまとまっている作業をひとつの手続きとしたものである。ソースコード上ではコードブロックを形作る。繰り返し利用されるルーチン作業をモジュールとしてまとめたもので、呼び出す側の「主」となるもの(メインルーチン)と対比して「サブルーチン」と呼ばれる。サブプログラム (subprogram) とも呼ぶ。
プログラムのソース中で、繰り返し現れる作業をサブルーチン化することで、可読性や保守性を高く保つことができる。繰り返し現れる作業でなくても、意味的なまとまりを示すためにサブルーチン化することもある。また、キャッシュのような階層的メモリの設計を持つコンピュータ(現在のパソコンやワークステーションなどほぼすべて)では、よく使われるサブルーチンがキャッシュに格納されることで高速な動作を期待できる。


呼称

サブルーチンを、結果として値を返すものと処理だけを行い値を返さないものに分類することがある。その場合、前者を関数(かんすう)、後者を手続き(てつづき)と呼んで区別する。プログラミング言語の仕様としてCのようにどちらかの呼び方のみを採るものと、Pascal のように両者を区別するものがある。


関数
関数 (function) が返す値は戻り値(もどりち)または返り値(かえりち)と呼ばれる。function が関数と訳されるのは、単に機能の実装を行うだけでなく、引数としてとりうる値の集合から、戻り値としてとりうる値の集合への写像のように捉えることができるためである。したがって、ほとんどの命令型プログラミング言語では次の点において数学の関数とは異なる。
引数が同じでも状況に応じて戻り値が異なる(状態を持つ)
関数の処理の実行によってシステムに変化が発生する(副作用を持つ)
戻り値が存在しない場合がある
ただし、純粋な関数型言語における関数は、状態や副作用などをもたず、数学の関数に近い性質を持つ。

[/note]


サブルーチンには2つほど種類があって、その一つが、「戻り値」というか、計算して結果を持ってくる為にあるのが、サブルーチンって感じのようですね。

つまり一つ一つのサブルーチンは、元のプログラムとの関連性はあるかもしれないけど、プログラムとしての「類似性」はないって感じだと思います。

たとえると、サブルーチンは元のプログラム(主プログラム)に対して
血はツナがった子供たちとかじゃないってかんじかな。
遺伝的に類似性がないというか。

ちゃんとサブルーチンとして戻り値を返してくれるけれど、別に主プログラム
との類似性はないって感じだと思います。

あくまで計算方法の一つとして、サブルーチンを使うこともありますって程度だとおもいます。


これに対してクラスの場合は、継承されたクラスは、遺伝的にも似ている子供といった感じでしょうかね。

クラスについては一般的に、JAVAでもc言語でも以下のように定義されているようです。
[note]
クラス
クラス(class)は、クラスベースのオブジェクト指向においてオブジェクトの設計図にあたるもの。抽象データ型の一つ。クラスから生成したオブジェクトのことをインスタンスという。
クラスには、インスタンスの保持するデータ(メンバ変数、フィールド(UMLでは「属性」ともいう))と操作(メソッド、メンバ関数)が記述される。アクセス範囲(public、private、protectedなど)や可変かどうか(final、 constantなど)等についても記述されている。
クラスは、継承・ポリモーフィズム・カプセル化などの、オブジェクト指向プログラミングにおける重要な概念を実現する強力な手段である。

1 カプセル化 (encapsulation)
2 継承 (inheritance、extension、generalization)
3 ポリモーフィズム (polymorphism)
4 関連項目
カプセル化 (encapsulation)

カプセル化
通常クラスには、インスタンスが持つデータと、そのインスタンスに対して行える操作が定義される。これらのデータや操作をばらばらに扱うのではなく、一つのクラスという単位に集約することで、データと操作の関連やインスタンスが持つ役割を明確にし、整理することができる。これをカプセル化という。
クラスを言語の機能として有するプログラミング言語の多くでは、クラスに定義されたデータ(フィールド)や操作(メソッド)に対してアクセス権を指定することで、クラスの外から直接扱えるフィールドやメソッドを制限することができる。これにより、クラスの外から不用意にフィールドの値が変更されたり不適切なメソッドが実行されたりしてしまうのを防ぐことができる。また、アクセスが制限されたフィールドやメソッドはクラスの外から見れば無いに等しいので、これらのフィールドやメソッドを修正してもクラスの外の部分には影響を与えずに済む。これを情報隠蔽という。
多くのプログラミング言語ではフィールドやメソッドの定義とアクセス権の指定は同時になされるため、カプセル化と情報隠蔽はしばしば混同される。
継承 (inheritance、extension、generalization)

継承
あるクラスを基にして別のクラスをつくることを継承という。 継承は拡張ともいうことがあり、UMLでは汎化 (generalization) と呼んでいる。 継承の基になったクラスを親クラス・基本クラス・スーパークラス等といい、継承してできたクラスを子クラス・派生クラス・サブクラス等という。
複数のクラスを基にしてクラスを継承することを多重継承という。多重継承は、二つのクラスの同名メソッドのオーバーライドによるコンフリクトを始めとするいくつかの問題点が指摘されており、Java、C#、D言語等では実装多重継承はサポートされておらず、インタフェース多重継承のみサポートされている。
また、オブジェクト指向を効率よく使いこなすためには継承だけでなく集約 (aggregation)、委譲 (delegation) を理解する必要がある。


ポリモーフィズム (polymorphism)
継承する際に、親クラスの関数を子クラスの関数で置き換えることをオーバーライドという。オーバーライドをうまく使うと、オブジェクトによって、実質的に実行される関数が変わるようにできる。このようにして、見かけが一緒なのに動作が違うようにできることをポリモーフィズム(ポリモルフィズム)・多様性・多態性などという。




[/note]

クラスっていうのは、例えばコカコーラの自動販売機だとおもったらいいと思います。

その機能を使って、駅の券売機を作れないかなあとか、カロリーメイトの自動販売機を作れないかなって考えたときに、コカコーラの自動販売機が持っている機能を継承して、流用しましょうってことだと思います。


クラスのプログラムの中にはサブルーチンを使ったものもあるでしょうが、考え方のもっと大きい単位でクラスの場合は使っているのだと思います。


クラス > … >… > … > … > サブルーチンというイメージです。


[note]
>Javaのクラスの呼ぶ、呼ばれる

javaのクラスの呼ぶ呼ばれるは、「ちょっと駅券売機作るから、コカコーラのj自動販売機さん(の設計者やプログラマーさん)手伝ってください」、って感じだと思います。特徴とか、性質とかを、真似して、駅券売機にも継承させてくださいってことだと思います。
[/note]

参考 ウィキペディア


Sorry, the comment form is closed at this time.

関連記事はこちら

関連記事はこちら

■関連記事 ⇒ さくらのマネージドサーバに変更することに






じゃらん Web サービス Supported by 楽天ウェブサービス