オブジェクト指向プログラミングと手続き型プログラミングの違い
オブジェクト指向プログラミングと手続き型プログラミングの違いがよくわかりません。例などを出して分かりやすく教えていただけませんか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
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
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。