「ポリモーフィズム」を含む日記 RSS

はてなキーワード: ポリモーフィズムとは

2020-05-27

オブジェクト指向が分からないあなたへ

どうも、都内の某企業に勤めるフルスタックエンジニアです。この記事では、ITの非専門家に向けて、オブジェクト指向解説をしたいと思います

小学生プログラミング教育が開始されたり、AIIoTなどの技術が身近になった今日オブジェクト指向理解しておくことは極めて重要です。なぜならば、オブジェクト指向ITエンジニアとっての「共通言語」であって、今やあらゆるソフトウェア技術オブジェクト指向の上に成り立っているからです。したがって、オブジェクト指向理解すれば、ITのすべての分野の基礎が身についたことになります。難しい概念がいくつか出てきますが、分かりやす解説するので頑張ってついてきて下さい!

オブジェクト指向とは

まず、オブジェクト指向とは何かを解説します。オブジェクト(object)とは、「モノ」のことです。言い換えれば「モノ指向」です。つまりコンピュータのようなバーチャル対象ではなく、現実のモノをモデルプログラミングしようというのが、オブジェクト指向定義です。この考えは、今流行りのIoT(Internet of Things = モノのインターネット)にも取り入れられ、爆発的に影響力を増しています

モノという考え方は、18世紀哲学者カントに遡りますカント純粋理性批判において、理性と経験によって認識できる以前の「物自体」という概念提唱し、大陸合理主義イギリス経験主義を統一しました。オブジェクト指向におけるモノとは、カントのいう物自体です。したがって、オブジェクト指向世界の真理を記述できます。そのため、コンピュータというバーチャル世界を超えて、IoTを作ることが可能になります

現代プログラミング言語オブジェクト指向サポートする最も代表的言語Javaです。これに対して、CやC++といった旧来の言語関数型言語といい、現在では顧みられることはありません。また、JavaMicrosoftであるC#や、Javaに組み込んで使うマクロ言語であるJavaScriptなどもオブジェクト指向言語であり、プロエンジニアは好んでよく使います。一方、学生向けの教育用言であるPythonRubyなども、一応オブジェクト指向サポートしています。これらはプログラミング入門には適していますが、実務で使われることはありません。

オブジェクト指向の三要素

オブジェクト指向で最も重要な要素は

の3つです。これらを駆使することで、食卓から宇宙までを豊かにするIoTを作ることが可能になるのです。一つ一つ解説していきます

カプセル化

カプセル化とは、実装利用者から見えなくすることです。

たとえば、ソフトウェア脆弱性があったとしても、カプセル化をしていれば、利用者からはその脆弱性は無いように見えます。したがって、オブジェクト指向で作られたソフトウェアには、セキュリティ上の問題存在しません。

また、IoTを用いていない従来の家電製品などは、ボタンがたくさんあったりして操作がとても複雑です。カプセル化を応用すると、この操作を全く包み隠してしまっても、機械が使えるようになりますiPhoneスマートスピーカータッチパネルや声認識などで操作できるのは、カプセル化のおかげです。逆に、ガラケーボタンがたくさんある家電製品などは、オブジェクト指向(=IoT)で作られていません。

継承

継承とは、あるオブジェクト性質を別のオブジェクトが引き継ぐことです。

たとえば、人間は「歩く」「喋る」などの動作を行え、鳥は「飛ぶ」「鳴く」などの動作が行えますオブジェクト指向世界では、鳥を継承することで、人間が飛んだり、鳴いたりすることができるようになります。これを応用したのが、VRVirtual Reality=仮想現実)です。

また、iPhone携帯電話であるにも関わらず、ツイッターをみたり、アマゾンで買い物ができたりするのもオブジェクト指向のおかげです。つまりiPhoneツイッターアマゾン継承しているのです。それだけではなく、iPhone時計や財布、メモ帳など、現実世界の多くのもの継承しています

ちょっと抽象的になりますが、この考えを突き詰めると、次のような応用が生まれます。将来必要となるすべての機能実装したオブジェクトを一度作っておけば、後続の開発者はそれを継承するだけで、新規の開発なしに新機能を追加することができます。このような性質を「再利用性」といい、ソフトウェア開発では極めて重要な考え方となります継承はこの再利用性をもたらすために、ソフトウェア開発のスピードを爆発的に加速させ、現代ITの発展の原動力となりました。

