質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

2回答

3497閲覧

オブジェクト指向プログラミングと手続き型プログラミングの違い

_Victorique__

総合スコア1392

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2017/04/20 10:06

オブジェクト指向プログラミングと手続き型プログラミングの違い

オブジェクト指向プログラミングと手続き型プログラミングの違いがよくわかりません。例などを出して分かりやすく教えていただけませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iwamoto_takaaki

2017/04/21 01:33

判らない理由がわかりません。例などを出して分かりやすく教えてください。
guest

回答2

0

わかりやすい説明はあちこちに溢れています。それを見てなお分からなかったのなら、ここで僅かな説明を見ても同じでしょう。

それよりは自分がどう理解しているかを述べて、その間違った部分を正してもらうのがいいのではないかと思います。

投稿2017/04/20 10:27

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

手続き型というのはその定義が少しぶれる場合があります。定義の仕方によっては手続き型とオブジェクト指向は直交した概念になり得ます。そこで、広義の手続き型かそうでないか、オブジェクト指向かそうでないかを見比べます。手続き型は命令型と同義の場合が多いですが、非手続き型にはいくつか種類がありますので関数型を採用します。

【点の移動距離】
二次元平面において、複数の点が与えられる。初期位置を点(0,0)として、最初に与えられた点まで線分を引く。その点からまた与えられた点まで線分を引く。全ての線分の長さの合計を求めよ。
最初行には与えられる点の個数N(0<N<=1000)が与えられる。次の行から、点のX座標とY座標を示す整数値(-1000<=X<=1000)が空白区切りで与えられる。
長さの精度は必要としない。

N X0 Y0 ... XN YN

上記の問題をとくプログラムをサンプルとして提示します。

言語はCrystalです。Rubyに似てますがRubyではありません。提示するのは全体として構成の考え方です。全てがそうなっているというわけではありません。特に関数型については純粋関数型ではありません(純粋関数型にするにはモナドがないとIO関係を書くことが難しいです)。

命令型オブジェクト指向

Crystal

1struct Point 2 property x, y 3 def initialize(@x : Int32, @y : Int32) 4 end 5end 6 7struct Data 8 property point, length 9 def initialize(@point = Point.new(0, 0), @length = 0.0) 10 end 11end 12 13def move(data_pointer : Pointer(Data), next_point : Point) : Nil 14 data = data_pointer.value 15 length = Math.sqrt((data.point.x - next_point.x)**2 + 16 (data.point.y - next_point.y)**2) 17 data.point.x = next_point.x 18 data.point.y = next_point.y 19 data.length += length 20 data_pointer.value = data 21end 22 23n = gets.to_s.to_i 24data = Data.new 25n.times do 26 x, y = gets.to_s.split.map {|s| s.to_i} 27 point = Point.new(x, y) 28 move(pointerof(data), point) 29end 30puts data.length

命令型オブジェクト指向

Crystal

1class Point 2 property x, y 3 def initialize(@x : Int32, @y : Int32) 4 end 5end 6 7class Data 8 property point, length 9 def initialize(@point = Point.new(0, 0), @length = 0.0) 10 end 11 def move(next_point : Point) : Nil 12 length = Math.sqrt((@point.x - next_point.x)**2 + 13 (@point.y - next_point.y)**2) 14 @point.x = next_point.x 15 @point.y = next_point.y 16 @length += length 17 nil 18 end 19end 20 21n = gets.to_s.to_i 22data = Data.new 23n.times do 24 x, y = gets.to_s.split.map {|s| s.to_i} 25 point = Point.new(x, y) 26 data.move(point) 27end 28puts data.length

関数型オブジェクト指向

Crystal

1struct Point 2 getter x, y 3 def initialize(@x : Int32, @y : Int32) 4 end 5end 6 7struct Data 8 getter point, length 9 def initialize(@point = Point.new(0, 0), @length = 0.0) 10 end 11end 12 13def move(data : Data, next_point : Point) 14 length = Math.sqrt((data.point.x - next_point.x)**2 + 15 (data.point.y - next_point.y)**2) 16 Data.new(next_point, data.length + length) 17end 18 19n = gets.to_s.to_i 20point_list = n.times.map do 21 x, y = gets.to_s.split.map {|s| s.to_i} 22 Point.new(x, y) 23end 24data = point_list.reduce(Data.new) do |acc, point| 25 move(acc, point) 26end 27puts data.length

関数型オブジェクト指向

Crystal

1class Point 2 getter x, y 3 def initialize(@x : Int32, @y : Int32) 4 end 5end 6 7class Data 8 getter point, length 9 def initialize(@point = Point.new(0, 0), @length = 0.0) 10 end 11 def move(next_point : Point) 12 length = Math.sqrt((@point.x - next_point.x)**2 + 13 (@point.y - next_point.y)**2) 14 Data.new(next_point, @length + length) 15 end 16end 17 18n = gets.to_s.to_i 19point_list = n.times.map do 20 x, y = gets.to_s.split.map {|s| s.to_i} 21 Point.new(x, y) 22end 23data = point_list.reduce(Data.new) do |acc, point| 24 acc.move(point) 25end 26puts data.length

投稿2017/04/20 14:09

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問