構造化プログラミングとオブジェクト指向プログラミング


11

私は構造プログラミングとオブジェクト指向プログラミングの違いを示すプレゼンテーションを行っていますが、OOPの概念を適用することでコーディングが非常に簡単になり、OOPが本当に必要であると視聴者に感じられる例を挙げて、人々がOOPを必要とする理由を説明したいと思います。

何か案は ??


2
Programmers.stackexchange.comでこの質問をすると、さらに答えが得られます。
レジー

2
あなたの聴衆は何ですか?経験のない非オブジェクト指向プログラマー(cobolなど)経験の浅いプログラマー(学生など)?幹部(プログラマー以外)

私はそれについて聞いたことがありませんでしたが、よくある質問を読んで、そこに尋ねた方が良いと思います。
アーメド

低経験者。
アーメド

4
一部のオブジェクト指向プログラムがより良く構成されていればいいのにと思います。
スコットホイットロック

回答:


17

この簡単なビデオブログをご覧ください。つまり、構造化プログラミングとオブジェクト指向プログラミングの違いは、追加するものではなく、プログラミングから何を奪うかということです。構造化プログラミングやオブジェクト指向プログラミングなどのソフトウェア分野は制約されており、有効化されていません。ここにいくつかの定義があります。警告:あなたはそれらを好きになるつもりはありません。

  • 構造化プログラミングはgoto(制御の直接転送)に課される規律です

  • オブジェクト指向プログラミングは、関数へのポインターに課される規律です(制御の間接的な転送)

  • 関数型プログラミングは、割り当てに課される規律です。

    最初のものは理解するのが難しくありません。ダイクストラは、アルゴリズムでgotoが許可されている場合、正確さの一般的な証明を作成することは不可能であることを発見しました。ただし、制御構造がシーケンス、選択、および反復に制限されている場合は、正確性の証明可能です。もちろん、今日では物事が正しいことを証明しようとさえしませんが、構造化プログラミングのシンプルさと優雅さが好きです。

オブジェクト指向を理解するのは少し難しいです。OOは、カプセル化、継承、およびポリモーフィズムとしてしばしば定義されます。あまり知られていないのは、これらの3つの属性すべてが達成可能であり、Cで頻繁達成されたことです。実際、C ++はCにコンパイルされるプリプロセッサとして開始されました。相互のサブセットであり、継承をシミュレートするデータ構造。ただし、多態性は少し難しいです。Cでは、うまく管理するのが難しい関数へのポインターが必要です。C ++のような言語が私たちに与えたものは、関数へのポインターに課せられた規律でした。C ++コンパイラーがvtableを作成し、厳密な形式に従ってvtable内のポインターを初期化しました。したがって、非常に現実的な意味では、オブジェクト指向は単に制御の間接的な転送、つまり関数へのポインタ。

構造化プログラミングは、gotoを使用しない方法に関するものです。OOは、関数へのポインターを使用しない方法についてです。そして、関数型プログラミングも、やるべきではないことについてすべてです。関数型プログラミングでは、最も厳密に制御された場合を除き、変数を割り当てません。

したがって、結局のところ、これらのプログラミング「テクノロジー」はすべて、テクノロジーを実現するのではなく、実際に規律を制約しています。彼らは何を教えていない以上、彼らは何を教えてより行うことをません。そしてそれは、ソフトウェア開発が過去40年間成長していないことを意味します。むしろ、縮小しました。してはいけないことをすべて学んだので、それはますます制約されてます。

してはいけないことを学ぶのは良いことです。しかし、ここで邪魔質問です:新しいものは、私たちが学んだことをするのですか?


@Ahmed:「TL; DR、ビデオに感謝」
疑わしい

リンクの腐敗...デッドリンク
スラッシュドッティル

7

コンピューターをプログラムするには、3つの基本的な方法があります。

  1. 構造化されていないプログラミング- goto古いBASICインタープリターやアセンブリ言語などのs もうこの方法でプログラムする人はほとんどいません。
  2. 構造化された命令型プログラミング-CやPASCALなど。
  3. Haskell、ML、またはLispのような構造化関数型プログラミング。

私の見解では、オブジェクト指向プログラミングは何か違うものです。プログラムを大規模に整理する方法についてです。上記の3つのパラダイムのいずれかを置き換えたり、廃止したりすることはありません。メソッド本体内で、リストから3つのパラダイムのうちの1つを選択して書き込む必要があります。


よくわかりません!3つのパラダイムのうちの1つを使用する必要がありますが、私たちは知りません。
アーメド