ポリモーフィズム

ポリモーフィズムは、日本語では「多態性」と言います多態性とは、読んで字のごとく、多くの状態を持つということです。

オブジェクト指向では、多くの状態を持つことができます。一方、C言語などの関数型言語状態を持つことができません。関数型言語では、プログラムを関数(つまり入力と出力をもつブラックボックス)の合成として記述します。関数は、中学校数学で学んだように、入力に対して出力が一意に定まるので、状態を持つことができないのです。この制約を「参照透過性」と言います

オブジェクト指向では、参照透過性の制約がないため、プログラマは自由コードを書くことができ、関数型言語と比べて遥かに生産的です。また、上に述べたように状態を持てるということは、プログラムの入力に対する出力を無数に持てるということです。この応用がAI(Artificial Intelligence=人工知能)です。AIが、まるで人間が考えたかのように答えを出すことができるのは、ポリモーフィズムにより無数の出力を得ることができるからなのです。

おわりに

全体的に難解な記事となってしまいましたが

部分的にでも理解すればIT世界を見る目が変わるはずです。

うさんくさい情報に惑わされずに、このような本物の知識を身につけ

そして、皆さんにはIT未来を見通せる人材になっていただければと思います

2020-05-15

C言語オブジェクト指向ポリモーフィズム的なことをやりたいときに、関数ポインタを用意しておいて、条件によって代入する関数を変えるとか、あるんじゃないの?

2019-04-28

私がどのようにして一流(?)エンジニアになったか

13歳 はじめてのパソコン (そこそこキーボードが打てた)

16歳 はじめてのエロサイト このときPC壁紙金髪お姉さんのオ○ンコ画像になって戻せなくなり、情報セキュリティに興味をもつ

16歳 はじめてのCプログラミング 学割VC++を買うがまったくわから挫折

16歳 はじめてのVBプログラミング 学割VBを買い、メモ帳をつくったところで、それ以上のことができなくなり飽きた

18歳 HSPという言語を知り、ゲームをつくったり、エロ画像EXEバイナリに含めて隠したりした

20歳 Javaを触っているうちにポリモーフィズム概念がわかってきた、ここからプログラミングが急速に伸びた

21歳 IE6があまりにもアレなので、Javaタブブラウザを作り、エロサイト巡りをはかどらせる

21歳 適当就職した Linux教に改宗する

24なんやかんやで Java, PHP, C++, Python, VB6, VB.NET, C#, Oracle, MySQL, PosgreSQLを覚える (このあたりでOracle Silver,応用情報をとる)

〜26歳 このあたりで情報セキュリティSPを取る

28AWS教に改宗する

〜30歳 なんやかんやで Go, Obj-C, Swiftを覚える 機械学習に興味を持つ

31エロ画像収集AIが完成したが、風俗にはまったため活用されず

32歳 Reactで爆速エロサイトをつくったところ、なぜか東南アジアで人気になる。AWS教では月間1200万PVを月4000円でさばける。

その後適当起業し、適当に過ごす。ビットコインブームであまったGPUを使いエロ画像収集機が賢くなる。

2018-11-18

レトリックポリモーフィズム

関係性について誰か語ってくれ

http://www.kawauso.co.jp/OOHanyuda

ぐぐったらでてきた

やっぱ同じこと考える人はいるんだな

2018-05-04

ポリモーフィズムが綺麗に決まった瞬間

すげえ気持ちいいんだろーなーと思う

2018-04-03

ポリモーフィズムってキマるとめちゃくちゃ気持ちいい

んだろうなと想像している

2017-09-14

引数が可変のメソッドを作りたい

引数がA,B,C,D,Eあるとして

A,Bだけ渡したら、内部でC,D,Eを自動的解釈するメソッドが作りたかった

 

これ、例えば

func hogeAll(A a, B b, C c, D d, E e) {

 全部入りメソッド

}

func hoge(A a, B b) {

 ここでhogeAllを呼べば解決する

}

 

んだけど、ABCDE全てに対して有/無のメソッドを全て定義すると果てしなくなる

これをスッキリ書ける言語ってのを知らない

 

方法があるとしたら引数Classを作ってしまう手がある

実際にこれはよくやられると思う

 

