オブジェクト指向プログラミングを学ぶ前に、手続き型プログラミングを学ぶ必要があるのはなぜですか?[終了]


10

私は現在、IT大学で4年生です。このトピックについて教授と話すと、彼は私の意見を拒否し、非常に厳しい批判を与えます(私の大学では、C(ANSI)(Proceduralプログラミングクラス-大学1年目)C ++の前(2年目のOOPクラス)など...

しかし、13歳のとき、私の弟はJavaを最初に教えられ、他には何も教えられませんでした。現在、彼は通常の2年生がJavaでできることのほとんどすべてを行うことができます。

プロの皆さんには、手続き型プログラミングを最初に教えるべきだと思う理由を教えてください。


8
アセンブラにはオブジェクトがないためです。

9
それは、電卓の使い方を学ぶ前に適切に計算するように教えられるべき理由です。

22
オブジェクト指向の設計には欠陥があるためです。プログラムは、データを操作する動作の集まりです。オブジェクトはしばしば不必要な複雑さをもたらします。「プログラムの設計方法:プログラミングとコンピューティングの概要」をお読みください。

8
他の人が言うように、「OOPで新しいプログラマの気を散らさないでください」:prog21.dadgum.com/93.html-基本的に、OOPが新しいプログラマに基本を教えるのを邪魔しています。あなたは彼らに2つの本当に難しい概念を同時に教えています。
ジョンリプリー

7
@juxstapose-オブジェクト指向プログラミングが不必要な複雑さをもたらすと言うことは、鋼鉄の単一のブロックから車両を切り分けるべきだと言うようなものです。ただ私の意見です。

回答:


23

概要:

  1. 現実の世界では、遅かれ早かれ、手続き型コードを使用する必要があるからです。

  2. 手続き型言語は、単なる代替手段ではなく、オブジェクト指向言語への拡張や導入のように機能できるためです。

  3. 回答2の補足。OOPは手続き型プログラミングよりも複雑であるため、最初に手続き型プログラミングを学習することをお勧めします。

  4. 現実の世界では、プログラマーは問題を解決するためにいくつかの方法を組み合わせて使用​​するため、別名「マルチパラダイムプログラミング」は、単一のパラダイムだけではありません。

  5. ほとんどのプログラミング言語は、たとえ設計者や一般的な開発者が反対の意見を言っても、ある程度はマルチパラダイムです。

  6. [NEW]一般に手続き型プログラミングと混同され、混乱しているモジュラープログラミングはOOPに適用できるため、「オブジェクト指向プログラミングを学ぶ前にモジュラープログラミングを学ぶ必要があるのはなぜですか」という質問を読むことができます。

拡張ボーリングの説明:

ポイント1は非常に明確で、それ以上の説明はありません。

ポイント2、クラス、継承、多態性、インターフェイスなど...

ポイント3、私はオブジェクト指向パスカルを学ぶ前に手続き型パスカルをコーディングしました。そこにたどり着いたとき、私は次のように述べました。 」

私は普通のCからCプラスプラスに行った人々から同じことを聞きました。

ポイント4、ほとんどの場合、プログラマーはいくつかのプログラミング手法やパラダイム、または問題を解決する方法を組み合わせます。機能的、手続き的、OOP、論理的。

Java "Pure OO"でさえ、言うほど単純なオブジェクトプログラミングではありません。

「構造化プログラミング」の代わりに「手続き型プログラミング」と言った+1ポイント。またはモジュラープログラミング。これらは重要です。

Altought、これらの用語は多くの場合、一緒に教えられ、互換的に使用されますが、そうではありません。構造化プログラミングには、手順を使用するだけでなく、多くの概念が含まれており、その1つはプログラムを「スパゲッティコード」のように見えないようにすることです。

今日、私は「オブジェクト指向のスパゲッティコード」のように見えるいくつかの「純粋な」オブジェクト指向プログラムを読みました。

多くの場合、OOコードを読んで、プログラマーがOOPの前に構造化プログラミングを学んだことを伝えることができます。コードが明確で整理されているからです。

そして、モジュール式プログラミングでは、いくつかのアプリを見てきました。モジュールを使用しないC ++およびPHP。*


18

類推は数学に似ていると思います。最初にいくつかの基本的な概念(加算/減算/ ...)を学習してから、より複雑なトピック(代数/微積分)に進む必要があります。手続き型プログラムは非常に直線的であり、構文を学習している間は制御の流れを把握しやすくなります。OOPはおそらくもっと複雑であると考えられています。OOPは手続き型言語で使用されているより単純な構成に基づいていますが、より抽象的で理解が困難です。Cなどの言語から始めると、ハードウェアにより近づき、メモリ割り当てとポインタの問題に対処できます。これらは理解する必要がありますが、Java / C#などの言語では実際には使用できません。それが最初に来るのか2番目に来るのかに関係なく、学校でこれにさらされることにはいくつかの本当の価値があります。

FWIW、それは最終的に変更されるはずです。私が学校を始めたとき、私たちはパスカルとPL / 1で学びました。高度な言語のクラス(それが私をデートする)になるまでCにたどり着きませんでした。私は大学院までJavaを採用しませんでした-まだ発明されていませんでした!


+

10
@Spacemoses-実際には、抽象的なものであるほど、議論は容易になりますが、議論されているものの現実を把握することは難しくなります。

同意しました、今あなたの要点を見ています。
ses011 2011年

12

オブジェクト指向プログラミングは、整理された方法で手続き型スニペットを集めたものです。あなたが学んでいる教訓は、オブジェクト指向の方法論が組織と保守性の維持に役立つということです。この区別ができず、手続き型のプログラムはオブジェクト指向であると主張するプログラマはたくさんいます。


3
しかしfunctions + state = objects
Dan D.

4
オブジェクト指向は、コードベースを膨らませるので、メンテナンスをより困難にすることがよくあります。Javaベースのシステムは、オブジェクト指向のレベルとそのコミュニティで見られる設計パターンが原因で、維持するのが悪夢です。
bit-tiddler 2011年

1
「そのコミュニティで見つかったデザインパターン」-それがあなたのスタンスである場合、「Javaコミュニティ」での個人的な問題のように聞こえます。
ses011 2011年

1
@Dan D:オブジェクト指向は、オブジェクト内の関数と状態を組み合わせるだけではありません...
Marjan Venema

4
@Spacemoses:KISSの原則を採用していない開発コミュニティに問題があります。多くの場合、問題に対する最善の解決策は最も単純な解決策です。
bit-tiddler 2011年

11

あなたはしません。

まず、Schemeで関数型プログラミングを学びました。次に、手続き型、 次に OOP、次に宣言型プログラミングに移動しました。信じられないかもしれませんが、既にプログラミングを知っていましたが、他の人にとっても簡単だったと思います。FPは数学に似ているからです。あなたはすでに基本を知っています。

私はこれについて何度も自分で議論してきましたが、最終的には、先生が概念をどの程度上手に教えるかにかかっているという結論に達しました。

次の理由により、単一の答えはありません。

  • Cのような手続き(あるいはアセンブリ)から始めるのは良い選択かもしれません。コンピューターが実際にどのように機能するかを学ぶからです。

  • オブジェクト指向のJavaから始めるのは良い選択かもしれません。なぜなら、OOPを学び、実際の生活に適用するのは比較的簡単であり、**フォーミングについても教えてくれるからです。

  • Schemeのような関数型プログラミングから始めることは、(変数ではなく関数の観点から)より抽象的に考えることを教えてくれるので、良い選択かもしれません。

先生が上手に教えてくれなければ、何から始めてもかまいません。彼らはほとんど同じになるでしょう。


4
+1を押すと、私はそれを見つけるために多くの悪い答えをスクロールしなければならなかったなんて信じられません!
jk。

最初にいくつかのコーディングを習得したので、私は実際にしばらく数学関数を理解するのに苦労しました、そして「何かをする」のではなく「ある」関数の概念は私を困惑させました。:3
StarWeaver

6

言語は、C ++、Java、C#などのオブジェクト指向の場合があります。そして、これらの言語から始めることができます。しかし、ポイントは、これらのオブジェクト指向言語であっても、最初に手続き型プログラミングを学び、次にOOPを学ばなければならないということです。兄弟にも同じことが行われたと思います。


3
+1正確に。すべてのOOPメソッドは短い手続き型プログラムです。小さな部分(型、リテラル値、変数、演算子、=代入、、など)をより大きな部分(メソッド)に組み合わせる方法がわからない場合iffor、OOPを理解する方法を考えてください。ほとんどのスキルと同様に、非常に賢く、やる気があり、1対1の指示にアクセスできると、複数の関連トピックを同時に学ぶことができます。
David Harkness

3

手続き型プログラミングは、少なくともCのような言語では、プログラミングを、アルゴリズムとデータ構造、そして人間が理解できるソースコードとアセンブリコードの間の幸せな媒体である抽象化のレベルで、非常に必要最低限​​の作業に取り除きます。

このようにして、学生は少し科学(アルゴリズム、データ構造)と少し工学(ソース->オブジェクト->マシンコンパイル、フォンニューマン(おそらく)アーキテクチャ)を同時に学ぶことができます。

C ++ / obj-Cを介したOOPは、コード編成パターンを導入します。これは、学ぶべきもう1つのことです。これにより、上記の概念の学習がやや難しくなる可能性があります。

Javaを介したOOP(とりわけ)は、ハードウェアと環境を抽象化することでさらに進んでいます。現在、基礎となる製品はマシンコードではありませんが、基礎となるハードウェアがどのように機能するかを明らかにしないある種の中間手段ですが、その結果、学生はコード編成パターンに集中できるようになります。

結局のところ、ハードウェアの仕組みを学ぶことと、コード編成パターンを学ぶこととの間のトレードオフだと思います。どちらがより重要かについては、私にはよくわかりません。現実の世界では、少なくともある程度は両方の知識が必要です。

低レベルの手続き型プログラミングで始まる学部のプログラムはおそらくコンピューターサイエンティスト/コンピューターエンジニアを生み出し、高レベルの概念で始まるプログラムはソフトウェアエンジニア/開発者/プログラマーを生み出すと思います。


3

OOPオブジェクトの本質は、手続き型プログラミングで構成されています。

forループを実行できない場合は、ポインターを適切に使用し、クラスのインターフェイスを作成できない型と関数を宣言すると、内部で実行する価値のあることを大幅に減らすことができます。

とにかく、入門クラスでOOPを学ぶのではなく、単に構文です。OOPに直接ジャンプすると、(最初は)把握するのが以前よりも複雑になります。

OOPは、クラスを形成するためのいくつかの宣言構文ではなく、データ構造、設計パターン、ポリモーフィズム、継承、および構成に関するものです。

手続き型プログラミングを知るために必要なすべてのことを行うには、Cで簡単に行うことができます。とにかく、Cで学んだほとんどすべてのことをJavaまたはC ++に引き継ぐことができます。 ...文を記述し(入門Cにいるところ)、文(インターフェースを定義する手順を記述しなければならない)、段落(データ構造を知っていることが必要)、そしていくつかの設計パターン(悲劇、コメディ、欠陥)を理解する必要があります。ヒーロー、彼らがどのように相互作用するか、そしてそれらを使用しない場合)完全な小説(完全なOOPシステム)を書く前に。