構造化命令型プログラミングまたは構造化関数型プログラミングのいずれかを学習せずにプログラミングすることはできません。これらの2つのパラダイムは、物事を成し遂げることに関するものです。一方、OOPは、プログラムが特定のサイズに達した場合にのみ機能するプログラムのモジュール化に関するものです。常にプログラミングするときに使用するライブラリに確実に表示されますが、継承などのオブジェクト指向機能を持たない完全に優れたクラスライブラリ、たとえばHaskell、LISP、Standard MLのクラスライブラリを使用できます。
ケンブルーム

4

それは、あなたがどのように変化を予測するかについてです。

どちらの概念も再利用可能ですが、OOPはより簡単な変更への扉を開きます。OOPには構造プログラミングが持つすべての再利用性がありますが、それを使用して少ない労力で新しい機能を作成することもできます。

OOPは構造プログラミングのすべての機能を継承し、継承の追加機能があると言えます。:-D


私は現時点では相続があまり好きではありません。

4
私でもありませんが、それは政府が私の祖父を年金から締め出したからです。ただし、OOPの点では、継承が非常に役立ちました。
corsiKa

私の経験では、OOPでは継承を避けるのが最善です。インターフェイスではなく、実際にスーパークラスを構築する頻度はどれくらいですか?原則として構図を優先します。
Janx

1
@Janx:「インターフェースではなく、実際にスーパークラスを構築する頻度はどれくらいですか?」え?「スーパークラスを構築する」ことはありません。既存のクラスを取得し、それらからサブクラスを構築します。そして常にそれを行います。継承を使用していない場合、リスコフ置換とポリモーフィズムの恩恵を受けていないので、そもそもオブジェクト指向プログラミングで何をしているのでしょうか?コンポジションは、ユースケースが異なる別のツールであり、継承の代わりではありません。どちらか一方を「好む」べきではありません。両方が有用であるため、それぞれを使用する必要があります。
メイソンウィーラー

1
@Mason-(Liskov Substitution Principleの)Barbara Liskovが実際に(長いビデオ)彼女は特に継承が好きではないと言ったことに注意する価値があります。
エイダンカリー

2

概念は直交しています。構造化プログラミングとは、プロシージャ/関数/メソッド内でコードを構造化することです。OOPを行う場合、クラスメソッド内で構造化プログラミングの原則に従うことは完全に可能です(そして望ましい)。


1

それは一種の主観的な言い回しです。構造化プログラミングとOOPは問題を解決するスタイルであり、一方が常に他方より優れているとは限りません。数値メソッドライブラリを記述することは、入力データに対して変換を実行する構造化されたスタイルで行われる場合、かなり意味があります。ただし、ステートマシンによって駆動される単純なエージェントは、JavaまたはC ++で自己完結型のクラスとして簡単に表現できます。OOPは、データ構造のストレージコンテナーを表現する自然な方法です。

情報の隠蔽とモジュール性について話すことは、OOPをスタイルとして自然に動機付ける良い方法です。

この問題に関する興味深い見解はSteve Yeggeによって書かれました。ある意味では、2つのスタイルのアプローチの違いをよりよく説明するものの1つです。


0

OOPは、ビジネスモデルを作成するときに理解しやすくなります。アプリケーションの要素について考えるとき、それらの間でいくつかのオブジェクトと関係を使用します。例えば、本には著者、タイトル、ISBNがあります。本は図書館に入れることで、学生が借りることができます。構造的プログラミングは、特定のプロセス、抽象化されていない実装について考えることを強制します。

OOPは簡単に変更できるように設計されています。構造プログラムの変更は可能ですが、コードで記述する必要があります。OOプログラムの変更は、抽象モデルの変更によって説明できます。


0

可変範囲:

優れたプログラミングを保証する言語の原則は、変数の範囲を制限することだと思います。Cのような構造化言語では、スコープは主に2種類です。

  • グローバルスコープ
  • ローカル/関数/メソッドの範囲

私たちは皆、グローバルな範囲が有害であることを知っています。ただし、ローカルスコープではプログラムを実行できない場合があります。グローバルスコープを回避すると、ポインターをより広く使用する傾向があり、スコープ外で変数を使用できるようになります。しかし、ポインターを理解して使用することは困難です。

C ++などのOOP言語は、カプセル化によって新しいタイプのスコープクラス/オブジェクトスコープを追加します。このスコーピングは、プライベート/パブリックバリエーションによってさらに強化されます。そして、これは変数スコープの多くの問題を解決します。スコープは、OOPでさらに定義されています。そして、ポインターはあまり必要ありません。

これは、OOPの優れた機能の1つです。

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