HikisuClass hikisu = HikisuClass.create(a,b)  // これで内部で自動的にc,d,eを解釈する

 

でもメソッド一個のためにクラスを作るのってクソ面倒だなと思う

もう一個方法があるとしたら、Classに値を入力したあとメソッドを実行する方法

 

Hoge hoge = new Hoge()

hoge.a = a

hoge.b = b

hoge.do()

 

しかしこれも長くなり煩雑だ、結局

hoge(a,b,null,null,null) みたいなことになりそう

 

ちなみに何でそういうことをしたいかと言えば、自然言語がそうなってるから

大抵の引数が省略されるし、省略されたりされなかったりする、非常に柔軟なんだ

もちろん受ける側の作り込みが大変になるが、ちゃんとリーダブルに作ろうとしたらそっちのほうが良いんじゃないかと思える

引数のoptional,require指定できればもっと良い

例えばコンソールで使うオプションとかって自由だよなあ

 

これってポリモーフィズムあたりの話か?

 

___

 

追記:

あ、DIコンテナみたいな話かな

でも結局煩雑だし使いたくない

2017-04-24

ポリモーフィズムってなんだよパヒィームか。横文字ばっかり使って気取ってんじゃねえぞ

2015-09-20

オブジェクト指向肯定的に扱われない理由を考えた。

システム定義する場合、そのシステム「どのような機能」を持つかと、その機能を「どのように実現する」か。という二つに分かれる。

前者は、アプリケーションドメインと呼び、後者ソリューションドメインと呼ぶ。

抽象化された論理的設計アプリケーションドメインに含まれソリューションドメイン言語環境適応させた実体になる。

少し前、システムソリューションドメインのみを実現したモノとして扱われ、そこにオブジェクト指向を組み合わせることが多かった。

ただ似ているという理由で、継承が行われることが多発した。「オブジェクト指向がそのまま、ごちゃまぜになって散り散りに流出した。」

というか、そもそもアプリケーションドメインって考えが無かった。それが設計書との乖離を産みスパゲッティコードが増えた。

オブジェクト指向最初に学ぶ継承が、ポリモーフィズム多様性)を実現するための1つの特性しかないのに

継承のためにオブジェクト指向を使っても良い」という誤った考えが、勘違いの原因だろう。

この問題は、最近では結構認知されてるのだが、実際の現場では、打開策を模索中な場合が多い。

近年のアプローチは、システム上でもアプリケーションドメイン表現されるべきという考えである

打開策としては、このアプローチによる実績を増やしていくこと。

まずは、なぜ継承が負とされたかを考えてみた。

2013-04-08

「ごめんください」

「何や今時分、おお、お前か。まあ上がり」

「どっちの足から上がりましょ」

「お前と掛け合いで落語やる気はない。早よ、上がれ」

「へへへ。ほな失礼します」

「失礼は毎度のことやんけ」

「何です」

「いやいや。ほんで何やねん」

「実はね、ぼく今の仕事辞めよか思てますねん」

「ほおん、なるほど。で、その心は」

別に謎かけやないんですが、まあ、しんどいちうことと、ええ歳していつまでもこんな仕事してたらあかんなあと思いまして」

せやなあ、今年は蟹の水揚げが不調やしな」

「いったい何なんですか、ぼくの職業は。多喜二ですか」

「軽い冗談や」

「まあ、ほんまにそれくらい厳しい労働条件ですけどね。いっそアカになったろか思いますよ」

「ほな、俺、公安ね」

「なんで今からごっこ遊びせなあきませんねん」

「せやから軽い冗談や、言うてるやろ。で、辞めてどうするねん」

コンピュータ関係仕事にでも就こかなあ、と」

「何やて」

「いや、せやからコンピュータ関係

コンピュータて、お前、コンピュータで何ができるねん」

「ほら、ぼく、ワードやエクセル使うの得意ですやん」

「ワード……、エクセル……」

「何ですか」

「お前、キーパンチャーにでもなるつもりか」

「何ですか、そのキーパンチャーて」

「それはやな、君」

「なんでいきなり噺家口調になるんですか」

小学校の頃、あったやろ。こう、水槽に粉入れといてやな」

シーモンキー。滅茶滅茶遠いし」

「とにかく俺が言いたいのはやな、お前ほんまにワードやらエクセルやら云々でコンピュータ関係仕事に就けると思てるんか、ちうこっちゃ」

