OOPの概念を非技術者に説明する方法は?


10

たいていの場合、プログラマーであることを他人に言わないようにします。ほとんどの場合、最終的にそれが何を意味するのかを説明してしまうからです。私がJavaでプログラミングをしていると彼らに話すと、彼らは言語に関する一般的な質問をし、それがxやyとどのように異なるかをよく尋ねます。私はまた、1)現場での経験があまりなく、2)技術者以外の人に説明するのが本当に嫌なので、説明が得意ではありません。

他の人に説明したら、本当に理解していると彼らは言っています。この場合、OOPの用語と概念を非技術者にどのように説明しますか?


アクセス権を持つ誰かがコミュニティウィキとしてこれを追加できますか?ありがとう。

2
私は今、この同じ質問をほぼ一言一言ほとんど見ました。

1
@Michaelにいくつかのリンクを投稿できますか?


デザインパターン(およびOOP)を理解するには、shop.oreilly.com / product / 9780596007126を参照してください。最も直感的な本を作成してください
cl-r

回答:


27

私は一般的に、実際の例を使用してオブジェクト指向プログラミングを試して説明します。

たとえば、クラスと呼ばれるVehicleものは、車両が持つ最低限のことを記述していると言えます。私は彼または彼女に車両が何であると思うかを彼に教えてくれるように頼むでしょう。時々彼らは「まあ、車やトラックのように」のようなことを言う、そして私はうなずいて同意する。次に、車とトラックの違いは何ですか。時々彼らはサイズ、時には目的、および他のものについて言及します。

次に、車やトラックのことを忘れて、車の説明を続けるように依頼します。

「ああ、よく動く」

「オペレーターまたはドライバーがいる」

等...

すぐに、ビークルとは何かがわかったので、OOPではビークルを定義すると言いました。議論のために、それは動くことができ、ある種のドライバーを与えます。それでは、質問します。では、車には何がありますか?

「ドア」

"ウィンドウズ"

そしてトラック…

「ドア」「窓」「その他の車輪!」

すぐに、多くの議論の後、他の人は一般的に次のことを確認しました:

1)車両を構成するもの

2)車を構成するもの

3)トラックを構成するもの

4)飛行機を構成するもの。

すべて専門的な技術はありません。それぞれのプロパティを適切な領域に分割しました。彼らは継承を理解しています(「ええ、車は車両であり、トラックは車両ですが、車はトラックではありません。単純ですよね」)。

「確かに、基本的に同じことをしますが、少し異なるかもしれません。」という多態性も理解しています。動作と、オブジェクトツリーのどこに配置するかについて話し合うことができます。

彼らの学歴と経歴に応じて、他の人よりも早くそれを得る人もいます。しかし、OOPを実際のオブジェクトと比較すると、ほとんどの人は常にそれを理解しています。実際、技術者以外の人との会話で、今まで考えたこともなかったことがわかりました。車両は有人である必要はありません(ドローンなど)が、プログラマーは車両のオペレーターをその所有者であると考えているでしょうか?オペレーターに言及してもらうのは正しいことでも間違っていることでもありませんが、それによって、私たちがモデル化していることや、ソフトウェアを開発するときに達成しようとしていることについて考えるようになります。

一方、部分的なテンプレートの特殊化は、一方で... ...)


3
正解はLOL +1ですが、テンプレートの特殊化のためにもう1つお伝えしたいと思います。継承はその文脈ではより自然なので、私は動物の類似を使用する傾向があります。地獄、あなたはそのように複数の(二重の)継承を説明することさえできます!
Chinmay Kanchi

誰もが例として車を使用しています。そのため、自動車を扱っているOOP無知のように見えるコードベースで作業することは本当に憂鬱です。
Erik Reppen 2013年

14

オブジェクトは名詞であり、メソッドは動詞です。


8
恐ろしいことに、私はこれをプログラマーにかなり頻繁に説明しなければなりません。
ワイアットバーネット、

7
常にではない。例:私はあなたの方法に反対します。;)
Dan J

JavaScriptでは、メソッドも関数、プロパティ、名詞、および動詞です。
Erik Reppen 2013年

3

これは、私が超技術者でない人に与える私の缶詰の回答のいくつかのバージョンです:

プログラミングとは、コンピュータ上に現実の表現を作成する試みです。すでにこれを行うツールやデバイスはたくさんあります。スプレッドシートを使用すると、会計や統計を簡単に表すことができます。または、Powerpointプレゼンテーションを使用してプレゼンテーションを保存および表示する方法について考えてみてください。