私があなただったら、Cプログラミング言語Javaプログラミング言語デザインパターンギャングオブフォー、およびパターンハッチングの本をいくつか取り上げます。C / C ++に真剣に取り組んでいるのであれば、間違いなくCプログラミング言語のコピーを手に入れるでしょう。

Java(と$のために)のすべての方法に行きたい場合は、Javaの設計パターンに関する書籍、ApacheおよびTomcat WebサーバーでJavaを使用する方法、SQLデータベースプログラミングに関する書籍を入手してください。Javaはウェブ上で非常にお尻を蹴りますが、申し訳ありませんが、PHPにはたくさんのセキュリティホールの歴史があり、サーバーがルート化されたりSQLデータベースが挿入されたりしないようにするのはWindowsと同じくらいお尻の痛みです。

SQLを学ぶために時間をかける必要があります。OracleMySQL PostgresqlとMSSQLは構文に関して多くの共通点がありますが、GPLの代わりにBSDライセンスであるという理由でPostgresqlを選択する必要があります(比較を調べる必要があります) GPL / BSDライセンスも対照的です)


2

Javaのようなオブジェクト指向言語で書かれたほとんどのコードは、実際にはオブジェクト指向ではない、と言わざるを得ません。OOの背後にあるアイデアを実際に理解することは困難です。その結果、おそらくOOコードは実際にはほとんど手続き型です。