「ああ、判りました。いつもの口癖ですね。プログラム作れん奴はコンピュータ触るな、とか、ユニックス判らん奴はネットに出てくるな、とか」

「まあ、そういうこっちゃ」

「でも、コンピュータ関係仕事には絶対にプログラムの知識が必要なんですか」

「んー、そういうこともなかろうけどな。まあでも、ソース読めへんSEとか管理者っちうのはちょっとぞっとするわなあ」

「実はね、そうやろうと思ってぼく最近プログラム勉強してますねん」

「ほほう」

「あっ、いきなり薄笑い浮かべてますやん。滅っ茶馬鹿にしてるでしょ」

「いいやあ、別にい。で、何勉強してるねん」

「C言語です」

「くくく」

「あっ。腹立つ、このおっさん

「くくく。まあ、しっかり頑張りたまえよ」

「何か悔しいなあ」

「で、どないして勉強してるねん」

「へへへ。ちゃんと例のやつ買ったんですよ」

「例のやつて何やねん」

「いつも言うてはるやないですか。バイブルやて。R&Bですよ、R&B

R&B

「そうです」

せやなあ、レイ・チャールズはええよなあ」

「何ですか。……あっ、R&Bちゃいます。ええと、ええと」

「K&Rやろが」

「そうそう。そうとも言う」

「そうとしか言わんちうねん」

「とにかくそれで勉強してますねん」

「今どれくらいまで進んでるねん」

「ええとね。摂氏温度と華氏温度の変換のやつです」

「それ、滅茶苦茶初めのほうやんけ」

「これからですよ、これから

大丈夫かいな」

「それに、ぼく、パールは使えますし」

「はあ。パールて、あのパールか、ラリー・ウォールの」

「そんな人知りませんけど、とにかくパールです」

「お前、パール書けたっけ」

「ばりばりですよ。たとえばうちのサイト掲示板ですけど」

「えっ。あれって自作やったんか」

「ちゃいますけど、ちゃあんとタイトル書き換えて使ってますやん」

「……」

「頭抱えてどないしはったんですか」

「お前、コンピュータ関係仕事に就きたいんやったよな」

「そうです」

「お前な、何かをものすごく誤解してるか、世間ものすごく舐めてるかのどっちかやな」

「えへへ。そうかな」

あかんわ。褒められたと思とる」

「C言語覚えたら次はシーインクリメントですわ」

なんやて」

「シーインクリメント」

「それって、Cプラプラのことか」

「そうです。何か変ですか」

「まあ『++』は確かにインクリメント演算子やけどな。普通はCプラプラって言うやろ」

「変ですやん、そっちの方が。大のおとなが『ぷらぷら、ぷらぷら』言うて」

「確かに宮沢章夫もそう書いてたけどな」

「ところで、C++とCは一言で言うて何がちゃうんですか」

「お前なあ、自覚ないやろけど、それはものすごく難しい質問やで。一言で、て」

「けち臭いこと言わんと教えてくださいよ」

「C++はオブジェクト指向やねん。どや一言や」

またまたあ、わざとややこしい言い方して煙に巻こうとしてるでしょ」

「むかむかむか。そしたら言うたるわい。C++ちうのはやな、要はクラス概念を実装したもんで、クラスちうのはインスタンスをうんたらかんたらで、継承オーバーライドがこーたらで、ポリモーフィズムがなんたらで、隠蔽がどーたらで、うらうらー」

「……」

「おらおらー。クラスクラスクラスー」

「……」

「はあっ。はあっ。どうや、参ったか

「うーん。何かよう判りませんわ」

「せやろ。あんまり世間様を舐めたらあかんで」

「なんか難しそうやから、C++やめて次はJavaにしますわ」

ぎゃふん

2010-08-17

プログラミングできないやつがプログラマであっても全然問題ない

ていうか当たり前。

いやもちろん問題なんだけどね。

現場にいる私にとっては同僚のスキルが低いのは当然問題なんだし私自身へぼであることは問題だけれども、そういう次元の話じゃなくて。

はてななど見てると、まるで何か、プログラミングへの情熱燃え努力を惜しまずスキル向上してる人がプログラマって職業に付くのがしかるべき姿であって、ポインタポリモーフィズムも理解できない(理解しようと努力もしない?)間抜けがプログラマになるなど言語道断であり、10000行のメソッドが作られるような悲劇はなんとしても避けなければならない、って雰囲気だけど。

