前スレ
オブジェクト指向って自然な文法だな 2
http://echo.2ch.net/test/read.cgi/tech/1490506257/
探検
オブジェクト指向って自然な文法だな 3 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/04/02(日) 16:30:38.65ID:n7h/bBRg
697デフォルトの名無しさん
2017/06/03(土) 15:57:20.13ID:59j26kfv >>695
たしかに、昔に比べれば仮想化が当たり前になりましたしそうかも知れませんね。
急ごしらえですが、昼間寝てしまったので3時から急ごしらえで作りました。
使い勝手悪いので、行番号振ったりと改良の余地ありです。
import System.Environment
import Data.List
filterOfLine word = unlines.(filter (isInfixOf word)).lines
main = getArgs >>= \(file:word:_) -> readFile file >>= putStrLn.filterOfLine word
IOな関数は全部mainの方にあるので、自作するのはfilterOfLineのunlines,filter,isInfixOf,linesの4つということになりますね。
たしかに、昔に比べれば仮想化が当たり前になりましたしそうかも知れませんね。
急ごしらえですが、昼間寝てしまったので3時から急ごしらえで作りました。
使い勝手悪いので、行番号振ったりと改良の余地ありです。
import System.Environment
import Data.List
filterOfLine word = unlines.(filter (isInfixOf word)).lines
main = getArgs >>= \(file:word:_) -> readFile file >>= putStrLn.filterOfLine word
IOな関数は全部mainの方にあるので、自作するのはfilterOfLineのunlines,filter,isInfixOf,linesの4つということになりますね。
698デフォルトの名無しさん
2017/06/03(土) 16:19:39.76ID:59j26kfv まずunlines
unlines [] = []
unlines (xs:xss) = xs ++ "\n" ++ unlines xss
ちなみに、++も自作出来ます。
(全ての中沖演算子はカッコで囲めば2引数の関数になります)
(++) xs [] = xs
(++) [] ys = ys
(++) (x:xs) ys = x:(++) xs ys
unlines [] = []
unlines (xs:xss) = xs ++ "\n" ++ unlines xss
ちなみに、++も自作出来ます。
(全ての中沖演算子はカッコで囲めば2引数の関数になります)
(++) xs [] = xs
(++) [] ys = ys
(++) (x:xs) ys = x:(++) xs ys
699デフォルトの名無しさん
2017/06/03(土) 16:42:14.38ID:59j26kfv 次にfilter
filter _ [] = []
filter f (x:xs) | f x == True = x:filter f xs
filter f (x:xs) | f x == False = filter f xs
filter _ [] = []
filter f (x:xs) | f x == True = x:filter f xs
filter f (x:xs) | f x == False = filter f xs
700デフォルトの名無しさん
2017/06/03(土) 17:03:05.77ID:59j26kfv isInfixOf
isInfixOf _ [] = False
isInfixOf xs ys | take (length xs) ys == xs = True
isInfixOf xs (y:ys) = isInfixOf xs ys
もちろんtake,lengthも自作可能。
take _ [] = []
take 0 _ = []
take n (x:xs) = x:take (n - 1) xs
length [] = 0
length (_:xs) = 1 + length xs
lengthはリストー>値なので末尾再起にしないとスタック消費するので、
末尾再起な補助関数使って作ったほうが良いですが。
length xs = length' 0 xs
......................where
.........................length' n [] = n
.........................length' n (_:ns) = length' (n + 1) ns
isInfixOf _ [] = False
isInfixOf xs ys | take (length xs) ys == xs = True
isInfixOf xs (y:ys) = isInfixOf xs ys
もちろんtake,lengthも自作可能。
take _ [] = []
take 0 _ = []
take n (x:xs) = x:take (n - 1) xs
length [] = 0
length (_:xs) = 1 + length xs
lengthはリストー>値なので末尾再起にしないとスタック消費するので、
末尾再起な補助関数使って作ったほうが良いですが。
length xs = length' 0 xs
......................where
.........................length' n [] = n
.........................length' n (_:ns) = length' (n + 1) ns
701デフォルトの名無しさん
2017/06/03(土) 19:06:03.31ID:59j26kfv 最後にlines
変なところでハマってました・・・。
lines ns = lines' [] ns
...................where
......................lines' [] [] = []
......................lines' ys [] = ys:lines' [] []
......................lines' ys ('\n':xs) = ys:lines' [] xs
......................lines' ys (x:xs) = lines' (ys ++ [x]) xs
変なところでハマってました・・・。
lines ns = lines' [] ns
...................where
......................lines' [] [] = []
......................lines' ys [] = ys:lines' [] []
......................lines' ys ('\n':xs) = ys:lines' [] xs
......................lines' ys (x:xs) = lines' (ys ++ [x]) xs
702デフォルトの名無しさん
2017/06/03(土) 19:54:54.78ID:rGTJ2+S3 そういうのはブログでやっていただいて・・・
703デフォルトの名無しさん
2017/06/03(土) 21:44:39.04ID:3br47TQ3 たぶん2chしか書くところないんだよ
かわいそうに
かわいそうに
704デフォルトの名無しさん
2017/06/03(土) 21:46:14.14ID:ZuJ0I9j5 もともと糞スレだし
705デフォルトの名無しさん
2017/06/04(日) 11:29:48.53ID:1QhdW1ES てす
706デフォルトの名無しさん
2017/06/04(日) 14:24:55.57ID:vTKCXAGF >>697
ありがとございます
リストとパターンマッチのコンビは強力ですね
お礼がてら GNU Smalltalk でも書いてみました
普通に手続き的に書くとこんな感じです(インデントの全角スペースは適宜置き換えてください)
#!/path/to/gst -f
argv := Smalltalk arguments.
file := argv first.
word := argv second.
stream := FileStream open: file mode: FileStream read.
[stream atEnd] whileFalse: [
| line |
line := stream nextLine.
(line indexOfSubCollection: word) > 0 ifTrue: [line displayNl]].
stream close
少しだけ関数型的なものを意識するとこんな感じになりますか
#!/path/to/gst -f
argv := Smalltalk arguments.
file := argv first.
word := argv second.
lines := file asFile contents lines.
filtered := lines select: [:str | (str indexOfSubCollection: word) > 0].
joined := String join: filtered separatedBy: Character nl asString.
joined displayNl
ありがとございます
リストとパターンマッチのコンビは強力ですね
お礼がてら GNU Smalltalk でも書いてみました
普通に手続き的に書くとこんな感じです(インデントの全角スペースは適宜置き換えてください)
#!/path/to/gst -f
argv := Smalltalk arguments.
file := argv first.
word := argv second.
stream := FileStream open: file mode: FileStream read.
[stream atEnd] whileFalse: [
| line |
line := stream nextLine.
(line indexOfSubCollection: word) > 0 ifTrue: [line displayNl]].
stream close
少しだけ関数型的なものを意識するとこんな感じになりますか
#!/path/to/gst -f
argv := Smalltalk arguments.
file := argv first.
word := argv second.
lines := file asFile contents lines.
filtered := lines select: [:str | (str indexOfSubCollection: word) > 0].
joined := String join: filtered separatedBy: Character nl asString.
joined displayNl
707デフォルトの名無しさん
2017/06/10(土) 02:56:29.64ID:THjn34iS >>706
結局メソッド頼りですね。。。
いあ、全てがオブジェクト故のメソッド依存ですね。
Cとかなら、むしろ長くはなりますがロジック部分の関数は自作出来ますもんね。
Haskellの例はよく車輪の再発明と馬鹿にされますが、車輪の再発明しやすいと言うことは、少ない知識で基本的な関数から応用的な関数まで作れると言うことだと思います。
>>697を複数ファイルで串刺し検索と行番号表示に対応させてみました。
(myfunc.hs + searchword.hs)
使用例:
>searchword numbering myfunc.hs number.hs
行番号表示機能のみのコードを以前作ってて、それを改良した形です。
(myfunc.hs + number.hs)
ファイルにmyfunc.hs + OOとなってる通り、共通だったり今後も関数として使いそうなものはライブラリとして括り出してみました。
結局メソッド頼りですね。。。
いあ、全てがオブジェクト故のメソッド依存ですね。
Cとかなら、むしろ長くはなりますがロジック部分の関数は自作出来ますもんね。
Haskellの例はよく車輪の再発明と馬鹿にされますが、車輪の再発明しやすいと言うことは、少ない知識で基本的な関数から応用的な関数まで作れると言うことだと思います。
>>697を複数ファイルで串刺し検索と行番号表示に対応させてみました。
(myfunc.hs + searchword.hs)
使用例:
>searchword numbering myfunc.hs number.hs
行番号表示機能のみのコードを以前作ってて、それを改良した形です。
(myfunc.hs + number.hs)
ファイルにmyfunc.hs + OOとなってる通り、共通だったり今後も関数として使いそうなものはライブラリとして括り出してみました。
708デフォルトの名無しさん
2017/06/10(土) 02:58:17.25ID:THjn34iS myfunc.hs
module Myfunc where
import Data.List
import Text.Printf
consNum::(Int,String) -> String
consNum (i,xs) = printf "%4d:%s" i xs
numbering = unlines.(map consNum).(zip [1..]).lines
searchWord w = unlines.(filter (isInfixOf w)).lines
putFileContent (f,cs) = printf "%s\n%s" f cs
number.hs
import System.Environment
import Myfunc
zipFileContent fs = return.(zip fs).map numbering
main = getArgs >>= \files -> mapM readFile files >>=
............zipFileContent files >>= mapM_ putFileContent
module Myfunc where
import Data.List
import Text.Printf
consNum::(Int,String) -> String
consNum (i,xs) = printf "%4d:%s" i xs
numbering = unlines.(map consNum).(zip [1..]).lines
searchWord w = unlines.(filter (isInfixOf w)).lines
putFileContent (f,cs) = printf "%s\n%s" f cs
number.hs
import System.Environment
import Myfunc
zipFileContent fs = return.(zip fs).map numbering
main = getArgs >>= \files -> mapM readFile files >>=
............zipFileContent files >>= mapM_ putFileContent
709デフォルトの名無しさん
2017/06/10(土) 02:58:44.23ID:THjn34iS searchword.hs
import System.Environment
import Myfunc
zipFileContent w fs = return.(zip fs).
...................................map ((searchWord w).numbering)
main = getArgs >>=
............\(word:files) -> mapM readFile files >>=
............zipFileContent word files >>= mapM_ putFileContent
import System.Environment
import Myfunc
zipFileContent w fs = return.(zip fs).
...................................map ((searchWord w).numbering)
main = getArgs >>=
............\(word:files) -> mapM readFile files >>=
............zipFileContent word files >>= mapM_ putFileContent
710デフォルトの名無しさん
2017/06/10(土) 22:48:53.27ID:puKcV3/9 >>707
> Cとかなら、むしろ長くはなりますがロジック部分の関数は自作出来ますもんね。
いや、メソッドでもロジックは記述できますよ→http://ideone.com/xiEftE
逆にできないと考える理屈がちょっとわかりかねます
> 少ない知識で基本的な関数から応用的な関数まで作れると言うこと
言語それ自体の学習には向いていますね
SmalltalkはライブラリはもちろんIDEを含む処理系それ自体もSmalltalkで組まれているので
普段自分が使っている機能がどのように実現されているかを調べる過程で学習ができます
GNU Smalltalkはそこらへんがちょっと弱いのが難点ですね
無用かとは思いましたが、通常の方法で記述したナンバリング+複数ファイル対応版も
#!/usr/bin/gst -f
(argv := Smalltalk arguments) isEmpty ifFalse: [
word := argv first.
files := argv allButFirst.
files do: [:file |
| count |
file displayNl.
stream := FileStream open: file mode: FileStream read.
count := 0.
[stream atEnd] whileFalse: [
| line |
count := count + 1.
line := (count printPaddedWith: Character space to: 4), ':', stream nextLine.
(line indexOfSubCollection: word) > 0 ifTrue: [line displayNl]].
stream close]
]
> Cとかなら、むしろ長くはなりますがロジック部分の関数は自作出来ますもんね。
いや、メソッドでもロジックは記述できますよ→http://ideone.com/xiEftE
逆にできないと考える理屈がちょっとわかりかねます
> 少ない知識で基本的な関数から応用的な関数まで作れると言うこと
言語それ自体の学習には向いていますね
SmalltalkはライブラリはもちろんIDEを含む処理系それ自体もSmalltalkで組まれているので
普段自分が使っている機能がどのように実現されているかを調べる過程で学習ができます
GNU Smalltalkはそこらへんがちょっと弱いのが難点ですね
無用かとは思いましたが、通常の方法で記述したナンバリング+複数ファイル対応版も
#!/usr/bin/gst -f
(argv := Smalltalk arguments) isEmpty ifFalse: [
word := argv first.
files := argv allButFirst.
files do: [:file |
| count |
file displayNl.
stream := FileStream open: file mode: FileStream read.
count := 0.
[stream atEnd] whileFalse: [
| line |
count := count + 1.
line := (count printPaddedWith: Character space to: 4), ':', stream nextLine.
(line indexOfSubCollection: word) > 0 ifTrue: [line displayNl]].
stream close]
]
711デフォルトの名無しさん
2017/06/10(土) 23:22:11.89ID:Lo444BJb >>710
ちゃうちゃう。
関数やメソッド抜きと言うか、知識がない場合でもって意味。
確かにsmalltalkの場合はガンガン調べられるのが強みですが。
うーん。。。調べる能力と作る能力の違いと言うのでしょうかね。。。
実際問題、smalltalk程の検索性は無いものの、haskellの関数もhoogleで大体ソース見れるんですが、今回敢えて見ませんでした。
(実はlinesだけ見たけど、逆に複雑過ぎて訳わかめでした)
実際のソースは効率とか可搬性も考慮されたソースですから、私ごときのソースと同じと言うことはないですが、表面上の動きだけは真似られます。
私の中では分岐さえ言語でサポートしてくれれば、ロジック部の自作はどんな言語でも可能で(チューリング同等)、haskellは分岐でifとかの余計な文字入れなくて済むのが楽だなぁとか、リストが基本だからアルゴリズムと相性良いなぁとかですかね。
配列だとリストが基本のアルゴリズムから、配列だったらどう実現する?って考えますから。
多分、最前線でプログラマしてる人はそう言うのを自然としてるんでしょうけど、私みたいなヘッポコは一旦haskellでワンクッション置くと普通の言語でもコード書ける様になりますね。
(少なくとも私は)
ちゃうちゃう。
関数やメソッド抜きと言うか、知識がない場合でもって意味。
確かにsmalltalkの場合はガンガン調べられるのが強みですが。
うーん。。。調べる能力と作る能力の違いと言うのでしょうかね。。。
実際問題、smalltalk程の検索性は無いものの、haskellの関数もhoogleで大体ソース見れるんですが、今回敢えて見ませんでした。
(実はlinesだけ見たけど、逆に複雑過ぎて訳わかめでした)
実際のソースは効率とか可搬性も考慮されたソースですから、私ごときのソースと同じと言うことはないですが、表面上の動きだけは真似られます。
私の中では分岐さえ言語でサポートしてくれれば、ロジック部の自作はどんな言語でも可能で(チューリング同等)、haskellは分岐でifとかの余計な文字入れなくて済むのが楽だなぁとか、リストが基本だからアルゴリズムと相性良いなぁとかですかね。
配列だとリストが基本のアルゴリズムから、配列だったらどう実現する?って考えますから。
多分、最前線でプログラマしてる人はそう言うのを自然としてるんでしょうけど、私みたいなヘッポコは一旦haskellでワンクッション置くと普通の言語でもコード書ける様になりますね。
(少なくとも私は)
712デフォルトの名無しさん
2017/06/11(日) 10:27:47.17ID:mVtMB5qw >>711
> 分岐さえ言語でサポートしてくれれば、ロジック部の自作はどんな言語でも可能で(チューリング同等)
仰りたいことは分かるのですが、マシン語やラムダ式ましてチューリングマシンで何かを記述するのは
知的愉しみや学術・学習目的でならともかく、通常のプログラミングにおいては苦痛しかもたらしません
生産性を考えるなら、言語の機能や特性は
車輪の再発明のしやすさより、あるレベルまでのレイヤーの適切な抽象化に費やされるべきです
そういう切り口でメッセージングというパラダイムはいろいろなレベルの抽象化されたレイヤーに乗っけて
便利に使えるので私は気に入っています
> 分岐さえ言語でサポートしてくれれば、ロジック部の自作はどんな言語でも可能で(チューリング同等)
仰りたいことは分かるのですが、マシン語やラムダ式ましてチューリングマシンで何かを記述するのは
知的愉しみや学術・学習目的でならともかく、通常のプログラミングにおいては苦痛しかもたらしません
生産性を考えるなら、言語の機能や特性は
車輪の再発明のしやすさより、あるレベルまでのレイヤーの適切な抽象化に費やされるべきです
そういう切り口でメッセージングというパラダイムはいろいろなレベルの抽象化されたレイヤーに乗っけて
便利に使えるので私は気に入っています
713デフォルトの名無しさん
2017/06/11(日) 13:31:27.60ID:APfeVpAp なにこの気持ち悪いスレ
714デフォルトの名無しさん
2017/06/11(日) 14:03:25.44ID:QGjh7z3B Person taro = new Person();
みたいな典型的な文法使ってくれる文には問題ないが、
関数内や引数のカッコ内で new したり、
コンストラクタ内でさらに new したり、
Person(new Car() ) みたいにコンストラクタの引数内でnewしてたり、
オブジェクト名のはずが array['taro'] みたいにクォートで囲まれて
'文字列' として連想配列のキーに指定されたりすると、
俺の中での「オブジェクト」のイメージが色々と崩壊する。
これどう解釈すりゃいいの?ってなる。
みたいな典型的な文法使ってくれる文には問題ないが、
関数内や引数のカッコ内で new したり、
コンストラクタ内でさらに new したり、
Person(new Car() ) みたいにコンストラクタの引数内でnewしてたり、
オブジェクト名のはずが array['taro'] みたいにクォートで囲まれて
'文字列' として連想配列のキーに指定されたりすると、
俺の中での「オブジェクト」のイメージが色々と崩壊する。
これどう解釈すりゃいいの?ってなる。
715デフォルトの名無しさん
2017/06/11(日) 14:03:32.47ID:EE9uqNnE HaskellerとSmalltalkerの最底辺の争い
716デフォルトの名無しさん
2017/06/11(日) 14:36:30.58ID:xLXJwyhz >>714
お前のオブジェクトのイメージがおかしいんじゃね?
お前のオブジェクトのイメージがおかしいんじゃね?
717デフォルトの名無しさん
2017/06/11(日) 16:54:46.48ID:8HTADEw1 オブジェクト指向は「playと言ったら"再生"のことだろう」って
コードのわかりやすさ優先だけど
関数言語は「?って書いたらPRINTのことに決まってるだろ」って
『略語でタイプが減ってサイコー』厨が推進してる臭くて
どうにも胡乱(うろん:確かでなく、怪しいこと。うさんくさいこと)なものを感じる。
コードのわかりやすさ優先だけど
関数言語は「?って書いたらPRINTのことに決まってるだろ」って
『略語でタイプが減ってサイコー』厨が推進してる臭くて
どうにも胡乱(うろん:確かでなく、怪しいこと。うさんくさいこと)なものを感じる。
718デフォルトの名無しさん
2017/06/11(日) 17:41:37.82ID:zRaXS3h8 感想文
719デフォルトの名無しさん
2017/06/11(日) 20:23:12.88ID:dQP1iB/o Haskellは実装が簡単
オブジェクト指向言語はクラスリファレンスがすべて
オブジェクト指向言語はクラスリファレンスがすべて
720デフォルトの名無しさん
2017/06/12(月) 08:23:44.68ID:SBdQG7Q8 >>712
それって結局ライブラリが揃っていて、探しやすければオブジェクト指向とか構造化プログラミングとか関数型とかのパラダイムはどうでも良いって言ってる様なものだなと。
そして、実際その通りなんですが、全てのプログラムのパターンを網羅するライブラリは事実上不可能です。
Delphiのコンポーネントでpascalインタプリタがあってポトペタで一行のコードも書かずにpascal処理系を作れたとしても。
結局どの言語もライブラリの関数なりクラスなりを組み合わせます。
smalltalkは検索しやすい方向へ進化し、Haskellは自作しやすい方向に進化したんじゃ無いかと。
そのsmalltalkコードは出力に依存してますが、私もRubyやPythonでよく書きます。
Haskellの場合は強制的に出力に依存しないコードになるので、number.hsのコードの最後の行を
mapM_ (putFileContent.(\(f, c) -> (f, searchWord word c)))
の様にputFileContentの受け取る値を横取りしてsearchwordコマンドを作っても良いです。
型さえ考慮すればnumbering以降から出力直前まで、好きな段階でsearchWord関数を使えます。
numberingとsearchWordそれぞれlines/unlines使ってるので汎用性高い代わりに無駄な処理も多いと言うなら、汎用性を犠牲にしてsearchWordにnumberingの中身を入れてしまえば良いです。
この様に特異な発想?にも柔軟に答えてくれます。
それって結局ライブラリが揃っていて、探しやすければオブジェクト指向とか構造化プログラミングとか関数型とかのパラダイムはどうでも良いって言ってる様なものだなと。
そして、実際その通りなんですが、全てのプログラムのパターンを網羅するライブラリは事実上不可能です。
Delphiのコンポーネントでpascalインタプリタがあってポトペタで一行のコードも書かずにpascal処理系を作れたとしても。
結局どの言語もライブラリの関数なりクラスなりを組み合わせます。
smalltalkは検索しやすい方向へ進化し、Haskellは自作しやすい方向に進化したんじゃ無いかと。
そのsmalltalkコードは出力に依存してますが、私もRubyやPythonでよく書きます。
Haskellの場合は強制的に出力に依存しないコードになるので、number.hsのコードの最後の行を
mapM_ (putFileContent.(\(f, c) -> (f, searchWord word c)))
の様にputFileContentの受け取る値を横取りしてsearchwordコマンドを作っても良いです。
型さえ考慮すればnumbering以降から出力直前まで、好きな段階でsearchWord関数を使えます。
numberingとsearchWordそれぞれlines/unlines使ってるので汎用性高い代わりに無駄な処理も多いと言うなら、汎用性を犠牲にしてsearchWordにnumberingの中身を入れてしまえば良いです。
この様に特異な発想?にも柔軟に答えてくれます。
721デフォルトの名無しさん
2017/06/12(月) 11:40:59.36ID:P8Snx3xG >>720
> 全てのプログラムのパターンを網羅するライブラリは事実上不可能
ライブラリで、将来起きうるすべてのパターンを網羅しろというのは極論では?
学習目的でないなら車輪の再発明は避けるべきだし
よく使うパターンならライブラリ化(抽象化)されるべきだろうという主張に対し
件のご指摘は本末を転倒しています
> そのsmalltalkコードは出力に依存してます
「出力に依存する」ということの意味がわかりにくいのですが
抽出結果を各行逐次出力しているのが気にくわないのでしょうか?
それならそうでない処理の流れにすれば済む話で実際にも容易に書けます
(>>706 の2番目や >>706 の http://ideone.com/xiEftE 、http://ideone.com/RUJP49 )
当初要求された仕様がどうなっていたか、何を重視するかといった方針の齟齬に過ぎないと思います
逆にたとえばご呈示のHsakellのコードで
メモリに一気には読み込めない巨大なファイルを扱わなければならないとしたら
今の枠組みのまま対応することはできないでしょう?それと同じ話です
> 全てのプログラムのパターンを網羅するライブラリは事実上不可能
ライブラリで、将来起きうるすべてのパターンを網羅しろというのは極論では?
学習目的でないなら車輪の再発明は避けるべきだし
よく使うパターンならライブラリ化(抽象化)されるべきだろうという主張に対し
件のご指摘は本末を転倒しています
> そのsmalltalkコードは出力に依存してます
「出力に依存する」ということの意味がわかりにくいのですが
抽出結果を各行逐次出力しているのが気にくわないのでしょうか?
それならそうでない処理の流れにすれば済む話で実際にも容易に書けます
(>>706 の2番目や >>706 の http://ideone.com/xiEftE 、http://ideone.com/RUJP49 )
当初要求された仕様がどうなっていたか、何を重視するかといった方針の齟齬に過ぎないと思います
逆にたとえばご呈示のHsakellのコードで
メモリに一気には読み込めない巨大なファイルを扱わなければならないとしたら
今の枠組みのまま対応することはできないでしょう?それと同じ話です
722デフォルトの名無しさん
2017/06/12(月) 12:20:40.28ID:OM2jEsCX ?
遅延評価なのでどんなに巨大なファイルを一気に読む様なコードに見えても、実際には表示するぶんずつしか読み込まれませんが。。。
遅延評価なのでどんなに巨大なファイルを一気に読む様なコードに見えても、実際には表示するぶんずつしか読み込まれませんが。。。
723デフォルトの名無しさん
2017/06/12(月) 13:05:25.72ID:6z3DqIFq724デフォルトの名無しさん
2017/06/12(月) 13:43:22.37ID:OM2jEsCX >>721
同じライブラリ化されるべきなら、より簡単にライブラリが作れた方が良いんじゃないか?と考えます。
また、ライブラリやクラスを使う際にはオブジェクト指向も関数型も差はないでしょうが、ライブラリを作る側だとクラスは使う時より楽じゃないと感じます。
同じライブラリ化されるべきなら、より簡単にライブラリが作れた方が良いんじゃないか?と考えます。
また、ライブラリやクラスを使う際にはオブジェクト指向も関数型も差はないでしょうが、ライブラリを作る側だとクラスは使う時より楽じゃないと感じます。
725デフォルトの名無しさん
2017/06/12(月) 13:58:04.43ID:OM2jEsCX >>723
普通の言語のreadLine的なのが遅延読み込みですよね?
Haskellは表示しない値は無いのと同じ、表示して再度使う予定もないなら用済み。
(その証拠に、読み込んで複雑な処理させるけど表示しないコードは、何が書かれていようとそもそも何もしない。無限リストを表示させるとかも良い例)
一見全部読む混んで全部表示するコード書いても、表示に必要な分だけ読み込んで、表示が終わったら破棄されていきます。
普通の言語の遅延読み込みに相当するものも、遅延評価が勝手に似た様な働きをしてくれます。
違うのは、行毎とは限らない事くらいです。
普通の言語のreadLine的なのが遅延読み込みですよね?
Haskellは表示しない値は無いのと同じ、表示して再度使う予定もないなら用済み。
(その証拠に、読み込んで複雑な処理させるけど表示しないコードは、何が書かれていようとそもそも何もしない。無限リストを表示させるとかも良い例)
一見全部読む混んで全部表示するコード書いても、表示に必要な分だけ読み込んで、表示が終わったら破棄されていきます。
普通の言語の遅延読み込みに相当するものも、遅延評価が勝手に似た様な働きをしてくれます。
違うのは、行毎とは限らない事くらいです。
726デフォルトの名無しさん
2017/06/12(月) 14:54:51.94ID:P8Snx3xG >>722
失念していました。であれば別の例を考えないといけないですね^^;
要は「部分読み込み→処理→出力」というスキームで進めなければならないシチュエーションでは
今のコードの枠組みは変えざるを得ないということが言いたかっただけです
ところでHaskellのreadFileというのは賢そいのですね
たとえば一番最後の行から逆順に出力するような場合
getArgs >>= \(file:_) -> readFile file >>= putStrLn . unlines . reverse . lines
でもファイル全体を読み込まずに済ませられる(つまり読み込むポジションのみ覚えていて適宜移動して読み込める)程度に賢いのですか?
失念していました。であれば別の例を考えないといけないですね^^;
要は「部分読み込み→処理→出力」というスキームで進めなければならないシチュエーションでは
今のコードの枠組みは変えざるを得ないということが言いたかっただけです
ところでHaskellのreadFileというのは賢そいのですね
たとえば一番最後の行から逆順に出力するような場合
getArgs >>= \(file:_) -> readFile file >>= putStrLn . unlines . reverse . lines
でもファイル全体を読み込まずに済ませられる(つまり読み込むポジションのみ覚えていて適宜移動して読み込める)程度に賢いのですか?
727デフォルトの名無しさん
2017/06/12(月) 16:50:34.40ID:uTHinYqc >>726
そこは痛い所ですね。。。
賢くないはずです。
Haskell.orgも、その弱点を知ってるので良い加減克服されててもおかしくないですが。。。
少なくとも不思議の国のアリスやこころのテキストをwebからコピペして読ませてますが、reverseしないのと体感速度に差が無いですね。
(一文字ずつreverseさせれば流石に体感速度下がりましたが、行毎は感じませんでした)
今時はメモリもGBが当たり前なので余程じゃないと体感出来ないのかも。。。
まあ、すでに(ターミナル次第ですが)Python/Rubyより遅かったりしますけどね。。。
(全面ByteString使用する様に書き換えれば同程度には高速化するでしょうが)
書き捨てコード同士では負けますが、ライブラリ化したらPython/Rubyの書き捨てコードより短くなります。
そこは痛い所ですね。。。
賢くないはずです。
Haskell.orgも、その弱点を知ってるので良い加減克服されててもおかしくないですが。。。
少なくとも不思議の国のアリスやこころのテキストをwebからコピペして読ませてますが、reverseしないのと体感速度に差が無いですね。
(一文字ずつreverseさせれば流石に体感速度下がりましたが、行毎は感じませんでした)
今時はメモリもGBが当たり前なので余程じゃないと体感出来ないのかも。。。
まあ、すでに(ターミナル次第ですが)Python/Rubyより遅かったりしますけどね。。。
(全面ByteString使用する様に書き換えれば同程度には高速化するでしょうが)
書き捨てコード同士では負けますが、ライブラリ化したらPython/Rubyの書き捨てコードより短くなります。
728デフォルトの名無しさん
2017/06/12(月) 20:22:55.90ID:Y8yY2E9Z Haskellでさ、ファイルを読み込んでアルファベット小文字を大文字に置き換えて
読み込んだファイルに上書きできる?
読み込んだファイルに上書きできる?
729デフォルトの名無しさん
2017/06/13(火) 09:56:27.83ID:OES2L0YQ Haskellに限らず楽勝ですね。
730デフォルトの名無しさん
2017/06/13(火) 10:23:22.38ID:+smkRKLD ウンコHaskellerには出来ないよ
731デフォルトの名無しさん
2017/06/13(火) 20:11:42.46ID:xFYZZfX+ >>730
いやあ、同名のファイルに直で保存しようとするとロックされるの失念してた。
そう言えばtempファイルがどうとかどっかで読んだなぁとかRWH読んでたけど見つけられなくて、
でも一旦別名で書き込めばtempファイルにこだわる必要無いじゃんって事で元のファイル名の頭にoutって付けて一旦保存して、
それを開き、内容をそのまま元のファイルに書き込んだった。
これこそ発想の転換w
いやあ、同名のファイルに直で保存しようとするとロックされるの失念してた。
そう言えばtempファイルがどうとかどっかで読んだなぁとかRWH読んでたけど見つけられなくて、
でも一旦別名で書き込めばtempファイルにこだわる必要無いじゃんって事で元のファイル名の頭にoutって付けて一旦保存して、
それを開き、内容をそのまま元のファイルに書き込んだった。
これこそ発想の転換w
732デフォルトの名無しさん
2017/06/13(火) 20:26:50.47ID:fqt/gc/S そんな簡単なコードも書けない言語で
まともなシステムなんて書けないと思わない?
まともなシステムなんて書けないと思わない?
733デフォルトの名無しさん
2017/06/13(火) 20:31:40.86ID:MoJEidw0 ん?
書けたけど?
正攻法じゃなかったのはおいらの知識不足が問題であって、言語の問題じゃ無いよ?
それに発想の転換と言うか、知恵と工夫で解決するのは、どんな言語使ってても必要な事。
だからっておいらがプログラマに向いてるわけじゃ無いのは理解してるが。
書けたけど?
正攻法じゃなかったのはおいらの知識不足が問題であって、言語の問題じゃ無いよ?
それに発想の転換と言うか、知恵と工夫で解決するのは、どんな言語使ってても必要な事。
だからっておいらがプログラマに向いてるわけじゃ無いのは理解してるが。
734デフォルトの名無しさん
2017/06/13(火) 20:31:48.79ID:6y8LhsYq >>731
ちょっとググればやり方わかるのにそれすら調べもせずに幼稚で姑息な思いつきをしたり顔で「発想の転換」とか草
結局、readFileのブラックボックス化をよしとしてるからそういうことになるじゃないの
自慢の車輪の再発明のしやすさとやらは何処へ?
ちょっとググればやり方わかるのにそれすら調べもせずに幼稚で姑息な思いつきをしたり顔で「発想の転換」とか草
結局、readFileのブラックボックス化をよしとしてるからそういうことになるじゃないの
自慢の車輪の再発明のしやすさとやらは何処へ?
735デフォルトの名無しさん
2017/06/13(火) 21:33:59.97ID:IUJZXol8 少ない知識で作りたいものを作れるってのが利点だと思ってるからね。
車輪の再発明しやすいのも、その一環。
その宣伝のためにも敢えてあまりググらない。
ググって見つからないぐらいで作りたいものを作れなくなる様な言語じゃ困る。
車輪の再発明しやすいのも、その一環。
その宣伝のためにも敢えてあまりググらない。
ググって見つからないぐらいで作りたいものを作れなくなる様な言語じゃ困る。
736デフォルトの名無しさん
2017/06/13(火) 21:38:43.06ID:+kV5cJp9 いやググれよHaskellerが馬鹿だと思われる
737デフォルトの名無しさん
2017/06/13(火) 22:21:04.68ID:6mJhj0/B そゆのは他の優秀なHaskellerに任せる。
おいらは実際頭悪いし。
おいらは実際頭悪いし。
738デフォルトの名無しさん
2017/06/13(火) 22:24:43.82ID:Vxrr5bw6 haskellにはカプセル化の概念がないんだよね
739デフォルトの名無しさん
2017/06/13(火) 22:28:26.94ID:+kV5cJp9 カプセルすべきものがないからな
740デフォルトの名無しさん
2017/06/13(火) 22:30:05.60ID:Vxrr5bw6 カプセル化すべきものとは?
741デフォルトの名無しさん
2017/06/13(火) 22:31:18.19ID:Vxrr5bw6 つまりカプセル化はオブジェクト指向に本質的に必要ないものとなるわけですな
742デフォルトの名無しさん
2017/06/13(火) 22:32:14.23ID:9he6m/gR 本質的には何も必要ないよ?
オブジェクト指向をやりやすくするための
言語仕様を備えてるだけなんだから
オブジェクト指向をやりやすくするための
言語仕様を備えてるだけなんだから
743デフォルトの名無しさん
2017/06/13(火) 22:32:39.86ID:Vxrr5bw6 haskellはオブジェクト指向言語と言っていいでしょう
744デフォルトの名無しさん
2017/06/13(火) 22:34:25.58ID:Vxrr5bw6 >>742
何も? 何もいらないのか? それでほんとにオブジェクト指向? なんか怪しいな
何も? 何もいらないのか? それでほんとにオブジェクト指向? なんか怪しいな
745デフォルトの名無しさん
2017/06/13(火) 22:42:17.98ID:Vxrr5bw6 条件分岐を書かないことで疎結合にする
これがオブジェクト指向の本質
これがオブジェクト指向の本質
746デフォルトの名無しさん
2017/06/14(水) 01:43:10.82ID:CkeSeNJV Haskellはモジュール単位で隠蔽機能がある。
モジュール公開側も公開したいものだけ指定出来るし、importする側も、さらに細かくこの関数だけ読み込むとか、この関数以外を読み込むとか、細かく指定出来る。
モジュール公開側も公開したいものだけ指定出来るし、importする側も、さらに細かくこの関数だけ読み込むとか、この関数以外を読み込むとか、細かく指定出来る。
747デフォルトの名無しさん
2017/06/14(水) 01:47:53.66ID:CkeSeNJV748デフォルトの名無しさん
2017/06/14(水) 07:43:27.89ID:FHXnlM5+ Haskellもモナドで手続きも書けるようにしたけど
モナドで手続き書くとマジ終わってるレベルで読みにくくて冗長
かと言ってHaskellでも性能出そうと思うと手続きを書かざるを得ない
つまりウンコ言語
モナドで手続き書くとマジ終わってるレベルで読みにくくて冗長
かと言ってHaskellでも性能出そうと思うと手続きを書かざるを得ない
つまりウンコ言語
749デフォルトの名無しさん
2017/06/14(水) 07:58:06.20ID:FHXnlM5+750デフォルトの名無しさん
2017/06/14(水) 08:21:45.76ID:9+QvSXTd まだカプセル化不要とか言ってるバカが居るのか
751デフォルトの名無しさん
2017/06/14(水) 08:25:14.80ID:JfvqLMZu >>749
ネットに踊らされてないで自分でやってみなさい
ネットに踊らされてないで自分でやってみなさい
752デフォルトの名無しさん
2017/06/14(水) 08:43:15.00ID:JrGv0x1p >>751
やってみた?
やってみた?
753デフォルトの名無しさん
2017/06/14(水) 08:45:08.83ID:JrGv0x1p >>750
カプセル化が必要だとするならそれは設計が間違っているというのがhaskellの議論で明らかになったわけです
カプセル化が必要だとするならそれは設計が間違っているというのがhaskellの議論で明らかになったわけです
754デフォルトの名無しさん
2017/06/14(水) 09:03:03.20ID:JrGv0x1p755デフォルトの名無しさん
2017/06/14(水) 09:08:24.09ID:JrGv0x1p 純粋関数型と呼ばれるどこぞの言語にもdoがあるでしょう
つまり手続き型は数学的モデルのあるちゃんとした方法なんです
それを駄目だと思うのは慣れすぎてマンネリ化してるからなんです
つまり手続き型は数学的モデルのあるちゃんとした方法なんです
それを駄目だと思うのは慣れすぎてマンネリ化してるからなんです
756デフォルトの名無しさん
2017/06/14(水) 09:10:44.44ID:OTRTw69H 原点に帰ろう
c言語からやり直そう
linuxはc言語で書かれていますが
完全にオブジェクト指向です
c言語からやり直そう
linuxはc言語で書かれていますが
完全にオブジェクト指向です
757デフォルトの名無しさん
2017/06/14(水) 09:42:08.75ID:Zur2LRZk >>753
前どこかのスレにコマンド引数の偶数番目と奇数番目を分けてリストに入れて、後から1、2番目を一つの組み。3、4番目を2つ目の組み。。。
みたいにして表示するコードをHaskellとPythonとRubyで書いたが、皮肉にもグローバル変数があっても良いはずのHaskellだけがグローバル変数作らないで済んで、
PythonとRubyはグローバル変数作らないとダメだった。
Pythonは書き様によってはグローバル変数無くせそうだったし、Rubyのsliceヒントに別の書き方のが全言語でグローバル変数要らなくなったし、シンプルになったけど。
前どこかのスレにコマンド引数の偶数番目と奇数番目を分けてリストに入れて、後から1、2番目を一つの組み。3、4番目を2つ目の組み。。。
みたいにして表示するコードをHaskellとPythonとRubyで書いたが、皮肉にもグローバル変数があっても良いはずのHaskellだけがグローバル変数作らないで済んで、
PythonとRubyはグローバル変数作らないとダメだった。
Pythonは書き様によってはグローバル変数無くせそうだったし、Rubyのsliceヒントに別の書き方のが全言語でグローバル変数要らなくなったし、シンプルになったけど。
758デフォルトの名無しさん
2017/06/14(水) 09:46:27.58ID:Zur2LRZk >>755
doの書き方は手続き型言語でも宣言的と呼ばれる関数(メソッド)呼び出しの羅列の再現。
ループとかの手続き丸出しなのの再現はあくまで再帰。
だが再現はループの代わりにもなるが、あくまで値を返す関数。
メソッドチェーンと同じで返ってくる値の型を意識する。
doの書き方は手続き型言語でも宣言的と呼ばれる関数(メソッド)呼び出しの羅列の再現。
ループとかの手続き丸出しなのの再現はあくまで再帰。
だが再現はループの代わりにもなるが、あくまで値を返す関数。
メソッドチェーンと同じで返ってくる値の型を意識する。
759デフォルトの名無しさん
2017/06/14(水) 09:47:28.86ID:Zur2LRZk x再現はループの
o再帰はループの
o再帰はループの
760デフォルトの名無しさん
2017/06/14(水) 10:38:47.08ID:9+QvSXTd カプセル化不要論者はぜひここのコメント欄で戦っていただきたい
http://qiita.com/tutinoco/items/6952b01e5fc38914ec4e
http://qiita.com/tutinoco/items/6952b01e5fc38914ec4e
761デフォルトの名無しさん
2017/06/14(水) 10:50:09.06ID:DZ9ij0Gz >>757
> PythonとRubyはグローバル変数作らないとダメだった。
これ↓のどこでグローバル変数を作る必要があると?
print(list(zip(*[iter(sys.argv[1:])]*2)))
p ARGV[0...ARGV.size/2*2].each_slice(2).to_a
> PythonとRubyはグローバル変数作らないとダメだった。
これ↓のどこでグローバル変数を作る必要があると?
print(list(zip(*[iter(sys.argv[1:])]*2)))
p ARGV[0...ARGV.size/2*2].each_slice(2).to_a
762デフォルトの名無しさん
2017/06/14(水) 11:07:50.39ID:Zur2LRZk >>761
お、そう書けるのね。
おいらPythonやRubyは(Haskellもそこまでじゃないけど)初心者程度だから。
そもそも重要なのは手続き型言語はグローバル変数がバグの温床になるのに、Python、Rubyじゃいとも簡単に作れちゃうって事ね。
Haskellみたいなグローバル変数がバグの温床になるわけじゃない言語でさえもパッケージ単位でカプセル化考慮されてるのに、初心者程グローバル変数宣言しちゃうし、出来ちゃうのは問題だよ。
お、そう書けるのね。
おいらPythonやRubyは(Haskellもそこまでじゃないけど)初心者程度だから。
そもそも重要なのは手続き型言語はグローバル変数がバグの温床になるのに、Python、Rubyじゃいとも簡単に作れちゃうって事ね。
Haskellみたいなグローバル変数がバグの温床になるわけじゃない言語でさえもパッケージ単位でカプセル化考慮されてるのに、初心者程グローバル変数宣言しちゃうし、出来ちゃうのは問題だよ。
763デフォルトの名無しさん
2017/06/14(水) 11:15:17.26ID:Zur2LRZk >>761
って、よく見たらsliceの方のアルゴリズムだし。。。
上でも、そっちはグローバル変数使わなかったって書いてるだろ。
コマンド引数の配列なりリストなりを
args!!i -- Haskell の場合
args[i] #Ruby、Pythonの場合
このインデックスのiを奇数か偶数か判定して、それぞれのリスト(配列)を作ってzipするアルゴリズムではグローバル変数使った。
おいらの力量のせいだったのかもしれんが、そう言う書き方に自然となったのが問題って話。
って、よく見たらsliceの方のアルゴリズムだし。。。
上でも、そっちはグローバル変数使わなかったって書いてるだろ。
コマンド引数の配列なりリストなりを
args!!i -- Haskell の場合
args[i] #Ruby、Pythonの場合
このインデックスのiを奇数か偶数か判定して、それぞれのリスト(配列)を作ってzipするアルゴリズムではグローバル変数使った。
おいらの力量のせいだったのかもしれんが、そう言う書き方に自然となったのが問題って話。
764デフォルトの名無しさん
2017/06/14(水) 11:51:06.96ID:oCEbA4RA おいら とか言う奴は
オイラー と被せてるの?
オイラー と被せてるの?
765デフォルトの名無しさん
2017/06/14(水) 12:07:52.90ID:l6WSuI/u たしかに20年ぶりくらいに見たな
766デフォルトの名無しさん
2017/06/14(水) 12:32:56.95ID:OTRTw69H 関数の中で処理したらいいじゃん
767デフォルトの名無しさん
2017/06/14(水) 12:49:59.35ID:DZ9ij0Gz >>763
ふつうに書けばシンプルに書けるものをなんでわざわざ複雑にせなあかんのかがわからん
p ARGV[0...ARGV.size/2*2].select.with_index{ |_,i| i.even? }.zip(ARGV.select.with_index{ |_,i| i.odd? })
ふつうに書けばシンプルに書けるものをなんでわざわざ複雑にせなあかんのかがわからん
p ARGV[0...ARGV.size/2*2].select.with_index{ |_,i| i.even? }.zip(ARGV.select.with_index{ |_,i| i.odd? })
768デフォルトの名無しさん
2017/06/14(水) 12:51:07.02ID:pq4tRhVl めっちゃ複雑やんw
769デフォルトの名無しさん
2017/06/14(水) 12:53:55.83ID:u4jybkYs (function(){
処理
})();
JavaScript でも、グローバルスコープにしないため、ファイル全体を無名関数で囲む。
Rubyでも、囲めばよい
結局、囲むという事は、クラスと同じ。
関数・クロージャ・ブロック・ラムダ式など、どういう表現をしようが、
スコープがあるという事は、クラスと同じ
処理
})();
JavaScript でも、グローバルスコープにしないため、ファイル全体を無名関数で囲む。
Rubyでも、囲めばよい
結局、囲むという事は、クラスと同じ。
関数・クロージャ・ブロック・ラムダ式など、どういう表現をしようが、
スコープがあるという事は、クラスと同じ
770デフォルトの名無しさん
2017/06/14(水) 12:55:47.63ID:Zur2LRZk >>764
その発想は無かった。
>>766
実はHaskellも最初リスト内包表記でグローバル変数作ってたんだけどね。
結局判定する関数のevenとoddしか違いが無かったからmakeList関数作って纏めただけなんだが、同じリスト内包表記あるPythonで同じ様にしようとしたらi % 2 == 0とか書かないといけなかったのね。
んで、まあ良いや。0か1かで奇数偶数分けられるから関数作っちゃえって思ったらエラー出た。
定数じゃないとダメっぽくて諦めたけど、リスト内包表記に拘らなければ関数に出来たと思う。
(もしくは将来的にリスト内包表記のif式に外部から変数渡せる様になったら作れる)
処理全体を関数にしちゃうってのは確かにグローバル変数を無くす有効な手段だが、初心者ほどそんな事しない。
その発想は無かった。
>>766
実はHaskellも最初リスト内包表記でグローバル変数作ってたんだけどね。
結局判定する関数のevenとoddしか違いが無かったからmakeList関数作って纏めただけなんだが、同じリスト内包表記あるPythonで同じ様にしようとしたらi % 2 == 0とか書かないといけなかったのね。
んで、まあ良いや。0か1かで奇数偶数分けられるから関数作っちゃえって思ったらエラー出た。
定数じゃないとダメっぽくて諦めたけど、リスト内包表記に拘らなければ関数に出来たと思う。
(もしくは将来的にリスト内包表記のif式に外部から変数渡せる様になったら作れる)
処理全体を関数にしちゃうってのは確かにグローバル変数を無くす有効な手段だが、初心者ほどそんな事しない。
771デフォルトの名無しさん
2017/06/14(水) 12:59:16.57ID:Zur2LRZk >>767
ファイル名とファイルの内容をzipするコード書いた後の実験的なコードだったんで、そう言う発想になった。
後でsliceなコードのが単純だし、グローバル変数使わないって気付いたけど。
ここではどうしても使わざるを得ない場面が出て来たってのを言いたかっただけ。
ファイル名とファイルの内容をzipするコード書いた後の実験的なコードだったんで、そう言う発想になった。
後でsliceなコードのが単純だし、グローバル変数使わないって気付いたけど。
ここではどうしても使わざるを得ない場面が出て来たってのを言いたかっただけ。
772デフォルトの名無しさん
2017/06/14(水) 17:49:45.05ID:OTRTw69H ローカル変数で良くない?
773デフォルトの名無しさん
2017/06/14(水) 17:50:30.90ID:OTRTw69H なんでグローバルにする必要があるんですかね?
774デフォルトの名無しさん
2017/06/14(水) 17:52:34.20ID:OTRTw69H グローバルな人材を育てたいのかな?
775デフォルトの名無しさん
2017/06/14(水) 17:54:12.75ID:OTRTw69H >>767
古き良きパールのようじゃ
古き良きパールのようじゃ
776デフォルトの名無しさん
2017/06/14(水) 21:53:40.74ID:293Y7UBw777デフォルトの名無しさん
2017/06/14(水) 22:01:32.77ID:293Y7UBw そもそも771は長くても10行程度のコードしか書けないクソ初心者だろ?
その規模じゃグローバル変数でも問題ないわ
その規模じゃグローバル変数でも問題ないわ
778デフォルトの名無しさん
2017/06/14(水) 23:10:49.67ID:Mf2Ob2T8 はいシングルトンも禁止
779デフォルトの名無しさん
2017/06/15(木) 01:45:19.51ID:pFraGGes もう継承、ポリモーフィズム、カプセル化も禁止でいいよ
780デフォルトの名無しさん
2017/06/15(木) 01:53:46.41ID:K1DnwnKl 継承、実装、DIの違いをポケモンを例に説明してくれ。
781デフォルトの名無しさん
2017/06/15(木) 07:08:45.79ID:onPRKaJ8 ポケモン進化、トレーニング、?
782デフォルトの名無しさん
2017/06/15(木) 08:21:04.78ID:YgSQzG1P >>776
間違いというか効率悪い方の例をわざわざあげてる意味わかってる?
この例に限らず、グローバル変数がバグの温床になるって分かってるのに、
どうしてもグローバル変数使わないと書けない場面があるから黙認されてるっていうのが、
もうオブジェクト指向はグローバル変数に対して根本的な解決策を持たない不完全なパラダイムだって証左だよ。
間違いというか効率悪い方の例をわざわざあげてる意味わかってる?
この例に限らず、グローバル変数がバグの温床になるって分かってるのに、
どうしてもグローバル変数使わないと書けない場面があるから黙認されてるっていうのが、
もうオブジェクト指向はグローバル変数に対して根本的な解決策を持たない不完全なパラダイムだって証左だよ。
783デフォルトの名無しさん
2017/06/15(木) 09:25:01.12ID:ESWCwDfu784デフォルトの名無しさん
2017/06/16(金) 12:29:20.85ID:HP1Jz4Vg プログラムを勉強して日が浅いのですが、LSPを意識すると継承って何の意味があるんだろうと思ってしまいます
置換可能を実現できるということは、サブクラスはスーパークラスそのものってことになるような気がして
LSPの概念は、どう便利なのでしょうか
置換可能を実現できるということは、サブクラスはスーパークラスそのものってことになるような気がして
LSPの概念は、どう便利なのでしょうか
785デフォルトの名無しさん
2017/06/16(金) 13:56:31.30ID:zL8gur9S グローバル変数が無いと書けない場面なんて無い
グローバルスコープのシングルトンオブジェクトでいい
必要ならね
グローバルスコープのシングルトンオブジェクトでいい
必要ならね
786デフォルトの名無しさん
2017/06/16(金) 14:28:02.28ID:pc3mXeVr787デフォルトの名無しさん
2017/06/16(金) 19:13:51.77ID:HP1Jz4Vg788デフォルトの名無しさん
2017/06/16(金) 20:00:04.73ID:Z2HbLI7g789デフォルトの名無しさん
2017/06/16(金) 20:55:27.26ID:DGAgd9ez interface
790デフォルトの名無しさん
2017/06/17(土) 02:54:17.87ID:1edbV8Vs メソッドディスパッチの問題だろ?
というBlogをみて「ああそれだよそれ、そういうのでいいんだよ」(孤独のグルメ風表現)になった
というBlogをみて「ああそれだよそれ、そういうのでいいんだよ」(孤独のグルメ風表現)になった
791デフォルトの名無しさん
2017/06/17(土) 11:41:41.30ID:m1x703gI 第1目標:修正が他までどんどん波及していって修正地獄にならないようにする
なのに、変な原理原則マンに限ってそこがスッポリ抜けてたりするからな
なのに、変な原理原則マンに限ってそこがスッポリ抜けてたりするからな
792デフォルトの名無しさん
2017/06/17(土) 14:11:25.74ID:qMkdrUOQ 原理原則っつーか原理主義者っつーか
そもそもOOは原理といえるほど理屈がしっかりしてないだろ
複数のオブジェクトにまたがるメソッドをどこに実装しようかっていう初歩のレベルで
すっきりしないというのに
むろんマルチメソッドという考え方もあるけど、ほとんどのOOPには実装されてないしな
だから複数の色んなことを同時に考慮して、うまい具合にしなきゃならないっつーのに
原理原則とかでは無いわ
我々は空間と時間を両方扱っているわけで、片方だけに着目すりゃよいってものでもないわ
そもそもOOは原理といえるほど理屈がしっかりしてないだろ
複数のオブジェクトにまたがるメソッドをどこに実装しようかっていう初歩のレベルで
すっきりしないというのに
むろんマルチメソッドという考え方もあるけど、ほとんどのOOPには実装されてないしな
だから複数の色んなことを同時に考慮して、うまい具合にしなきゃならないっつーのに
原理原則とかでは無いわ
我々は空間と時間を両方扱っているわけで、片方だけに着目すりゃよいってものでもないわ
793デフォルトの名無しさん
2017/06/17(土) 14:15:26.57ID:qMkdrUOQ 第一、OO程度の原理原則に思考回路が縛られるって
潜在的に、そうとうオツムが弱いよな
世の中の理屈とかけ離れすぎているというか、単純化しすぎ
潜在的に、そうとうオツムが弱いよな
世の中の理屈とかけ離れすぎているというか、単純化しすぎ
794デフォルトの名無しさん
2017/06/17(土) 15:24:12.75ID:hpXZLyYV >>792
> 複数のオブジェクトにまたがるメソッドをどこに実装しようかっていう初歩のレベルで
オブジェクト指向は、現実世界で実現しているオブジェクトに
ソフトウェアの設計を合わせようとするものだが、
現実世界のオブジェクトでは、
「複数のオブジェクトにまたがるメソッド」は
どこに実装されているんですか?
複数のオブジェクトにまたがるメソッドというものが
そもそも不自然なメソッドですよね?
> 複数のオブジェクトにまたがるメソッドをどこに実装しようかっていう初歩のレベルで
オブジェクト指向は、現実世界で実現しているオブジェクトに
ソフトウェアの設計を合わせようとするものだが、
現実世界のオブジェクトでは、
「複数のオブジェクトにまたがるメソッド」は
どこに実装されているんですか?
複数のオブジェクトにまたがるメソッドというものが
そもそも不自然なメソッドですよね?
795デフォルトの名無しさん
2017/06/17(土) 16:14:00.96ID:jlRZsUTe796デフォルトの名無しさん
2017/06/17(土) 16:33:38.51ID:ExP73Jcy 物理法則の表現って因果関係的な形ではないよねー
797デフォルトの名無しさん
2017/06/17(土) 17:27:39.37ID:qMkdrUOQ はい皆さん>>794を読んでください
もうこの時点でアホっぽいってわかるでしょ
ありえないぐらいで、釣りじゃないかと疑うぐらい
アホらしいけどまず基本的なことからいうと
コンピュータは日本語で「計算機」ともいうのでそっちの方向から攻めると
足し算は現実世界のどこに実装されているんですか?っていうぐらいアホなイチャモン
物や物体的なことにこだわって、概念的なことであるとか関係性といったものを
認めない姿勢は技術者ではない以前に、人間的ですらない
もうこの時点でアホっぽいってわかるでしょ
ありえないぐらいで、釣りじゃないかと疑うぐらい
アホらしいけどまず基本的なことからいうと
コンピュータは日本語で「計算機」ともいうのでそっちの方向から攻めると
足し算は現実世界のどこに実装されているんですか?っていうぐらいアホなイチャモン
物や物体的なことにこだわって、概念的なことであるとか関係性といったものを
認めない姿勢は技術者ではない以前に、人間的ですらない
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【△】コンビニの鮭おにぎり、価格にネット衝撃「ついに…」 驚き続々「これはキツい…」「日本人を殺しに来てる」 ★3 [ぐれ★]
- 上野動物園の双子パンダ、1月末に中国に返還へ 国内でパンダ不在に ★3 [蚤の市★]
- 「全国テレビのデカ盛りの撮影が連絡無しで…」ラーメン店が悲痛の食材ロス危機を訴える [少考さん★]
- 「外国人はもう日本を選ばなくなる」経営者たちが抱く深刻な懸念 ベトナム人実習生なしでは「成り立たない街」…【多文化共生企画】★3 [少考さん★]
- 【東京】わずか9平方メートル…都心に近い「極小」アパートが若者に人気 狭くても“住めば都” ★3 [煮卵★]
- 【芸能】上野のパンダ2頭、1月に中国へ返還 パンダ国内ゼロに フィフィ「もういい加減、貸して下さいなんて頭下げるのは…」 [冬月記者★]
- 【高市物価】スーパー買い物俺「まあまあ買ったな…3000円くらいか?(意外と2000円程度かも😁)」→ [153490809]
- 【悲報】婚約中の男「家具なんてニトリでいいでしょ。子供出来たら絶対汚すし」女「お前との結婚は刑務所生活かよ!」 [802034645]
- 年末っていつからを指すと思う?
- 【悲報】なだぎ武さん、クリスマスディナーショーのチケットが10枚しか売れず終わるwwwwwwwwwwwwwwwwwwww [802034645]
- 【悲報】「ズートピア2」とかいう謎のアニメ映画、日本の誇り「鬼滅の刃」を光速で抜き去ってしまうwwwwwwwwwwwwwwwwwwwww [839150984]
- 【悲報】高須克弥「不快に感じたから正直にコメントしただけだ。何が悪い?」4.3万いいね フジテレビ人権侵害問題、風向きが変わる [455031798]