ただし、これはJavaで手続き型コードを記述することには何の問題もありません。はい、OOを実行することにはメリットがありますが、初心者のプログラマーと混同したくないものではありません。したがって、Javaを教えることには何の問題もありません。それから本当のオブジェクト指向を期待しないでください、しかしそれはうまくいきます。

ただし、Javaはコンピューター内部で起こっていることに関する多くの低レベルの詳細を隠します。Cは、これらの情報を公開しません。これらを処理する言語を使用する前に、学生がこれらの低レベルの詳細がどのように機能するかを学ぶべきであるという良い事例を作ることができます。ただし、これらの詳細を無視して後で学習する必要がある場合もあります。


2

他の何人かはこのテーマに沿ってすでに回答していますが、これをより明確に述べる価値があると思います。

Javaのようなオブジェクト指向言語でプログラミングの学習を始めたとしても、オブジェクト指向の概念に到達する前に、手続き型プログラミングのテクニックから学びます。新しいプログラマーにJavaを教えるときは、最初にそれらをオブジェクトやクラスに導入するのではなく、ステートメントや変数に導入します。学生がオブジェクトやクラスについて多くのことを教えられるようになるまでには、少なくとも手続き型プログラミングの基本をすでに持っています。

したがって、少なくとも、Javaで手続き型プログラミングを学び、次にJavaでオブジェクト指向プログラミングを学ぶ必要があります。手続き型プログラミングに1年を費やすのか、プログラミングコースの最初の数週間を費やすのか、そのために別の言語を使用するのかどうかは、詳細について議論しています。