いや悲劇は避けられたほうがいいけどさ、あのさ、「その仕事に熱意もないし能力もない、特になんもない人がその仕事をしてる」っていう状況は、しごく当たり前なのであって、むしろ、「自分の好きなことを仕事にして自分能力を伸ばして社会会社に貢献して自己実現しましょー」っていう思想のほうがよっぽど異常だから。

仕事にしたいような好きなことなんて、無いでしょ。ふつう、無いでしょ。

なんとなく学校出て、働かなきゃなー、って思って、なんとなく働くの。そんだけ。

で、たとえば飲食店に行ったら、いかにも接客業に向いてない感じのぼさーっとした奴が店員やってたりするでしょ。これ、普通

世の中、たとえばタンポポ刺身仕事があって、タンポポ大好きでその仕事するやつもいれば、なんとなく就職してタンポポ乗せてる奴もいる。

そんで、タンポポ乗せるのうまい奴とか下手な奴とかいる。それだけ。

もしかしたらソフトウェア開発ってのは崇高なる職業であってセミの死骸を裏返しにする仕事とは格が違うのかもしらんけどさー。

たいした変わらんって。

人間だいたいほとんどバカ。バカばっかり集まって社会ができててもなんとかなる。これ素晴らしい。

プログラミングできないけどSE、なんてねえ、まあ、とりあえずパソコンに向かって座ってて給料もらえるんだから、しめたものですよ。

あいつ全然仕事できないっていうか俺の書いた美しいコードを汚してるだけなのに、俺と同じ給料もらいやがって、ってそれ、賃労働に囚われ過ぎ。

がちがちに仕事できるやつだけ集まってる職場なんて息苦しいですよー。

そんなこんなで明日も日が昇るのだから、すーぱーはっかーにもFizzBuzz書けないあいつにも等しく感謝して、だらだら生きなさい。

2009-08-07

優秀なプログラマたまに起こる逆行(退行)現象

あれは私がまだ大学助手をしていたころだから3年ほど前のことだと思う。

私の勤めていた大学(情報系)では「プログラミング研究会」みたいなサークル活動が行われていて

プログラミング講義を受け持っていた私はそのサークルにちょくちょく顔を見せるようになっていた。

そこにはとびっきりかわいい女子学生が一人いたのだけれど、その子はゲームが大好きで

自分でもゲームが作りたい」と一念発起してゲームコンテスト作品を出品することになった。

しかし、彼女プログラミング講義(Java)を1年くらい受けているものの、

本格的なモノを作った経験がなく、ひとりでは行き詰まりをみせているようだった。

彼女はひとりでいることが多く、パソコンに向かって黙々とプログラムを書いているのをよく見かけた。

それを気にかけていた私はたま彼女ランチに誘うようになり、彼女の方もしだいに私に打ち解けてきた。

私たちはだんだんと仲良くなっていった。私は彼女キュート笑顔に魅了されていった。

ある日、彼女が私のもとにやってきて、もじもじと顔を赤らめながら上目づかいにこう言った。

先生、頼みごとがあるんですけど・・・」

「なんだい?」

メッセンジャーアドレス教えてくださいませんか?」

これから恋の話が始まるのを期待したあなたは別のページを読んだ方がいいかもしれない。

これから始まるのはプログラミングの話だ。

その日から毎日のように彼女は私にメッセンジャープログラミングの相談を投げかけてきた。

私と彼女は連日のようにプログラミングについて語り合った。

彼女は大変優秀で、私の教えるプログラミングテクニックをみるみる吸収していった。

私は彼女才能に驚き、彼女が将来優秀なプログラマになるであろうことを確信した。

しかし、ときおり彼女が優秀であるがゆえの面白い逆行現象が起こったのだった。

ケース1

ある日、私は彼女メモリ意識してプログラミングをしていないことに気づいた。

Java ではメモリ意識する場面というのは少ないが、まったく無いわけではない。

私は彼女プログラムメモリ無駄に使っているということを指摘した。

しかし、よく聞いてみると、彼女メモリハードディスクくらいの感覚しか持っていないことがわかった。

驚かないでほしい。