ビジネスプロセスを反映する新しいまたは既存のアプリケーションに、現実のカスタム表現を構築する必要がある場合があります。プログラミングには多くの方法があり、プログラミングの最も一般的な方法の1つはオブジェクト指向プログラミングです。ここで作成するコードは、現実の概念を複製するように特別に設計されています。現実の「もの」には属性と行動があります。たとえば、人間は多くの場合、腕と脚、髪の色、民族性を持ち、話したり歩いたりすることができます。

話すことと歩くことは、話す言語や、歩く速度や方法など、さまざまな種類があります。

人間は、動物、他の人間、他の生物、または無生物など、他の種類の「もの」と相互作用することがよくあります。「もの」間の相互作用、ものの分類など、表現する方法を必要とすることが多いテーマが実際にはあります。私たちの組織で行われているビジネスプロセスを検討してください。私たちの組織が使用するソフトウェアで表現する必要がある非常に複雑な「ビジネスロジック」が存在します。

オブジェクト指向プログラミングは、これらの「現実世界の概念」と「ビジネスロジック」を正確に表現する手段を提供します。

->この発言は通常、彼らの好奇心を食い止めるために十分です(またはおそらく彼らを涙に飽きさせます)が、さらに質問がある場合、上記の発言(私は信じます)は会話がどこに行くことができるかについての適切な基礎を築きます。非技術者は「抽象化」、「構成」、「多態性」などの技術用語にあまり関心がないと思いますが、そうであれば、缶詰のステートメントで使用した言語によって、それに基づいて例をプルします。


1

私はいつもこのようにOOPを学びました:

あなたは時計を持っていて、それが時間を教えてくれます-まあ、プログラミングでは、すべてのコードとすべてのものを一緒に入れなければなりません(サウンドはかなり明白ですが、人々は初期のころはこの方法を使っていませんでした)。とにかく、それはカプセル化と呼ばれています

さて、目覚まし時計が必要になるかもしれません。すべてのものをまとめたら、それにアラームを設定して着信音を鳴らすなど、さらに機能を追加することができます。これは継承と呼ばれます。

また、私が手首に持っている時計を見ても、おじいさんの時計やデジタル時計のように異なる他の時計を見ることができます。見た目は異なりますが、それでも時計です。まあ、それはポリモーフィズムと呼ばれています。

そして、そこにはオブジェクト指向プログラミングの3つのコーナーがあります。残りはすべてコーディングです。


1

本当に理解したいのであれば、OOPのコースにサインアップするように彼らに伝えます。

つまり、Car.startEngine()のようなすべての類推。ある、それに直面しよう-純粋なラップ。私が何年も前にOOPを初めて使用したとき、これらはドメインをさらに抽象化するだけであることがわかりました。

OOPが手続き型言語の複雑さを管理することについて説明しているだけではなく、プログラミング本の著者のほぼ80%は、プログラマーが単純な言葉(ここで皮肉を参照してください)で話す必要がある無知な馬鹿者であると想定しています。

はい、リストとベクターの説明に進むのは完全に正常です。これは、Car.EngineやPoliceMan.Arrestではなく、私たちが主に取り組んでいるものだからです(ゲーム開発者でない限り、それでも、前者)。

トピックに戻りますが、給与計算/ゲームプレイ/スペースシャトルナビゲーションなどの目的で、純粋にプログラマーの心に存在する無形のオブジェクトを作成します。

それでも質問がある場合は、議論するのはやめてください。価値がないからです。ほとんどの人は抽象的な概念の想像に失敗し、ほぼすべての例が必要です(これは、実際のトピックをより単純化/専門化することを意味します)。


+1 OOは、Xerox SPARCで発明されたCar.startEngine()ものです。なぜなら、彼らは、あらゆるものがプログラミングを簡単にし、プログラマーでない人や初心者が簡単に直感的に使えるようになるからです。まあそれはまったくうまくいかなかった...
Ericson2314

1

私はこのことについて妻との会話について話しました、この答えはこちら:https : //softwareengineering.stackexchange.com/questions/45464/how-to-convince-non-programmer-his-notions-about-コンピューターが間違っている/ 45467#45467

編集:私がそこで答えた質問はモデレートされたので、ここで私の答えをもう一度言います。