0

率直に言って、これの勢いは、主に古きプログラマーが古き時代を望んでいるからだと思います。

何よりも前に、私は年配のプログラマーのためにいかなる論争も絶対に持ちません、それらの多くは単に驚くほど熟練しています。残念ながら、そうでない人、洗い流されて、本当に真にプログラミングが上手でなかった人は、「現実の世界」でハッキングできないときに教授になります。(すべての教授がいるわけではない...しかし...多くの)

OOPは、それが作成されたプログラミングの聖杯ではなく、手続き型プログラミングの遺物でもありません。これは、少なくとも知って良いことだいくつかの両方のを、私は手続き型プログラミングのように教えられてしまうことに何のが一般的で、時間と労力の巨大な無駄になる傾向があると思います。私たちは、どちらか一方のスタイルだけでなく、学界でプログラミングを学ぶ必要があります。私は自分のコードも含めて、かなりひどいコードと誤解をこれに帰します。


2
私は'89年からCを使っている先生がいましたが、それはc '99を期待しているマイクロチップ用でした。次に、「c ++」を使用しているが、STLまたはテンプレートを使用していない他の教師がいました。同様にそれらに関数ポインタを持つ構造体であったかもしれません。
Ape-in​​ago

1
公平を期すために、STLとテンプレートは一般に、C ++の入門トピックではありません。101レベルのプログラミングコースの基本的な目標は、指定された構文の制約内で、適切に構造化された逐次、条件付き、および反復ロジックを作成する方法を教えることです。他のすべての言語機能は、基本的な制御構造をグループ化し、それらをデータにバインドできるようにする、単なる構文上の砂糖です。
bit-tiddler 2011年

2つの反対投票をします。その意見はもともと私にとって不思議なことでしたが、私は貧しい教育からの回復を助けてくれた古いプログラマーからの意見でした。@Ape:私たちのCS部門の責任者は、2004年のXDで1年間COBOLを教えようとしていました(彼の「教育」スタイルからの心配はほとんどありません。PointOf Salesに取り組むことができるので、私は少しは気にしません)機械は
笑うが、おしゃべり

1
@ bit-twiddler-非常に奇妙です。この見解では、その経験にはあまり依存していませんが、他のロケールを調べました。私は両方のプログラミングスタイルが大好きで、一緒に教える必要があるようです。少し若い教授でも、この問題に対する熱心さの割合は同じではないことがわかりました。IMOは良いことです。手続き型が最初に重要だと考える人もいます。
Garet Claborn

