トップページ⇒tech
1001コメント388KB

【激突】関数型言語 VS オブジェクト指向言語2

■ このスレッドは過去ログ倉庫に格納されています
0001営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:26:47.61
一般的には、オブジェクト指向型言語が優勢でが
一部には関数型言語を崇拝している人もいます

どちらが上なのか、この際はっきりさせましょう

前スレ http://toro.2ch.net/test/read.cgi/tech/1331328955/
0002営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:27:35.64
オブジェクト指向 ∋ (関数型言語 VS 手続き型言語)
http://toro.2ch.net/test/read.cgi/tech/1333801632/
0003営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:29:47.00
前スレ>>1000
> それならそれでFILTERでも変更できるインターフェースを付け加えればいいだけ。

そういう変更/拡張のし易さも議論の対象
ちゃんと変更したコードを提出しないと比較にならない
負け惜しみじゃないんだろ?
0004営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:35:39.48
>>3
本来はフィルタでやることではないよ。
それわかってる?
0005営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:37:53.28
まあやるなら、

class Filter {
 private i = 0;
 private m = 0;

 begin(awk) {awk.RS=';'}
 filter(line) {i++; m = max(m, line.length()); }
 end() {print "最大文字数は"+m+"文字でした"}
}

こんな感じだろうw
0006営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:39:53.53
>>4
いいから「改行コードを変更する拡張をする」に対して
OOPでやるとどれくらい簡潔になるか、コードを出せって
疑似コードじゃなくて動くヤツな
0007営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:41:05.68
beginの引数が変わるのが好ましくない場合は
こんな感じかな。まあこの例ならsetuupでやればいいことだけど。

class Filter {
 private i = 0;
 private m = 0;
 private awk;

 setup(awk) {this.awk = awk}
 begin() {awk.RS=':'}
 filter(line) {i++; m = max(m, line.length()); }
 end() {print "最大文字数は"+m+"文字でした"}
 teardown() {this.awk = null}
}
0008営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:41:31.13
>>5
肝心の部分はどうしたんですか?
どうやってセパレートしたんですか?

そうやって誤摩化すってことは、関数型言語で一瞬で書けるコードが
OOPでは難しいってことですね?
0009営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:42:07.17
>>6
OOPでやると簡潔になるんじゃなくて、
変更の範囲を極小化出来るんだよ。

該当のフィルタだけの修正で、
それ以外の場所は何も変えないで変更できる。
0010営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:42:59.33
いいから代表的なコードは貼りなおせよ
使えないな
0011営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:43:29.55
>>8
え? 行フィルタなのに、ファイル全体をセパレートするのはおかしいでしょ?
ここにないのは、ここにあるべきじゃないコードだからだよ。
0012営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:43:49.61
じゃあ、問題をはっきりさせよう

「標準入力から文字列を読み込んで、カンマ区切りで改行して、
各行の文字数を数えて最大文字数を標準出力に表示せよ」

これを書いて
0013営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:45:14.12
設計がおかしいって指摘されて
ファビョってきたなw
全部関数なんかでやろうとするから
設計ができないんだ。
0014営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:46:27.84
>>12
それ問題が不適切。

「標準入力」から文字列を読み込んで、「カンマ区切りで改行」して、
「各行の文字数を数えて最大文字数」を「標準出力」に表示せよ

ただし、カッコの中は一例であり
容易に変更できる設計にしておくこと
0015営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:47:53.75
○から文字列を読み込んで、△で改行して、
各行に対して□を処理をして、その結果を☆に表示せよ

抽象化するとこんな感じか。
0016営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:49:26.82
またこういう例題か…
オレ何度も書いたし、もういいや今日は。
0017営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:50:59.80
コードが出ても議論が進まないことがはっきりしただけかw
0018営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:51:11.25
まず、リーダーインターフェースが必要。
そのリーダーインターフェースを実装した、
標準出力リーダークラスを作る。

行セパレータインターフェースが必要
その行セパレータインターフェースの実装として、
\r\nセパレータを作る

その後フィルタインタフェースが必要で
そのフィルタインタフェース(begin、filter、end)を実装した、
「各行の文字数を数えて最大文字数」はfilterで文字数を数えて
endで結果を出力する。