妻と一緒にレストランに座っていると、「オブジェクト指向とはどういう意味ですか?」

私はコードの再利用とカプセル化、およびポリモーフィズムについて小説を書き始めましたが、ある時点で、彼女の目が最終的にはガラス張りになっていることに気付きました。

それで、コンテナからSplendaパケットを取り出しました。「これがオブジェクトです。そのプロパティは何ですか?」

彼女は言った、「それは長方形で、それは紙でできていて、それはスプレンダを含み、それは青であり、それに印刷されています。」

シュガーパケットを拾った。「これとの共通点は何ですか?」

彼女は言った、「長方形、紙、印刷がある」。

「どちらも甘いものが入っているのはどうですか?」

彼女は言った、「確かに」

「つまり、これらはどちらも抽象甘味料パケットと呼ばれるものの例です。必要に応じて、プラトニックな理想的な甘味料パケットです。」

彼女は言った、「確かに」

「そして、それぞれに抽象パケットから継承されたプロパティがあり、それからその種類に固有のバリエーションがあります。」

彼女は言った、「そうです。そうですね。そして、もし私がSaccharineパケットのようなものを作りたければ、私は一般的なものを取り、Saccharineのためにそれについての詳細を設定し、それからそれを手に入れます!」

「ビンゴ:オブジェクト指向プログラミング」と言いました。

あなたと私は、彼女がファクトリーデザインパターンに彼女の方法を直感したことを知っています。なんでも。継承、カプセル化、オブジェクトクラスのアイデンティティなどを示しています。