1
@ bit-twiddler:ええ、でもそれは入門コースではありませんでした。これはデータベース設計の4年目の上級コースであり、c ++を使用することになっていた。以前のコースでc ++をこのような高いレベルに経験した後、それは間違っていると感じました。
Ape-in​​ago

0

私にとって2つの理由:1つのオブジェクト指向プログラミングは、手続き型プログラミングの問題を解決するために生まれました。したがって、いくつかの手続き型コーディングを記述してからOOで同じものを記述することで、違いを理解しやすくなります。

ここには追加の要素もあります。プログラミングのトピックについて教育する2つのアプローチです。可能な限り低いレベルから始めて(アセンブリーの例では、手続き型の多くの場所で、他のいくつかは回路で始まる)、次に(OO / Functional / Managedに向かって)上昇します。もう1つのアプローチは、物理的な世界(例:ブラウザー/ Windows 7など)から始めて、さらに深く行き始めることです。それぞれのアプローチには長所と短所があります。あなたの大学は最初のものを選び、手続き型から始めました。何らかの論理的根拠があるかもしれませんか、彼らは誰か他の人をコピーしただけです:-)。


1
「オブジェクト指向プログラミングは、手続き型プログラミングの問題を解決するようになりました。」それが目標でしたが、オブジェクト指向はそれが解決するのと同じくらい多くの問題を引き起こしました。
bit-tiddler 2011年

@ bit-twiddler:非常に大きな話。教育的側面に焦点を当てる(または絞り込む)ことで問題が発生します:これが何であったか、どのように改善されたか:それ(あなたはそれがより良いかどうかについて議論します)
Dimitrios Mistriotis

0

制度的慣性以外に理由はありません。CMUを見てください。彼らはOOPカリキュラム全体を捨て、関数型プログラミングに置き換えました。もう一度言いますが、あなたの質問への答えは、あなたが通っている学校の管理者によって行われた任意の選択であるということです。ここで私が行った事実の発言について誰かが疑問に思っている場合のために、CMUのカリキュラムを1人の教授/管理者が教えることについての投稿があります。


1
-1誤解を招く-CMUが初年度の CSカリキュラムからOOPを削除して関数型プログラミングに置き換えたと主張するスレッド(グーグル検索を介して)を見たが、公式のCMUカリキュラムはオブジェクトであるAliceプログラミング言語から始まる-指向[ enr-apps.as.cmu.edu/assets/SOC/CS_SPRING.htmを
Steven A. Lowe

1
@ davidk01:(1)回答の事実に反するアサーション。(2)alice.orgの「Aliceは、学生がオブジェクト指向プログラミングに初めて触れることができるように設計された、無料で利用できる教育ツールです」
Steven A. Lowe

2
@Steven A. Lowe:馬の口から直接:「オブジェクト指向プログラミングは入門カリキュラムから完全に排除されています。それは、その性質上、アンチモジュラーであり、反平行であり、したがって、最新のCSカリキュラムには適していないためです。オブジェクト指向の設計方法論について提案されている新しいコースは、このトピックを勉強したい学生のために2年生レベルで提供されます。」- 新入生にFPを教える
davidk01

1
@ davidk01:素晴らしいリンク、ありがとう。その記事で引用された委員会の論文から、「オブジェクト指向プログラミング(その無数の形式)は産業用ソフトウェア開発の主要なテーマとして残っていますが、Javaなどのオブジェクト指向言語を導入レベルで使用すると、かなりの複雑さと気が散ります。入門レベルでの中核的な目標から。入門レベルでの基礎にさらに集中できるように、OOの設計と実装の方法論を十分にカバーしてカリキュラムの後半に提供することが望ましいようです。」[重点鉱山] ...
スティーブンA. Loweの

1
@ davidk01:同意しないことに同意します。必要に応じて私を知識人と呼んでください。ただし、入門レベルの強調を変更することと「OOPカリキュラム全体を捨てる」との間には、大きな違いがあります。入門クラスの範囲を減らすことを「抜本的な変更」と呼ぶことはほとんどありません;-)
Steven A. Lowe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.