あとは、同様にライタインターフェースを実装した
標準出力ライタクラス。
0019営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:51:29.89
どうせなら、parottをJapaで書いたらこーんなに見通しのよいプログラムが短期間でできましたよ
とかそんくらいの成果聞いてみたいもんだわ
0020営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:52:01.14
結局拡張性をもたせようとすると、
こんな感じになるわけ。

例外が悪いという意味がわかったかな?
0021営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:53:56.24
能書きからして冗長までは良くわかった。
0022営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:54:17.31
関数型は実装の一つを書いているだけ。

オブジェクト指向は様々な実装を書くための仕組みを
提供するもの、つまり設計の部分なので
やることの対象が違うんだよ。

オブジェクト指向で枠組み設計を行い
関数型言語でその枠組みの中身を書く
0023営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:55:34.83
冗長というか、単にオブジェクト指向は、単処理よりも
広範囲な部分、処理の連携部分を記述する言語ってことなだけでしょ。
0024営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:57:26.44
この程度の例題で広範も減ったくれもない気がす
0025営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:58:48.39
>>22
> オブジェクト指向で枠組み設計を行い
> 関数型言語でその枠組みの中身を書く

こんな感じ?


{-# LANGUAGE RecordWildCards #-}
import System
import Control.Monad

data Filter a b = Filter { begin :: a, body :: a -> String -> b, end :: b -> IO () }

awkLike Filter{..} = end . body begin

countFilter = Filter {
              begin = Nothing,
              body = \_ -> maximum . map length . lines,
              end = \p -> putStrLn $ "最大文字数は" ++ show p ++ "文字でした"}

splitBy _ [] = []
splitBy p xs = a : (splitBy p $ drop 1 b) where (a, b) = break p xs

countFilterSplitBy sep filepath = countFilter {
  body = \_ -> maximum . map length . splitBy (== sep),
  end = \p -> writeFile filepath $ "最大文字数は" ++ show p ++ "文字でした"
}

main' = awkLike countFilter =<< getContents -- 例1: 標準入出力使用、普通にカウント
main = mapM_ (awkLike (countFilterSplitBy ',' "test.txt") <=< readFile) =<< getArgs -- 改行コードを変えて入出力先も変更
0026営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 22:00:33.04
>>25
おー、なかなか。パチパチ
0027営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 22:04:02.78
なんかお株奪われた?
0028営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 22:37:31.82
>容易に変更できる設計にしておくこと

ソースにパッチを当てて変更するのは容易ではないの?
パッチが容易ではないというのは、もしかして
「CUIは容易ではない」「GUIは容易」みたいな思想と関係あるのか
0029営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 00:08:18.23
> ソースにパッチを当てて変更するのは容易ではないの?
ソースにパッチ当てるといってもいろんな意味がある。

インターフェースを変更するようなソースの修正は容易ではない。
影響があちこちに波及するからだ。
0030営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 04:41:56.60
OOが使えそうなところにはOOの機能を使うし、
関数型が使えそうなところには関数型の機能を使う。
両方使えそうにないところは普通の手続き型の格好に。たったそれだけのことだろ?
「関数型 vs オブジェクト指向」 からは、「if文 vs for文」並みのナンセンスさを感じるね。
OOも関数型も単なる一機能なんだから、状況に合わせて 使う/使わない すればよいじゃない。
0031営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 04:57:44.26
なにも言ってないレスされても
0032営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 07:15:51.37
>>30
「関数型 vs オブジェクト指向」ならその通りなんだけど、
ここは「関数型言語 vs オブジェクト指向言語」なんだわ
0033営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 09:46:11.98
そういや関数型指向ってないよねw
0034営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 09:53:06.98
>>29
パッチの意味は追加と削除の二種類しかない。
マクロな視点でいうと、最新版を出す影響と古い安定版を切り捨てる影響の二つ。
現に大きな影響が出ているが、
関数型とオブジェクト指向の人間はこの問題についてなにも言ってない。
なぜなら、古い仕様が優遇されてしまうと手続き型が圧倒的に有利だから。
0035営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 09:55:37.49
>>34
具体的に言って下さい。
0036営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 10:00:13.98
>>33
functional (programming)
0037営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 10:35:21.46
一口にパッチと言っても

・ソースコード自体を書き換える方法
・ソースコードはそのままに静的に書き換える方法(マクロ、テンプレート)
・ソースコードはそのままに実行時に書き換える方法(モンキーパッチ)

などがあるのですが
0038営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 11:01:10.34
>>37
文字列自体を操作する方法と、文字列に代わるものを操作する方法があるよね
0039営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 11:13:21.18
>>33
個人的に、関数型言語は「型指向」だと思う
どう言う型受け取って、どう言う型を変えしたいのか考えると、自然と答えが出て来る
0040営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 11:22:39.91
>>37
それらの区別はたいして何も変わらんw
0041営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 11:25:46.31
個人的には、OOPLだと設計がしっかりしてないと拡張するとき困ること多いけど、関数型言語だと、設計を意識しなくても(行き当たりばったりでも)拡張しやすい感触がある
納期に迫られ、ろくに設計できる環境も、人材も無い現場では関数型言語の方が向いてると思うんだが・・・


checkPermu ns = and.concat $ check ns
where
check [] = [[]]
check (x:xs) = map (x/=) xs : check xs

allPattern 0 _ = [[]]
allPattern _ [] = [[]]
allPattern n (ns:nss) = [x:xs | x <- ns, xs <- allPattern (n-1) nss]

-- 普通に作ったpermutations(使用例:permutations [1..3])
permutations ns = permutations' (length ns) ns
where
permutations' 0 _ = [[]]
permutations' _ [] = [[]]
permutations' n ns = [x:xs | x <- ns, xs <- permutations' (n-1) ns, checkPermu (x:xs)]

