たいていの場合、プログラマーであることを人々に告げるのを避けようとすることがよくあります。 Javaでプログラミングしていると彼らに話すと、彼らは言語に関する一般的な質問をし、それがxやyとどのように異なるかをよく尋ねます。また、1)について説明するのが得意ではありません。現場での経験はあまりありません。2)非技術者に説明するのは本当に嫌いです。
他の人に説明したら、本当に理解していると彼らは言います。この場合、どのようにしてOOP専門用語でない人に用語と概念を説明しますか?
私は一般的に、実際の例を使用してオブジェクト指向プログラミングを試して説明します。
たとえば、Vehicle
というクラスは、車両が持つ最低限のことを記述していると言えます。私は彼または彼女に車両が何であると思うかを彼に教えてくれるように頼むでしょう。時々彼らは「まあ、車やトラックのように」のようなことを言っています、そして私は彼らにうなずいて同意します。次に、車とトラックの違いは何ですか。時々彼らはサイズ、時には目的、および他のものについて言及します。
それから私は彼らに車やトラックのことを忘れるように頼んで、ただ車を説明し続けるように彼らに頼みます:
「ああ、よく動く」
「それはオペレーターかドライバーを持っている」
等...
すぐに、ビークルが何であるかがわかり、OOPでビークルを定義します。そして、議論のために、それは動くことができ、一種のドライバーを与えると言います。それから私は質問します。では、車には何がありますか?
「ドア」
"ウィンドウズ"
そしてトラック….
「ドア」「窓」「その他の車輪!」
すぐに、多くの議論の後、他の人は一般的に次のことを確認しました:
1)車両を構成するもの
2)車を構成するもの
3)トラックを構成するもの
4)飛行機を構成するもの。
すべて専門的な技術はありません。それぞれのプロパティを適切な領域に分割しました。彼らは継承を理解しています(「ええ、車は車両であり、トラックは車両ですが、車はトラックではありません。単純ですよね」)。
「確かに、基本的に同じことをしますが、少し異なるかもしれません。」多態性も理解しています。動作と、オブジェクトツリーのどこに配置するかについて説明できます。
彼らの学歴と経歴に応じて、他の人よりも早くそれを得る人もいます。しかし、OOP=を実際のオブジェクトと比較すると、ほとんどの人は常にそれを取得します。実際、私は技術者以外の人との会話で、今まで考えたことのないことを発見しました。車両はそうではありません。たとえば(ドローン)のように有人である必要がありますが、プログラマーは車両のオペレーターをその特性として考えているでしょうか?オペレーターに言及することは正しいことでも間違っていることでもありませんが、私たちがモデル化していることと、ソフトウェアを開発するときに達成しようとしていることについて。
一方、部分的なテンプレートの特殊化は、一方で... ...)
オブジェクトは名詞であり、メソッドは動詞です。
ここに、私が超技術者でない人に与える私の缶詰の回答のいくつかのバージョンがあります:
プログラミングは、コンピュータ上で現実の表現を作成する試みです。すでにこれを行うツールやデバイスはたくさんあります。スプレッドシートを使用して、会計や統計を簡単に表現できるようにしたり、PowerPointプレゼンテーションを使用してプレゼンテーションを保存および表示したりする方法について考えてください。
ビジネスプロセスを反映する新しいアプリケーションまたは既存のアプリケーションに、現実のカスタム表現を構築する必要がある場合があります。プログラミングには多くの方法があり、最も一般的なプログラミング方法の1つはオブジェクト指向プログラミングです。ここで作成するコードは、現実の概念を複製するように特別に設計されています。現実の「もの」には、属性と行動があります。たとえば、人間は腕と脚、髪の色、民族性を持っていることが多く、話したり歩いたりすることがよくあります。
話すことと歩くことは、人が話す言語や、歩く速度や方法など、さまざまな種類があります。
人間は、動物、他の人間、他の生物、または無生物など、他の種類の「もの」と相互作用することがよくあります。 「もの」間の相互作用、ものの分類など、表現する方法を必要とすることが多いテーマが実際にはあります。組織で進行するビジネスプロセスを検討してください。私たちの組織が使用するソフトウェアで表現する必要がある非常に複雑な「ビジネスロジック」が存在します。
オブジェクト指向プログラミングは、これらの「現実世界の概念」と「ビジネスロジック」を正確に表現する手段を提供します。
->この発言は通常、彼らの好奇心を食い止めるために十分です(またはおそらく彼らを涙で退屈させます)が、さらに質問がある場合、上記の発言(私は信じます)は会話がどこに行くことができるかについて適切な基盤を築きます。非技術者は「抽象化」、「構成」、「多態性」などの技術用語にあまり関心がないと思いますが、そうであれば、缶詰のステートメントで使用した言語によって、それに基づいて例をプルします。
私は常にOOPこのように学びました:
あなたは時計を持っていて、それが時間を教えてくれます-まあ、プログラミングでは、すべてのコードとすべてのものをまとめなければなりません(サウンドはかなり明白ですが、人々は初期のころはこの方法を使っていませんでした)。とにかく、それはencapsulationと呼ばれます。
さて、目覚まし時計が必要になるかもしれません。すべてのものをまとめたら、それにアラームを設定して着信音を鳴らすなど、さらに機能を追加できます。これはinheritanceと呼ばれます。
また、私が手首に持っている時計を見ても、おじいさんの時計やデジタル時計のように異なる他の時計を見ることができます。それは異なって見えますが、それでも時計です-まあ、それはpolymorphismと呼ばれています。
そして、そこにはオブジェクト指向プログラミングの3つのコーナーがあります。残りはすべてコーディングです。
私はこのことについて妻との会話について話しました、この答えでここに https://softwareengineering.stackexchange.com/questions/45464/how-to-convince-non-programmer-his- notions-about-computers-are-wrong/45467#45467
編集:私がそこで答えた質問はモデレートされたので、ここで私の答えを再度述べます。
妻と一緒にレストランに座っていると、「オブジェクト指向とはどういう意味ですか?」
私はコードの再利用とカプセル化、およびポリモーフィズムについて簡単に説明し始めましたが、ある時点で、彼女の目が最終的に凝視されていることに気付きました。
それで、コンテナからSplendaパケットを取り出しました。 「これがオブジェクトです。そのプロパティは何ですか?」
彼女は言った、「それは長方形で、それは紙でできていて、それは素晴らしいものを含んでいます、それは青い、それはそれに印刷されています。」
シュガーパケットを拾った。 「これとの共通点は何ですか?」
彼女は言った、「長方形、紙、印刷がある」。
「どちらも甘いものが入っているのはどうですか?」
彼女は言った、「確かに」
「つまり、これらはどちらも抽象甘味料パケットと呼ばれるもののインスタンスです。必要に応じて、プラトニックな理想的な甘味料パケットです。」
彼女は言った、「確かに」
「そして、それぞれに抽象パケットから継承されたプロパティがあり、それからその種類に固有のそのバリエーションがあります。」
彼女は言った、「そうです。そうですね。そして、もし私がSaccharineパケットのようなものを作りたければ、私は一般的なものを取り、Saccharineのためにそれについての詳細を設定し、それからそれを手に入れます!」
「ビンゴ:オブジェクト指向プログラミング」と言いました。
あなたと私は、彼女がファクトリーデザインパターンに彼女の方法を直感したことを知っています。なんでも。継承、カプセル化、オブジェクトクラスのアイデンティティなどを示しています。
OOPでコースを申し込んで本当に理解したい場合は、彼らに申し込むように言ってください。
つまり、Car.startEngine()のようなすべての類推。ある、それに直面しよう-純粋なラップ。 OOPに何年も前に初めて入会したとき、これらはドメインをさらに抽象化するだけであることがわかりました。
OOPは手続き型言語の複雑さを管理することに関するものであると説明するのではなく、プログラミング本の著者のほぼ80%は、プログラマーが単純に話される必要がある無知な馬鹿であると思います(ここで皮肉を見てください?))条項。
はい、リストとベクターの説明に進むのは完全に正常です。それは、Car.EngineやPoliceMan.Arrestではなく、私たちが主に取り組んでいるものだからです(ゲーム開発者でない限り、あなたはまだあなたのシェアを持っているに違いありません)前者)。
トピックに戻りますが、給与計算/ゲームプレイ/スペースシャトルナビゲーションなどの目的で、純粋にプログラマーの心に存在する無形のオブジェクトを作成します。
それでも質問がある場合は、議論するのはやめましょう。 ほとんどの人は抽象的な概念の想像に失敗し、ほとんどすべての例が必要です(これは実際のトピックをより単純化/専門化することを意味します)。
この質問は閉鎖されている可能性がありますが、それでも...
ほとんどのものと同様に、OOPは実際には概念レベルで説明するのが非常に簡単です。プログラマはオブジェクトをモデル化します。そして:
確かに、これらは何百もの細部です。しかし、誰かに10秒の概要を伝えようとしているだけなら、それは良いスタートだと思います。説明が難しい具体的な概念はありますか?
携帯電話の例:
あなたが工場の所有者であり、一般的な電話について説明したいとします。
汎用的な「青写真」を作成したら、次の電話を作成してください。
電話1:
高さ-> 102mm
重量-> 85g
色->ピンク
電話2:
高さ-> 125mm
重量-> 96g
色->赤
私は継承を説明するために車の例が好きです(私は車ではなく動物を使用する傾向がありますが、それは同じ考えです)オブジェクト指向プログラムがどのように機能するかを説明するために、私はChris CrawfordのWebサイトで一度読んだアナロジーを参照します:プログラムは本当に効率的な官僚。プログラム内のさまざまなオブジェクトはすべて、官僚機構のさまざまな部門のようです。各部門には独自の指定されたタスクがあり、明確に定義された入力(誰に話しかけるか、どのフォームに記入するか)があり、他の部門は多くの場合、内部で何が行われているのかあまり知りません。 HRは抽象的なファクトリのようなもので、ITはシングルトンなどです。
コンピュータプログラムで間違ったものを入力したためにエラーメッセージが表示されるのは、オフィスに提出するフォームを間違って入力するのとまったく同じです。
OOPとは、人間の思考プロセスと世界の理解を抽象化したものであり、機能をデジタル「ボイド」に投影して、使い慣れたプロセスと分類をデジタルで模倣することです。それは、多くの点で、「コンピュータのように考える」よりも、原始的な言語の状態についてです。
プログラミングが現実または人間の考えを模倣した場合、それは本質的にはるかに有機的で無秩序で無計画なものになります-横方向でさえ。代わりに、現実をベビーステップ、「2 + 2ロジック」、大まかなカテゴリ、再利用可能な小さなツール、先史時代の推論に単純化します。
私たちはまだ自分の考えや欲望をプロトコルや共通言語にダウンロードする方法を模索しています。歴史学者はいつかその洗練された粗雑さに魅了されると思います。それはまったく「賢い」ものではありません-それは、最も単純なものでさえ、私たちがどのように決定または理解するかを簡単に説明できない方法を強調するだけです。コンピューティングは、「猫ではないので犬は犬である」レベルの思考進化のレベルにあります。それは、基本的な話し言葉でさえ何千年も後のことです。
ウィザードには2種類あります。魔法の言葉で特定のことを起こす人がいます。彼は火を呼び出すための言葉を持っています。彼は、凍った鶏肉を薄気の外に出すための言葉を持っています。そして、力強さでいっぱいの力のポット(私は私の力が緑で、輝きがあり、半透明が好きです)を作成するための別の言葉。彼の言葉を正しく適用することで、フライドチキンを作ることができます。
そしてOOPウィザード。食料品店に行く方法を知っているインプを召喚し、鶏肉(または彼に準備させたい他の食品の材料)を買って調理する人がいます。 OOP Wizardは、彼のインプにそれを行う方法を教える必要はありません。彼は彼が何を望んでいるかを彼に知らせる必要があるだけです。このケースはフライドチキンです。それだけでなく、OOPウィザードは他のミニオンを呼び出して、インプシェフに何をすべきかを伝えることができます。
だから、呪文の男はパーティーに感銘を与えるが、OOPウィザードは、たくさんのキャラクター(たとえば、ユニコーンのウェイターに腹を立てて、トロールフロアマネージャーなど)全員が協力する必要があります。「レストラン」を解決するという問題のすべてのステップを実行しようとすると、簡単に詳細に巻き込まれ、間違いを犯しやすくなります。OOPウィザードは、彼の部下に詳細を整理するように事前にトレーニングを行います。そのため、彼は人々と対話することで、より大きな問題の解決に集中することができます。
言うまでもなく、小学校の食堂の問題でchef-impを再利用する方が簡単です。それは、単語を呼び出すことによって一度にすべてのステップを実行しているときに、再利用する場合としない場合があるすべてのジャンクを分離することです。そして、他の単語のセットを呼び出す単語(これは、さまざまな問題を処理する必要があるため、さらに多くなります)。
公平にするために、非常に注意深いアプリケーションを使用すると、呪文ウィザードは、OOPウィザードと同じくらい速くすべてを完了することができます。彼は、正しい呪文を呼び出すように、正しい方法で物事を分解できます。 OOPウィザード)よりも彼の側での作業は必要ありません。しかし、1つの特定の複合システムですべてが結び付けられているため、作業の理解や複製が非常に難しく、大部分を再利用するのがはるかに困難です。問題。
OOPについて非技術的なタイプに説明する最良の方法は、それをそれらに関連付けることです。
本質的にOOD&OOPは、あなたが設計および実装しているシステムを、相互作用するものの世界として考えることを望んでいます。
議論のために(インターネットでは決してうまくいかない)、OOD&Pについてゴミ収集者に説明しているとしましょう。彼の名前はボブです。あなたは15年前に彼と一緒に学校に通っていましたが、彼はバーでぶつかり、お互いの人生に興味をそそられています。
「それで、ジョン、あなたはプログラマーだと言います。私の甥っ子はそんなナンセンスなことに夢中になっています。オブジェクト指向プログラミングなどについて続けていきます。それは何ですか?」ボブは、綴りを誤った方向からイギリス人であることに注意してください。
「まあ、ボブ」あなたは返事をし、向きを変えてしがみついています。 「それは本当にとても簡単です。あなたはゴミを集めますよね?あなたは一般的にあなたの仕事をしていますか?」
「まあ、私は町の周りのバンを追いかけてゴミを拾ってバンに入れました」とボブはクイズで答えます。
「素晴らしい。まあ、私がそれをシミュレートするプログラムを書いていると想像してみてください。オブジェクト指向の設計では、最初のステップは、どのオブジェクトが存在するかを決定することです。あなたの仕事には、通り、ゴミ箱、あなた、そしてバンがいるようです。次に、各オブジェクトが実行する動作を知る必要があります。現実の世界でどのように動作するかはわかりませんが、クリアが必要な道路について通知されたと仮定します。1つの動作があります。ストリートは、クリアが必要なときに通知します。これは、クリアが必要な道路に注意を払う必要があることを意味します。バンを追跡するので、バンはクリアが必要な道路を待機します。つまり、2つです。3つ目は、明らかにバンに従います。もう1つゴミ箱にゴミを入れますか。ゴミ箱がいっぱいになった場合にも気づきます。ゴミ箱がいっぱいになったら通知する必要があり、それを聞く必要があると思います。これらは私たちの行動です。デザインの必要性オブジェクト指向プログラミングは本質的にデザインを入力してください。言語によって異なります。」
ボブは彼のビールで眠りに落ちました。あなたは離れて歩きます。