JAVAのオブジェクト指向を勉強・練習している者です。エンジニアとは関係ないような(国語関係?)質問をしてすいませんが、「スッキリわかるJava入門 第2版 (スッキリシリーズ) 」の(P437の)「汎化・特化の関係」にて
「汎化」と「特化」っていう言葉が出てくるのですが、「特化」っていう言葉はわかるのですが、
「汎化」という言葉がどうもしっくりこないんですよね。
「汎化」というのをIT用語辞典で調べてみると
汎化とは、様々な異なる対象に共通する性質や、共通して適用できる法則などを見出すこと。一般化、普遍化ともいう。
ということですがどうもしっくりこないんですよね。わかりやすく言うと、どういうことでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/04 02:05
回答6件
0
IT用語辞典の内容は間違ってないので、具体例で説明したいと思います。
例えば、このteratailのようのQ&Aサイトを開発するとした場合、
登場人物として「質問者」「回答者」そしてサイトの「管理者」がいるのは明らかだと思います。
つぎに、それぞれの登場人物が、当該サイトでどんな情報を持ち、当該サイトに対してどんなことができるのか想像してみてください。
かなり省略させていただきますが、ざっくり以下のイメージになると思います。
ここで、IT用語辞典でお調べになった以下の内容を思い出してください、
汎化とは、様々な異なる対象に共通する性質や、共通して適用できる法則などを見出すこと。
一旦「質問者」「回答者」にフォーカスして、辞典の通り整理してみてください。
以下のようなイメージになりませんか?
これが汎化です。
さらに「管理者」と「会員」を「ユーザー」として汎化することもできますね。
実践を積んでいくと「汎化」や「特化」は無意識に行うようになってくると思います。
かなり極端な例で説明してきましたが、初学の頃はこの程度の理解で十分だと思いますので、あまり難しく考えないほうが良いですよ!
投稿2017/04/03 16:41
編集2017/04/03 16:48総合スコア4258
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「スマホに特化したサイト」=スマホで見ることを主目的として構築されたサイト
「メモに特化したデバイス」=ほかの色々な機能を捨てて書くことだけを追求した機器
「特化」というのは汎用性を捨ててある目的のために特別にチューニングされたもののことです。「般化」はその逆で、汎用できるもののことです。
###オブジェクトの場合
クラス A を継承したクラス B は、A の守備範囲の中から、ある特定の目的にそぐうように設計されています。例えば、Object を継承した String は、文字列の扱いに特化しています。
ですから、Object は String を般化したもの、String は Object を特化したものと言い表します。
投稿2017/04/03 09:31
総合スコア28662
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
質問内容で登場する言葉の中では、「一般」という言葉でイメージするのが最も理解しやすいかもしれませんね。
日常的に、「一般的な人」という表現をしますよね。
一方で、「特化した人」というような表現も使います。
両者がどんなイメージなのか思い浮かべていただくと、「一般的な人」のイメージはいわゆる普通の人です。
ここで「普通の人」とはどういうことなのかということを考えてみますと、「通常人間ができることができて、通常人間ができないことができない人」ということができます。
人間には色々な能力がありますが、例えば立つことや座ること、歩くこと、話すことなどは通常人間に備わった力です。
一方で、私たちのようにIT関連の知識を持った人々は「プログラマー」や「エンジニア」と言われます。それは「通常人間が持っていないIT関連の知識を持っている人」として認識されているからです。これが「特化した人」ですね。
同様に「プロ野球選手」や「建築士」「医者」なども「特化した人」ということになります。
しかしながら、「建築士」だろうが「プログラマー」だろうが「人間」なので、「一般的な人」が持つ「立つことや座ること、歩くこと、話すこと」は通常可能です。
関係としては、「一般的な人」→【特化】→「特化した人」、「特化した人」→【汎化】→「一般的な人」という関係が成り立ちます。
ここでプログラムの話に戻ります。
上記のような人間を例にしますと「何を当たり前のことを」「それが何に役に立つの?」と思われるかもしれませんが、プログラムの世界では要件として与えられた世界が常に分析しやすいものとは限りません。
「商品AとBとCを扱うシステムを作ってくれ」と言われたとします。
設計時に、なんとか楽にシステムを構築するために、「商品AとBとCの、この部分は共通化できる」として共通化してプログラムすることがあります。つまり、作る対象の共通部分を洗い出して、別の共通部品として作成し、個別に作るということをやめるということです。
オブジェクト指向の話ですので、「共通部品」という表現よりは「スーパークラス」等という表現のほうが良いかと思いますが、上記のような考え方は開発効率、その後の保守効率を考えても非常に重要で、どのような開発現場でも一般に用いられているものです。
この「共通化」ということを、「共通部分を見出して、それを別に作る」という意味で、オブジェクト指向的には「汎化」と表現しているのです。
投稿2017/04/03 09:24
編集2017/04/03 14:07総合スコア1947
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
投稿2017/04/03 09:18
総合スコア866
0
ベストアンサー
私の考えでは汎化というのは「目的に応じて多種多様に対応できること」という考えですが、多種多様に対応できるはずなのになぜ「共通性」が出てくるのがしっくりと来ないんですよね。もしかして私の勘違いでしょうか?
そうですね。「目的に応じて多種多様に対応できること」が間違っています。
それはどちらかというと特化の方。
人間にも、車にも、野菜ににも、それぞれ共通と個別の性質がありますが、共通性を見いだす事が汎化で、共通していない個別の性質について考える事が特化。
投稿2017/04/04 03:41
総合スコア85766
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
んー……
車両:汎化
乗用車、バス、トラック、ダンプカー、重機 etc…:特化
と書いても、正しいのだけどあまりしっくりきませんねえ。
個々に機能が違う(乗用車とトラックは果たすべき役割が明確に違いますね)のだけど、大きなくくりで見るとどちらも車両なわけです。ですから、車両という汎用的な「概念」に包括される、と。
Java の標準ライブラリでいえば、入出力(java.io)が一番分かりやすいですかね。
InputStream, OutputStream が「汎化」で、個々の入出力に合わせた
FileInputStream, BufferedOutputStream なんかが「特化」なわけです。
設計する場合は InputStream/OutputStreamの考え方を念頭におき(車両ではあれば基本的にアクセルとブレーキとハンドルはみな共通化された機能を持っていますよね?)、実際に操作するのは各々に特化したクラスを使う。でも使い方は同じ(アクセルとブレーキとハンドルで動かす)だから、戸惑うことは少ないわけです。(免許を持っているかどうかはまた別の話)
投稿2017/04/03 09:20
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。