-- 汎用的なallPatternを作って、それに差し替えたpermutations
permutations2 ns= filter checkPermu $ allPattern (length ns) (replicate (length ns) ns)

-- allPatternを使った拡張版permutations(使用例:permutationsEx 3 [[1..3],[1..3],[1..3]])
permutationsEx n ns= filter checkPermu $ allPattern n ns
0042営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 11:45:02.42
>>40
全然違うだろアホか
0043営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 12:11:04.47
>>39
節子、動的・動的…
0044営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 12:22:28.84
>>18の方針でJavaで実装したら100行超えた……
やっぱOOPはウンコだわ……
0045営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 12:33:46.77
でも関数型でも50歩100歩だったよ・・・
0046営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 12:34:12.65
>>41
俺は

「設計を意識しないとそもそも書けない」のが関数型言語で
手続き型言語やOOPLはメチャクチャな設計でも書けるor書けてしまうが
ちゃんと意識すると関数型言語にも通ずるようなコードが出来上がる

…と感じる
0047営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 12:34:19.20
じゃあRubyで実装しましょうよw
0048営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 12:37:13.94
俺は
設計・・・オブジェクト指向
実装・・・関数型言語
って感じるな。
0049営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 12:47:10.04
UMLがアップを始めました
0050営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 13:16:53.33
単なる型スイッチに夢おいもとめんなって。
OOだって実装の道具にすぎん。ハンマーやカンナの類だ。
0051営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 13:29:13.33
実装の道具は、OOPLだよ。
OOにはOOA(分析)やOOD(設計)があって
開発プロセス全体をカバーするものなんだ。

OOPLはOOによる開発プロセスを素直に実装するための言語

分析や設計がなぜOOなのかというと、それが一番
システム開発に適しているから。
そしてその分析、設計に一番適している実装がOOPL

関数型による分析や設計が出てこないことには
関数型は実装のみにしか適用されずに終わるよ。
0052営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 13:33:38.15
OOPLが先にあって、それを生かす形でOOAやOODが生まれたわけで。
夢見ちゃったって感じだね。
0053営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 13:36:27.78
>分析や設計がなぜOOなのかというと、それが一番
>システム開発に適しているから。

正しくはこうだね。

分析や設計がなぜOOなのかというと、使う言語がOOPLだから。
0054営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 13:40:00.97
結局無記名で議論すると個人の感想の叫びあいなんだよね
0055営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 13:51:51.24
関数型における分析と設計が出ない時点で
実装のみの技術ってことだろうね。
0056営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 13:53:30.17
>>47
何を?
0057営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 14:02:15.98
関数と述語による形式的仕様記述やZ言語は?
0058営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 14:49:46.34
OOP より FPのほうが響きがいい よってFPの勝ち。
0059営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 15:50:29.78
>>56
流れ的に>>41
■ このスレッドは過去ログ倉庫に格納されています