質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

6回答

39649閲覧

「汎化」とはどういう意味ですか?

mr0237

総合スコア164

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

2クリップ

投稿2017/04/03 08:58

JAVAのオブジェクト指向を勉強・練習している者です。エンジニアとは関係ないような(国語関係?)質問をしてすいませんが、「スッキリわかるJava入門 第2版 (スッキリシリーズ) 」の(P437の)「汎化・特化の関係」にて  
汎化」と「特化」っていう言葉が出てくるのですが、「特化」っていう言葉はわかるのですが、
汎化」という言葉がどうもしっくりこないんですよね。

汎化」というのをIT用語辞典で調べてみると

汎化とは、様々な異なる対象に共通する性質や、共通して適用できる法則などを見出すこと。一般化、普遍化ともいう。

ということですがどうもしっくりこないんですよね。わかりやすく言うと、どういうことでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2017/04/03 09:11

その説明で、十分わかりやすいと思いますが、どのあたりがしっくりきませんか?
mr0237

2017/04/04 02:05

私の考えでは汎化というのは「目的に応じて多種多様に対応できること」という考えですが、多種多様に対応できるはずなのになぜ「共通性」が出てくるのがしっくりと来ないんですよね。もしかして私の勘違いでしょうか?
guest

回答6

0

IT用語辞典の内容は間違ってないので、具体例で説明したいと思います。

例えば、このteratailのようのQ&Aサイトを開発するとした場合、
登場人物として「質問者」「回答者」そしてサイトの「管理者」がいるのは明らかだと思います。

つぎに、それぞれの登場人物が、当該サイトでどんな情報を持ち、当該サイトに対してどんなことができるのか想像してみてください。
かなり省略させていただきますが、ざっくり以下のイメージになると思います。

イメージ説明

ここで、IT用語辞典でお調べになった以下の内容を思い出してください、

汎化とは、様々な異なる対象に共通する性質や、共通して適用できる法則などを見出すこと。

一旦「質問者」「回答者」にフォーカスして、辞典の通り整理してみてください。
以下のようなイメージになりませんか?

イメージ説明

これが汎化です。
さらに「管理者」と「会員」を「ユーザー」として汎化することもできますね。

実践を積んでいくと「汎化」や「特化」は無意識に行うようになってくると思います。

かなり極端な例で説明してきましたが、初学の頃はこの程度の理解で十分だと思いますので、あまり難しく考えないほうが良いですよ!

投稿2017/04/03 16:41

編集2017/04/03 16:48
xenbeat

総合スコア4258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「スマホに特化したサイト」=スマホで見ることを主目的として構築されたサイト
「メモに特化したデバイス」=ほかの色々な機能を捨てて書くことだけを追求した機器

「特化」というのは汎用性を捨ててある目的のために特別にチューニングされたもののことです。「般化」はその逆で、汎用できるもののことです。

###オブジェクトの場合

クラス A を継承したクラス B は、A の守備範囲の中から、ある特定の目的にそぐうように設計されています。例えば、Object を継承した String は、文字列の扱いに特化しています。

ですから、Object は String を般化したもの、String は Object を特化したものと言い表します。

投稿2017/04/03 09:31

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問内容で登場する言葉の中では、「一般」という言葉でイメージするのが最も理解しやすいかもしれませんね。

日常的に、「一般的な人」という表現をしますよね。
一方で、「特化した人」というような表現も使います。
両者がどんなイメージなのか思い浮かべていただくと、「一般的な人」のイメージはいわゆる普通の人です。
ここで「普通の人」とはどういうことなのかということを考えてみますと、「通常人間ができることができて、通常人間ができないことができない人」ということができます。

人間には色々な能力がありますが、例えば立つことや座ること、歩くこと、話すことなどは通常人間に備わった力です。
一方で、私たちのようにIT関連の知識を持った人々は「プログラマー」や「エンジニア」と言われます。それは「通常人間が持っていないIT関連の知識を持っている人」として認識されているからです。これが「特化した人」ですね。
同様に「プロ野球選手」や「建築士」「医者」なども「特化した人」ということになります。

しかしながら、「建築士」だろうが「プログラマー」だろうが「人間」なので、「一般的な人」が持つ「立つことや座ること、歩くこと、話すこと」は通常可能です。
関係としては、「一般的な人」→【特化】→「特化した人」、「特化した人」→【汎化】→「一般的な人」という関係が成り立ちます。

ここでプログラムの話に戻ります。
上記のような人間を例にしますと「何を当たり前のことを」「それが何に役に立つの?」と思われるかもしれませんが、プログラムの世界では要件として与えられた世界が常に分析しやすいものとは限りません。

「商品AとBとCを扱うシステムを作ってくれ」と言われたとします。
設計時に、なんとか楽にシステムを構築するために、「商品AとBとCの、この部分は共通化できる」として共通化してプログラムすることがあります。つまり、作る対象の共通部分を洗い出して、別の共通部品として作成し、個別に作るということをやめるということです。
オブジェクト指向の話ですので、「共通部品」という表現よりは「スーパークラス」等という表現のほうが良いかと思いますが、上記のような考え方は開発効率、その後の保守効率を考えても非常に重要で、どのような開発現場でも一般に用いられているものです。

この「共通化」ということを、「共通部分を見出して、それを別に作る」という意味で、オブジェクト指向的には「汎化」と表現しているのです。

投稿2017/04/03 09:24

編集2017/04/03 14:07
akabee

総合スコア1947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mr0237

2017/04/04 01:42

ひたすらぐぐって、サイトを見てみてもわからなかったから、投稿したんですよ!
jm1156

2017/04/04 01:46

それでは、ぐぐったサイトと、その内容、そしてそのサイトのどこが具体的にわからなかったのか?などをもう少し書いていただけると回答がしやすいです。 「しっくりこない」とありますが、なにがどう「しっくりこない」のかが、こちらにわからなかったので。
guest

0

ベストアンサー

私の考えでは汎化というのは「目的に応じて多種多様に対応できること」という考えですが、多種多様に対応できるはずなのになぜ「共通性」が出てくるのがしっくりと来ないんですよね。もしかして私の勘違いでしょうか?

そうですね。「目的に応じて多種多様に対応できること」が間違っています。
それはどちらかというと特化の方。
人間にも、車にも、野菜ににも、それぞれ共通と個別の性質がありますが、共通性を見いだす事が汎化で、共通していない個別の性質について考える事が特化。

投稿2017/04/04 03:41

otn

総合スコア84285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

んー……
車両:汎化
乗用車、バス、トラック、ダンプカー、重機 etc…:特化
と書いても、正しいのだけどあまりしっくりきませんねえ。

個々に機能が違う(乗用車とトラックは果たすべき役割が明確に違いますね)のだけど、大きなくくりで見るとどちらも車両なわけです。ですから、車両という汎用的な「概念」に包括される、と。

Java の標準ライブラリでいえば、入出力(java.io)が一番分かりやすいですかね。
InputStream, OutputStream が「汎化」で、個々の入出力に合わせた
FileInputStream, BufferedOutputStream なんかが「特化」なわけです。

設計する場合は InputStream/OutputStreamの考え方を念頭におき(車両ではあれば基本的にアクセルとブレーキとハンドルはみな共通化された機能を持っていますよね?)、実際に操作するのは各々に特化したクラスを使う。でも使い方は同じ(アクセルとブレーキとハンドルで動かす)だから、戸惑うことは少ないわけです。(免許を持っているかどうかはまた別の話)

投稿2017/04/03 09:20

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問