私の経験上、情報学部の学生の半分以上がメモリハードディスクの区別がついていない。

それを知っている私は落胆することもなく、落ち着いて彼女メモリの説明をすることができた。

彼女は私の説明を聞き「よくわかりました」と、とびきりキュート笑顔を見せた。

しかし、翌日、彼女の書いたコードを見てがく然とした。コードが次のように変更されていたのである。

	for (int i = 0; i < MAXHOGE; i++) {
		doSomething(i);
	}
	for (int i = 0; i < MAXFUGA; i++) {
		doSomething2(i);
	}

	int i;
	for (i = 0; i < MAXHOGE; i++) {
		doSomething(i);
	}
	for (i = 0; i < MAXFUGA; i++) {
		doSomething2(i);
	}

彼女はこのコードを私に見せながら、相変わらずのキュート笑顔でこう言った。

「このほうが使うメモリが少ないですよね!」

ケース2

ゲームコンテストの締め切りが近くなってきて、実際彼女はよく頑張っていたのだが、

どうしても間に合いそうになかったので、私もコード書きを手伝うことになった。

とある部分を書いていたとき、重複したコードを見つけたので Template Method パターンを使って書き直した。

Template Method パターンというのが何かというと、同じことをするコードがいくつもの場所でばらばらに書かれないように

一つのクラスにだけ書いて、それを継承して使いまわすという手法(デザインパターンの一つ)だ。

私はこの手法を彼女に教えようとは思わなかった。

なぜなら、彼女継承だとか委譲だとかポリモーフィズムとかがよくわかってないのだ。

驚かないでほしい。

私の経験上、情報学部の学生の99%が、その、ポリホーなんとかが分かってない。

私は彼女には何も言わずにこっそりコードコミットした。

しかし、彼女はそれに気づいていた。

翌日から彼女コードの書き方ががらりと変わった。

彼女はいたるところで継承を使うようになっていたのだ。

彼女は私のコード自分で解析し、新たなる発見を独力でしていた。

重複したコードがあればそれを徹底して継承で解決しようとしている。

そう、差分プログラミングだ。

差分プログラミングの正式な定義は知らないが、彼女は IS-A 関係のない継承を使ってしらみつぶしに

重複コードを書き直していた。

そのコードを見せながら、天使のような笑顔彼女はこう言った。

「こうするとコードの量が減りますよね!」

まとめ

私がこの文章で言いたいことは、知の高速道路を渡ってきた若い優秀なプログラマ

ときおり妙な退行現象を起こすということだ。

それは普通の道を通ってきた古い世代にとっては実にみょうちきりんなことに思えるかもしれない。

しかし、それは彼らなりに理由があってのことであり、馬鹿だからやってるわけではない。

彼らは優秀であるがゆえにそういったことを起こすのだ。

そして彼らは優秀であるがゆえに、自分が間違っていることを理解するのも速い。

もし、あなたのまわりで若いプログラマが逆行現象を起こすのに遭遇したとしても、

どうか暖かく見守ってほしい。

ちなみに

上で紹介した2件に関しては、彼女にはそのあと説明をして理解を得ることができた。

彼女は本当に優秀なプログラマだ。

しかし我々はそれで油断してはならない。

いつか彼女はその可愛らしい顔をにっこりとほほ笑ませながらこう言うかもしれないのだ。

ローカル変数よりグローバル変数のほうが便利ですよね!」

2008-12-24

ポリモーフィズム

ある派生クラスを実装したら、基底クラスを共有する別の派生クラスの挙動がおかしくなった。

純粋仮想関数あたりが何か悪さしてるような気がするが、よくわからない。

あばばばばああああああ

2008-07-04

switchポリモーフィズムのはざまで

多態性(ポリモーフィズム)を目論んでいたはずが、いつのまにかコードにif文とswitch文の渦が紛れ込んでる。

switch ( FLAG ) {
    case 1:
    {
        object = new ObjectA();
    }
    case 2:
    {
        object = new ObjectB();
    }
    default:
    {
        object = new ObjectC();
    }
}

object->doSomething();

せっかく多態性を実現しているのに、なんでswitch文で場合分けしなければいけないのか。

嫌だあ、switch文使いたくない!

ない!ない!

 
ログイン ユーザー登録
ようこそ ゲスト さん