ドラット。「節度の理由」により、リンクされた回答が削除されました。なんとあいまいに役に立たない!:-(
鬼詩篇33

@ OgrePsalm33-私の答えを大まかに再評価した。
ダン・レイ

0

この質問は、それでも閉鎖される候補のようです...

ほとんどのものと同様に、OOPは実際には概念レベルで説明するのが非常に簡単です。プログラマーはオブジェクトをモデル化します。そして:

  • オブジェクトには状態があります(フィールド/データメンバー)
  • オブジェクトにはアクションがあります(メソッド/関数)
  • オブジェクトは相互に構築します(継承)

確かに、これらは何百もの細部です。しかし、10秒の概要を誰かに伝えようとしているだけなら、それは良いスタートだと思います。説明が難しい具体的な概念はありますか?


0

携帯電話の例:

あなたが工場の所有者で、一般的な電話について説明したいとします。

  • ステップ1:この一般的な電話のプロパティをリストします。例:高さ、重量、色など
  • ステップ2:この一般的な電話機能をリストします。 例:発信、着信、SMSの送信など

汎用的な「青写真」を手に入れたら、次の電話を作成してください。

電話1:

  • 高さ-> 102mm

  • 重量-> 85g

  • 色->ピンク

電話2:

  • 高さ-> 125mm

  • 重量-> 96g

  • 色->赤


0

OOPについて非技術的なタイプに説明する最良の方法は、OOPをそれらに関連付けることです。

基本的に、OODとOOPは、相互作用しているものの世界として設計および実装しているシステムについて考えることを求めています。

議論のために(インターネットではうまくいかない)、OOD&Pについてゴミ収集者に説明しているとしましょう。彼の名前はボブです。あなたは15年前に彼と一緒に学校に通っていましたが、バーで彼にぶつかりました、そしてあなたはお互いの人生に興味をそそっています。

「それで、ジョン、あなたはプログラマーだと言います。私の甥っ子はそんなナンセンスなことに夢中になっています。オブジェクト指向プログラミングなどについて続けていきます。それは何ですか?」ボブは、綴りを誤った方向から見たイギリス人であることに注意してください。

「まあ、ボブ」あなたは返事をし、向きを変えてしがみついています。「それは本当にとても簡単です。あなたはゴミを集めますよね?あなたは一般的にあなたの仕事をしていますか?」

「まあ、私は町の周りのバンを追いかけてゴミを拾ってバンに入れました」とボブはクイズで答えます。

それに耳を傾ける必要があります。それらは私たちの行動です。基本的にそれがデザインに必要なすべてです。オブジェクト指向プログラミングは、本質的には、設計を実装する方法です。言語によって異なります。」

ボブは彼のビールで眠りに落ちました。あなたは離れて歩きます。


1
ああ!反対票によるドライブ。その魅力は気まぐれです。
Matt Ellen、

1
クールな物語の仲間。タマネギもベルトに結びつけていますか?
ドナルフェロー、

戦争のため、大きな黄色いものだけ。
Matt Ellen、

0

私は継承を説明するために車の例が好きです(私は車ではなく動物を使用する傾向がありますが、それは同じ考えです)オブジェクト指向プログラムがどのように機能するかを説明するために、私はChris CrawfordのWebサイトで一度読んだアナロジーを参照します:プログラムは本当に効率的な官僚。プログラム内のさまざまなオブジェクトはすべて、官僚機構のさまざまな部門のようです。各部門には独自の指定されたタスクがあり、明確に定義された入力(誰に話しかけるか、どのフォームに記入するか)があり、他の部門は多くの場合、内部で何が行われているのかあまり知りません。人事は抽象的な工場のようなものであり、ITはシングルトンなどです。

コンピュータプログラムで間違ったものを入力したためにエラーメッセージが表示されるのは、オフィスに提出するフォームを間違って入力するのとまったく同じです。


0

OOPとは、人間の思考プロセスと世界の理解を抽象化したもので、機能をデジタルの「ボイド」に投影して、使い慣れたプロセスと分類をデジタルで模倣することです。それは、多くの点で、「コンピュータのように考える」よりも、原始的な言語の状態についてです。

プログラミングが現実や人間の考えを模倣した場合、それは本質的にはるかに有機的で無秩序で無計画なものになります-横方向でさえ。代わりに、現実をベビーステップ、「2 + 2ロジック」、粗雑なカテゴリー、再利用可能な小さなツール、先史時代の推論に単純化します。

私たちはまだ自分の考えや欲求をプロトコルや共通言語にダウンロードする方法を模索しています。歴史学者はいつかその洗練された粗雑さに魅了されると思います。それはまったく「賢い」ものではありません-それは、最も単純なものでさえ、私たちがどのように決定または理解するかを簡単に説明できない方法を強調するだけです。コンピューティングは、「猫ではないので犬は犬である」レベルの思考進化のレベルにあります。これは、基本的な話し言葉でさえ何千年も後のことです。


0

ウィザードには2種類あります。魔法の言葉で特定のことを起こす人がいます。彼は火を召喚する言葉を持っています。彼は、凍った鶏肉を薄気の外に出させるための言葉を持っています。そして、力強さでいっぱいの力のポット(私は私の力が緑で、輝きがあり、半透明であることを好む)を作成するための別の言葉。彼の言葉を正しく当てれば、フライドチキンを作ることができます。

そして、OOPウィザードがあります。食料品店に行って鶏肉(または彼に準備させたい他の食品の材料)を購入し、調理して、夕食を提供する方法を知っている小鬼を召喚するだけの人。OOPウィザードは、その方法を彼の小鬼に伝える必要はありません。彼は、この場合フライドチキンである彼が何を望んでいるかを彼に知らせる必要があるだけです。それだけでなく、OOPウィザードは他のミニオンを呼び出して、インプシェフに何をすべきかを伝えることができます。

だから、呪文の男はパーティーに感心しますが、OOPウィザードは、たくさんのキャラクター(たとえば、怒っているユニコーンのウェイターやトロルフロアマネージャーなど)がいる魔法のレストランを始めようとするときに必要なウィザードです一緒に働かなければならない。「レストラン」を解決するという問題のすべてのステップを実行しようとすると、詳細に簡単に巻き込まれ、間違いを犯しやすくなります。OOPウィザードは、部下に事前のトレーニングを行って詳細を整理し、部下との対話によってより大きな問題の解決に専念できるようにします。

言うまでもなく、小学校の食堂の問題でchef-impを再利用する方が簡単です。それは、単語を呼び出すことによって一度にすべてのステップを実行しているときに、再利用する場合としない場合があるすべてのジャンクを分離することです。そして、他の単語のセットを呼び出す単語(これは、さまざまな問題を処理する必要があるため、さらに多くなります)。

公平を期すために、非常に注意深いアプリケーションを使用すると、呪文ウィザードはすべてをOOPウィザードと同じくらい高速に実行できます。彼は物事を正しい方法で分解することができるので、適切な呪文を呼び出すには、OOPウィザード以外の作業は必要ありません。しかし、1つの特定の複雑な問題に対してすべてが結び付けられているため、作業の理解や複製がはるかに難しく、大部分を再利用することがはるかに困難です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.