前スレ
オブジェクト指向って自然な文法だな 2
http://echo.2ch.net/test/read.cgi/tech/1490506257/
オブジェクト指向って自然な文法だな 3 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/04/02(日) 16:30:38.65ID:n7h/bBRg
621デフォルトの名無しさん
2017/05/25(木) 22:16:33.15ID:06hv3Ht1 >>611
SetterGetterの殻に閉じこもってプログラミングする安心感は異常
そんな保障してなんの役に立つ
どのみちオブジェクトを関数の引数にしたら、どこで何されるかわかったもんじゃない
publicにしたら処理をフックすることもできない
へんな値が設定されたときに例外をだすこともできないし
Audio.volumeでボリューム設定なんてこともできないだろう
SetterGetterの殻に閉じこもってプログラミングする安心感は異常
そんな保障してなんの役に立つ
どのみちオブジェクトを関数の引数にしたら、どこで何されるかわかったもんじゃない
publicにしたら処理をフックすることもできない
へんな値が設定されたときに例外をだすこともできないし
Audio.volumeでボリューム設定なんてこともできないだろう
622デフォルトの名無しさん
2017/05/26(金) 12:49:01.87ID:nbqvOpds セッタゲッタ作って役に立ったこともあるだろうが、無駄にコードが増えただけのこともあるだろう
無条件にやるのはただのバカ。フックいれることが予想される場合にするのはいい
無条件にやるのはただのバカ。フックいれることが予想される場合にするのはいい
623デフォルトの名無しさん
2017/05/26(金) 14:05:46.16ID:tID9m1OJ >>622
Yes
Yes
624デフォルトの名無しさん
2017/05/26(金) 15:13:04.21ID:FvwfjnU+ そのクラスのユーザが自分だけじゃない場合は、とりあえず全部privateにして、getter/setter作っといた方がいいね
625デフォルトの名無しさん
2017/05/26(金) 16:21:29.95ID:Heb9aC5z getter,setterを通じて変数に触れるのであればそれはもはやprivateとは言えないと思ってる
626デフォルトの名無しさん
2017/05/26(金) 16:22:11.52ID:Heb9aC5z getterはまだ良いけどsetterは要らないなぁ
627デフォルトの名無しさん
2017/05/26(金) 16:37:50.24ID:FvwfjnU+ >>625
> getter,setterを通じて変数に触れるのであればそれはもはやprivateとは言えないと思ってる
言いたいことはわからなくもないが、クライアントコードとそのクラスの接点がsetter/getterであると
保証されていれば、内部構造の変更は自由になるというのが異なる。
> getter,setterを通じて変数に触れるのであればそれはもはやprivateとは言えないと思ってる
言いたいことはわからなくもないが、クライアントコードとそのクラスの接点がsetter/getterであると
保証されていれば、内部構造の変更は自由になるというのが異なる。
628デフォルトの名無しさん
2017/05/26(金) 18:31:35.52ID:Heb9aC5z 確かにね
言ってることはよくわかる
だとしてもsetterは用途が限られるように感じてる
それならインスタンス生成時に必要な情報を全部ぶち込んじゃえばいいんじゃね?と最近考えてる
言ってることはよくわかる
だとしてもsetterは用途が限られるように感じてる
それならインスタンス生成時に必要な情報を全部ぶち込んじゃえばいいんじゃね?と最近考えてる
629デフォルトの名無しさん
2017/05/26(金) 19:19:04.64ID:grHVRT/B class1
{
public int setInt;
public string setStr;
}
class2
{
public int setInt { set; get; }
public string setStr { set; get; }
}
この2つの違い教えて
外のクラスから参照・変更するだけなら同じ扱い?
{
public int setInt;
public string setStr;
}
class2
{
public int setInt { set; get; }
public string setStr { set; get; }
}
この2つの違い教えて
外のクラスから参照・変更するだけなら同じ扱い?
630デフォルトの名無しさん
2017/05/27(土) 10:49:30.96ID:ieplBCy2 >>626
後でconfigの類を入れるとか、setLoggerだとかで
必要になる場面がたまにあるかも
なおPythonでそれやろうとしてプロパティデコレータ使おうとしたら「setだけのデコレータはない」というので
またPythonの俺様仕様か……って閉口した
後でconfigの類を入れるとか、setLoggerだとかで
必要になる場面がたまにあるかも
なおPythonでそれやろうとしてプロパティデコレータ使おうとしたら「setだけのデコレータはない」というので
またPythonの俺様仕様か……って閉口した
631デフォルトの名無しさん
2017/05/27(土) 10:59:35.13ID:u9alIOxt setterだけってことは
obj.x = 1 #=> これは出来る
obj.x #=> 例外
になって欲しいってことか?イラネ
obj.x = 1 #=> これは出来る
obj.x #=> 例外
になって欲しいってことか?イラネ
632デフォルトの名無しさん
2017/05/27(土) 11:03:59.72ID:HaHIN1I5 メンバを個別にセットゲットする需要ってそんなにないだろう?
633デフォルトの名無しさん
2017/05/27(土) 11:16:48.16ID:ieplBCy2 >>631
obj.config = user_config
みたいなのだ
setconfig(user_config)でもよろしかろうが、readwriteとreadは機能としてあるけどwriteはない
なんて片手落ちはあんまり想像してなかった
「正しいやり方はwriteイラね」とかマニュアルに書けってよ
obj.config = user_config
みたいなのだ
setconfig(user_config)でもよろしかろうが、readwriteとreadは機能としてあるけどwriteはない
なんて片手落ちはあんまり想像してなかった
「正しいやり方はwriteイラね」とかマニュアルに書けってよ
634デフォルトの名無しさん
2017/05/27(土) 11:58:55.24ID:0+MwcC+M getter,setterはメソッドなのでクラス中で処理してクラスとして必要な形で出し入れできる
直接さわることとは別物だよ
直接さわることとは別物だよ
635デフォルトの名無しさん
2017/05/27(土) 12:19:45.90ID:HaHIN1I5636デフォルトの名無しさん
2017/05/27(土) 12:38:09.02ID:ieplBCy2 理想: getter/setterはメソッドとすべき
setterで引数のチェック、getterでoutはコレであってるかのチェックはもれなくやるべし
現実: やらなくてもだいたい例外が飛ぶか動かないかするからわかる
setterで引数のチェック、getterでoutはコレであってるかのチェックはもれなくやるべし
現実: やらなくてもだいたい例外が飛ぶか動かないかするからわかる
637デフォルトの名無しさん
2017/05/27(土) 12:45:31.51ID:5/vhXFvj ないとバカが騒ぐから作っておけばいい
こんなつまらん事でわざわざバカにエサを与える必要はない
こんなつまらん事でわざわざバカにエサを与える必要はない
638デフォルトの名無しさん
2017/05/27(土) 17:30:05.68ID:N4GV+Pp+ ゲッタセッタにフックさせる「かもしれない」をどう受け取るかによるから不毛と言えば不毛
柔軟に拡張できると受け取れば良しとなるし、不要な可能性を残すと受け取れば悪しとなる
個人的には単純にゲッタセッタで命名しといてくれるとインテリセンスでプロパティ探す時楽だからあった方がいい
ただゲッタセッタで命名しときながら裏で全然関係なかったり重い処理してる糞コード書く奴が一定数いるのも現実
柔軟に拡張できると受け取れば良しとなるし、不要な可能性を残すと受け取れば悪しとなる
個人的には単純にゲッタセッタで命名しといてくれるとインテリセンスでプロパティ探す時楽だからあった方がいい
ただゲッタセッタで命名しときながら裏で全然関係なかったり重い処理してる糞コード書く奴が一定数いるのも現実
639デフォルトの名無しさん
2017/05/27(土) 17:46:00.50ID:3Q4GI2w6 クラス設計が下手くそなオブジェクト指向初心者なんだけど、ためになる読み物とかないですかね?
cはある程度書ける
cはある程度書ける
640デフォルトの名無しさん
2017/05/27(土) 19:33:03.59ID:g5q+CjXh 構造化プログラミングって何?
641デフォルトの名無しさん
2017/05/27(土) 19:54:27.21ID:SDTaiU/Z642デフォルトの名無しさん
2017/05/27(土) 20:24:02.87ID:4M5qtD6v >>640
ダイクストラ知らないとかゆとりかよ
ダイクストラ知らないとかゆとりかよ
643デフォルトの名無しさん
2017/05/27(土) 20:57:24.04ID:H74RUeqi 老害的罵倒例
644デフォルトの名無しさん
2017/05/27(土) 21:35:03.31ID:583uXQeo645デフォルトの名無しさん
2017/05/29(月) 03:13:17.41ID:vyxh58aI >>642
自分の言葉で説明して欲しいです。
自分の言葉で説明して欲しいです。
646デフォルトの名無しさん
2017/05/29(月) 08:38:09.71ID:U7XwlEVB >>645
Wikipediaとか読んで自分でそれをできるようになったがいんじゃない?
Wikipediaとか読んで自分でそれをできるようになったがいんじゃない?
647デフォルトの名無しさん
2017/05/29(月) 08:44:08.38ID:U7XwlEVB 構造化プログラミングとは
関数、if、whileを使ってプログラムを書くこと
誤解を恐れず言うならswitch、forは邪道です
関数、if、whileを使ってプログラムを書くこと
誤解を恐れず言うならswitch、forは邪道です
648デフォルトの名無しさん
2017/05/29(月) 11:07:58.25ID:TgEUVyWp はい次
649デフォルトの名無しさん
2017/05/29(月) 12:09:15.00ID:BkgkdtpP >>648
次はお前の番だよ
次はお前の番だよ
650デフォルトの名無しさん
2017/05/29(月) 12:10:47.18ID:BkgkdtpP おらあああ!!さっさと説明してみろや!
651デフォルトの名無しさん
2017/05/29(月) 12:11:45.18ID:vyxh58aI >>647
wiki読んだけど、それぐらいの意図しか汲み取れなかった。
オブジェクト指向では、ポリモーフィズムとか使えるけど、それも結局はクラスでifしてるだけであって、たいして変わらないじゃんと思った。
wiki読んだけど、それぐらいの意図しか汲み取れなかった。
オブジェクト指向では、ポリモーフィズムとか使えるけど、それも結局はクラスでifしてるだけであって、たいして変わらないじゃんと思った。
652デフォルトの名無しさん
2017/05/29(月) 12:18:49.21ID:CxTrZaFu ポリモーフィズムとifが同等って初めて知った
653デフォルトの名無しさん
2017/05/29(月) 12:24:48.88ID:KD+R0FhF 分かるだろ普通w
654デフォルトの名無しさん
2017/05/29(月) 12:34:49.38ID:CxTrZaFu 何を基準に普通と言ってるかは知らないけど同じ扱いをしても振る舞いが異なる事だと思ってたからなぁ
ここを見てるとどれだけ自分の頭が固いかよくわかっておもしろい
ここを見てるとどれだけ自分の頭が固いかよくわかっておもしろい
655デフォルトの名無しさん
2017/05/29(月) 19:29:07.89ID:w9I7HLjv 一回、アセンブラからやらせて
自分で自分が書いたスパゲッティをメンテするところからやらせねぇと
なんで生まれてどんなメリットを目指したかわかんねぇんじゃねぇの
ゆとりには
自分で自分が書いたスパゲッティをメンテするところからやらせねぇと
なんで生まれてどんなメリットを目指したかわかんねぇんじゃねぇの
ゆとりには
656デフォルトの名無しさん
2017/05/29(月) 19:42:05.10ID:CxTrZaFu 知らなくても組めるように発展してんだから意図なんか後から知ればいいんだよ
657デフォルトの名無しさん
2017/05/29(月) 20:16:08.98ID:KNNrZWoY いつまで経ってもオブジェクト指向の意図が理解できない変な人が湧き続けるスレで言うことか。
658デフォルトの名無しさん
2017/05/29(月) 22:18:26.47ID:A34reMmc オブジェクト指向の意図ってなんだよw
こんなものまで擬人化しないと気がすまんのかお前らw
キモいにも程があるwww
こんなものまで擬人化しないと気がすまんのかお前らw
キモいにも程があるwww
659デフォルトの名無しさん
2017/05/29(月) 22:22:54.39ID:nT+AAD4u オッ
660デフォルトの名無しさん
2017/05/29(月) 22:25:41.12ID:w9I7HLjv ここまで国語力ない奴はじめてみた。
661デフォルトの名無しさん
2017/05/30(火) 02:01:38.87ID:KOCwrIWS662デフォルトの名無しさん
2017/05/30(火) 02:16:15.25ID:734VgA5Q >>651
呼び出す側が適宜、相手のインスタンスに「こういう動作して」って派生クラスぶっこむ場合が多いな
まぁ派生元 - 派生先でifしてるって捉え方もできようが
if - elseが下に7コ8コ並んで見難いのよりはマシだろう
呼び出す側が適宜、相手のインスタンスに「こういう動作して」って派生クラスぶっこむ場合が多いな
まぁ派生元 - 派生先でifしてるって捉え方もできようが
if - elseが下に7コ8コ並んで見難いのよりはマシだろう
663デフォルトの名無しさん
2017/05/30(火) 19:10:33.85ID:cuCpV+Ml >>658
Objectの言葉の意味の通りじゃん
Objectの言葉の意味の通りじゃん
664デフォルトの名無しさん
2017/05/31(水) 17:32:41.97ID:lwNSc7pn オブジェクト指向開発の理解度を測るために民間団体の主催するJAVA検定を受けようと思うのですが、そもそもここの問題はオブジェクト指向となっているでしょうか
http://www.sikaku.gr.jp/js/jv/img/sample/1/jv1.pdf
過去に構造化プログラムとかクソ味噌言われていたので、オブジェクト指向に造詣の深い皆さんに評価して頂きたいです
http://www.sikaku.gr.jp/js/jv/img/sample/1/jv1.pdf
過去に構造化プログラムとかクソ味噌言われていたので、オブジェクト指向に造詣の深い皆さんに評価して頂きたいです
665デフォルトの名無しさん
2017/05/31(水) 18:37:16.96ID:vzRkDbrn >>664
やめとけ
やめとけ
666デフォルトの名無しさん
2017/05/31(水) 18:46:16.77ID:lqV8qj25 理解度測るならフリーで仕事すればいい
稼いだ金額が理解度
稼いだ金額が理解度
667デフォルトの名無しさん
2017/06/01(木) 03:12:10.50ID:TLZ7U8Co >>664
実務でやるなら、4番のシーケンス図よろしく「N」なんて打ち込ませねぇ
そもそもあんなクソみたいな手数を踏ませるはイカれてるっていうか、ユーザーは怠惰なんス
一手で済ます
たぶんログイン画面でセッション(あるいは何らかの認証情報)を持たすのが前提だあな
っていうか「Fuckyou」とか「let me die」って打ち込んだ時どうすんだね
この図だと未定義だから何してもいいよね、俺だったら「Fuckyou」ってタイプされたら水龍敬ランド出すし
「let me die」ってタイプされたらガルパンのまほお姉さまのエロ同人誌でも表示してやるわさ
……冗談やで?
というくらいなんかアレかも
実務でやるなら、4番のシーケンス図よろしく「N」なんて打ち込ませねぇ
そもそもあんなクソみたいな手数を踏ませるはイカれてるっていうか、ユーザーは怠惰なんス
一手で済ます
たぶんログイン画面でセッション(あるいは何らかの認証情報)を持たすのが前提だあな
っていうか「Fuckyou」とか「let me die」って打ち込んだ時どうすんだね
この図だと未定義だから何してもいいよね、俺だったら「Fuckyou」ってタイプされたら水龍敬ランド出すし
「let me die」ってタイプされたらガルパンのまほお姉さまのエロ同人誌でも表示してやるわさ
……冗談やで?
というくらいなんかアレかも
668デフォルトの名無しさん
2017/06/01(木) 03:35:10.17ID:TLZ7U8Co そしてまさかのNはユーザーの氏名でした、か(今アレって思って見直したら) orz ごめん手抜きした
まあいいや、見直すとして……ああうんお呼びでないか
シーケンス図を(マジメに)見る限り
・初めに二回ポップアップ出す(or二発画面遷移をせよってこと、メソッドが二発あるので)
・ユーザーがNっていれたら、初めに出たのとの同じポップアップを2発やる(displayFirstMess/displayPromptMessをもう一度ぶっぱしてるから)
・imputMessageでユーザーが入力をいれたら
まずユーザー一覧を表示するのか、「検索方法を指定してください」と出すのかして(displayFirstMessはどうもでっかく二分岐してるのかもしれん、あるいはまた「検索方法を指定してください。」と出すのか)
そのあとでallDisplayでドカっと下に長い表示を出すのか
この辺要確認、たぶん書き手はそんなの想像してないと思う
たぶんGoogle検索のようなのを想定してるはずなので
・ユーザーは表示された従業員名とID突き合わせて入力欄にID打ち込んでEってタイプする
ここも確認が必要、クリックじゃねぇの?
ああうんこれメインフレーム時代のやり方やで
まあいいや、見直すとして……ああうんお呼びでないか
シーケンス図を(マジメに)見る限り
・初めに二回ポップアップ出す(or二発画面遷移をせよってこと、メソッドが二発あるので)
・ユーザーがNっていれたら、初めに出たのとの同じポップアップを2発やる(displayFirstMess/displayPromptMessをもう一度ぶっぱしてるから)
・imputMessageでユーザーが入力をいれたら
まずユーザー一覧を表示するのか、「検索方法を指定してください」と出すのかして(displayFirstMessはどうもでっかく二分岐してるのかもしれん、あるいはまた「検索方法を指定してください。」と出すのか)
そのあとでallDisplayでドカっと下に長い表示を出すのか
この辺要確認、たぶん書き手はそんなの想像してないと思う
たぶんGoogle検索のようなのを想定してるはずなので
・ユーザーは表示された従業員名とID突き合わせて入力欄にID打ち込んでEってタイプする
ここも確認が必要、クリックじゃねぇの?
ああうんこれメインフレーム時代のやり方やで
669デフォルトの名無しさん
2017/06/01(木) 03:36:55.80ID:TLZ7U8Co あーうん、let me dieって言われたらまほ姉がおっさんにピーされる機能は実装が必要だな
俺以外望んでないけど未定義だからいいよね(実務じゃしないよ、冗談だから)
俺以外望んでないけど未定義だからいいよね(実務じゃしないよ、冗談だから)
670デフォルトの名無しさん
2017/06/02(金) 01:49:27.48ID:w5TyDgot 今Haskellとの比較にPython/Rubyに追加で究極的なオブジェクト指向言語であるsmalltalkでコマンド作るべくgnu-smalltalk勉強中なんだが、条件分岐やループまでオブジェクトへのメッセージなんで、
squeak/PharoみたいなGUIなsmalltalkじゃない事でシステムブラウザ(動的クラスリファレンス?)無しじゃ相当厳しい。
Ubuntu Linuxでsudo apt install gnu-smalltalkしただけじゃgst-browser起動しなかったから、
tar玉落としてコンパイル段階から環境構築してやっと動いた。
んで思ったんだが、やっぱオブジェクト指向ってクラス覚えないと何も出来ないんじゃね?
中途半端なオブジェクト指向言語って構造化プログラミングの文法に助けられてて、
その辺誤魔化せてるだけのような気がして来た。
squeak/PharoみたいなGUIなsmalltalkじゃない事でシステムブラウザ(動的クラスリファレンス?)無しじゃ相当厳しい。
Ubuntu Linuxでsudo apt install gnu-smalltalkしただけじゃgst-browser起動しなかったから、
tar玉落としてコンパイル段階から環境構築してやっと動いた。
んで思ったんだが、やっぱオブジェクト指向ってクラス覚えないと何も出来ないんじゃね?
中途半端なオブジェクト指向言語って構造化プログラミングの文法に助けられてて、
その辺誤魔化せてるだけのような気がして来た。
671デフォルトの名無しさん
2017/06/02(金) 07:47:26.08ID:vc1fSB5M >>670
システムブラウザまで使うならなぜGNU Smalltalkみたいな変わり種Smalltalkにこだわるのかわからんけど(何かPharoやSqueakじゃ駄目な事情が?)
クラス(というか組み込みのオブジェクト)の使い方を覚えないと何も出来ないというのはかなり正しい
ただそんなこともあってSmalltalk環境は相当早い段階から組み込みの(クラスを含む)オブジェクトに対する問い合わせ
つまりイントロスペクション機能やそれをサポートする(人間の短期記憶に負担をかけないようにする)
マルチウインドウシステムが発達したわけ
だから、繰り返すけどそれらの機構を大胆に削ったのウリのGNU Smalltalkで
「Smalltalk(やそれが体現するOO)が何か」を論ずるのはちょっと違うかもと老婆心ながら
システムブラウザまで使うならなぜGNU Smalltalkみたいな変わり種Smalltalkにこだわるのかわからんけど(何かPharoやSqueakじゃ駄目な事情が?)
クラス(というか組み込みのオブジェクト)の使い方を覚えないと何も出来ないというのはかなり正しい
ただそんなこともあってSmalltalk環境は相当早い段階から組み込みの(クラスを含む)オブジェクトに対する問い合わせ
つまりイントロスペクション機能やそれをサポートする(人間の短期記憶に負担をかけないようにする)
マルチウインドウシステムが発達したわけ
だから、繰り返すけどそれらの機構を大胆に削ったのウリのGNU Smalltalkで
「Smalltalk(やそれが体現するOO)が何か」を論ずるのはちょっと違うかもと老婆心ながら
672デフォルトの名無しさん
2017/06/02(金) 07:58:55.45ID:StUXAGh/ Smalltalkがウンコなだけだよ
アランケイにも捨てられたゴミ
アランケイにも捨てられたゴミ
673デフォルトの名無しさん
2017/06/02(金) 08:32:54.40ID:uW9UgDbU674デフォルトの名無しさん
2017/06/02(金) 09:09:40.41ID:SS0iDM0a675デフォルトの名無しさん
2017/06/02(金) 09:10:16.04ID:DxIdV4KE SmalltalkはIDEがなきゃCよりも書きにくく、
IDEを使うためにはヘンテコなOSモドキの使用を強制され、
それを我慢して使っても他の言語より書きやすいわけでもなく
マイナー言語なのでライブラリも少ない
まさにゴミ
IDEを使うためにはヘンテコなOSモドキの使用を強制され、
それを我慢して使っても他の言語より書きやすいわけでもなく
マイナー言語なのでライブラリも少ない
まさにゴミ
676デフォルトの名無しさん
2017/06/02(金) 09:36:01.61ID:uW9UgDbU >>675
まあそう言わんと
ただヘンテコなゴミだと簡単に切り捨てるより、いろいろ調べて学びを得た方が面白いですよ
同時期に登場したStar、Cedar、Interlisp-D等、同様のOSモドキはいくつか生み出されましたが、
結局生き残って今も使われ続けているのはSmalltalkだけです
たまたま選ばれたということ(ジョブズやゲイツがそのルック&フィールを模倣して広めてくれたということも含め)
もあるかもしれませんが、ホストOSに寄生する“異物”という宿命を背負いながらも変化を続け
趣味はあってもスタートアップで言語として選択される程度に有用であることは
ケイらの遅延結合性の徹底というコンセプトの有効性を示すよい例かとも
Smalltalkの底を流れる設計思想 - ダン・インガルス
http://web.archive.org/web/20041016084842/http://marimpod.homeip.net/chomswiki/24#
「ソフトウェア工学」は矛盾語法か? - アラン・ケイ
http://metatoys.org/oxymoron/oxymoron.html
まあそう言わんと
ただヘンテコなゴミだと簡単に切り捨てるより、いろいろ調べて学びを得た方が面白いですよ
同時期に登場したStar、Cedar、Interlisp-D等、同様のOSモドキはいくつか生み出されましたが、
結局生き残って今も使われ続けているのはSmalltalkだけです
たまたま選ばれたということ(ジョブズやゲイツがそのルック&フィールを模倣して広めてくれたということも含め)
もあるかもしれませんが、ホストOSに寄生する“異物”という宿命を背負いながらも変化を続け
趣味はあってもスタートアップで言語として選択される程度に有用であることは
ケイらの遅延結合性の徹底というコンセプトの有効性を示すよい例かとも
Smalltalkの底を流れる設計思想 - ダン・インガルス
http://web.archive.org/web/20041016084842/http://marimpod.homeip.net/chomswiki/24#
「ソフトウェア工学」は矛盾語法か? - アラン・ケイ
http://metatoys.org/oxymoron/oxymoron.html
677デフォルトの名無しさん
2017/06/02(金) 10:52:54.67ID:PwRFjZu6 >>673
いあ、昔squeakやってたし、当時はクラスブラウザと自由自在Squeakあれば十分なくらい独学しやすい言語だと思ってた。
当時はJavaのクラスリファレンス(とら本)も分厚いのを上下巻2冊で売ってたし、クラスたくさん覚えて行くのが当たり前と思ってたからね。
HaskellもLispも、関数覚えておけば便利だけど、覚えてない知らない場合も自分で自作しやすい。
そう言う意味じゃCとかの構造化プログラミングも関数やクラスを基本にするんじゃなくて、Goto使わなくて済む構文によってスパゲティコードを無くすっていう自作し易さを目指す進化だったんよね。
いあ、昔squeakやってたし、当時はクラスブラウザと自由自在Squeakあれば十分なくらい独学しやすい言語だと思ってた。
当時はJavaのクラスリファレンス(とら本)も分厚いのを上下巻2冊で売ってたし、クラスたくさん覚えて行くのが当たり前と思ってたからね。
HaskellもLispも、関数覚えておけば便利だけど、覚えてない知らない場合も自分で自作しやすい。
そう言う意味じゃCとかの構造化プログラミングも関数やクラスを基本にするんじゃなくて、Goto使わなくて済む構文によってスパゲティコードを無くすっていう自作し易さを目指す進化だったんよね。
678デフォルトの名無しさん
2017/06/02(金) 11:34:30.40ID:PwRFjZu6 何というか、オブジェクト指向って出来合いの機能をたくさん用意する事で自作する機会を減らす方向の進化で、自作のし易さを加速させる、根源的な生産性を上げる進化じゃ無い気がして来たのよな。
679デフォルトの名無しさん
2017/06/02(金) 11:53:23.75ID:ybQLwqcw >>677
Squeakは経験済みでしたかそれは失礼いたしました
ただSqueak等でちょっと調べてみれば分かりますが、他の言語やそのIDEのやり方とは違いSmalltalk環境のGUIツールは基本
クラスを含むオブジェクトの持つイントロスペクション機能にちょっとしたGUIのガワをかぶせただけシンプルなしくみで動いています
それはつまりGNU Smalltalkでも、Squeak等が“GUIのガワ”が中でやっていることを式で書いてやればそれなりのことは事足りるということです
たとえば Integer >> #factorial というメソッドのソースが読みたければそれに methodSourceString というメッセージを送る
(Integer >> #factorial) methodSourceString
といった調子で、そしてこれがSmalltalkのシステムブラウザがやっていることのほぼ全てです
じゃあ、factorial や Integer はともかく、>> だの methodSourceString だのはどうやって分かるかというと
もちろん GNU Smalltalk のリファレンスをググるのも手ではありますが
#>> implementors で実装クラスを一覧したり、
#>> implementors anyOne methodSourceString で定義を見たりするのがSmalltalkでのやり方になります
覚えておくよりはその都度オブジェクトたちに尋ねるという彼らとの対話の妙をぜひお試しあれかし
Squeakは経験済みでしたかそれは失礼いたしました
ただSqueak等でちょっと調べてみれば分かりますが、他の言語やそのIDEのやり方とは違いSmalltalk環境のGUIツールは基本
クラスを含むオブジェクトの持つイントロスペクション機能にちょっとしたGUIのガワをかぶせただけシンプルなしくみで動いています
それはつまりGNU Smalltalkでも、Squeak等が“GUIのガワ”が中でやっていることを式で書いてやればそれなりのことは事足りるということです
たとえば Integer >> #factorial というメソッドのソースが読みたければそれに methodSourceString というメッセージを送る
(Integer >> #factorial) methodSourceString
といった調子で、そしてこれがSmalltalkのシステムブラウザがやっていることのほぼ全てです
じゃあ、factorial や Integer はともかく、>> だの methodSourceString だのはどうやって分かるかというと
もちろん GNU Smalltalk のリファレンスをググるのも手ではありますが
#>> implementors で実装クラスを一覧したり、
#>> implementors anyOne methodSourceString で定義を見たりするのがSmalltalkでのやり方になります
覚えておくよりはその都度オブジェクトたちに尋ねるという彼らとの対話の妙をぜひお試しあれかし
680デフォルトの名無しさん
2017/06/02(金) 12:43:16.45ID:ybQLwqcw >>678
> オブジェクト指向って出来合いの機能をたくさん用意する事で自作する機会を減らす方向の進化
出来合いの(組み込みの)機能といっても、元は自作なんですよ(少なくともSmalltalkにおいては)
それらを簡単に実装できるという精神はHaskell、ひいてはFPに通じるところはあると思いますよ
それにHaskellにしてもパターンマッチや型クラスを含む型システムなどの便利な組み込みの機能の助けなしに、あるいは
リストなどのモナドの拡充なしに自作のしやすさの加速ができるわけでもないような気がしますが…違いますかね
> オブジェクト指向って出来合いの機能をたくさん用意する事で自作する機会を減らす方向の進化
出来合いの(組み込みの)機能といっても、元は自作なんですよ(少なくともSmalltalkにおいては)
それらを簡単に実装できるという精神はHaskell、ひいてはFPに通じるところはあると思いますよ
それにHaskellにしてもパターンマッチや型クラスを含む型システムなどの便利な組み込みの機能の助けなしに、あるいは
リストなどのモナドの拡充なしに自作のしやすさの加速ができるわけでもないような気がしますが…違いますかね
681デフォルトの名無しさん
2017/06/02(金) 12:44:30.15ID:AZK4Ab0s >>677
オブジェクト指向は、複雑さ、巨大さとどう戦うかというのが進化の方向
HaskellやLispでデカくて複雑なプログラム書いてみたら、オブジェクト指向にも有用な部分があることを理解できるんじゃない?
ちょっとしたコードの書きやすさだけで言語の良し悪しは決まらないよ
オブジェクト指向は、複雑さ、巨大さとどう戦うかというのが進化の方向
HaskellやLispでデカくて複雑なプログラム書いてみたら、オブジェクト指向にも有用な部分があることを理解できるんじゃない?
ちょっとしたコードの書きやすさだけで言語の良し悪しは決まらないよ
682デフォルトの名無しさん
2017/06/02(金) 13:19:41.98ID:E2RwPTWY Objective-Cにも動的にクラスに「おまえなにできるの?」って聞くメッセージあるし
基本的にあの辺りはインターネットみたいな動作しっぱなしの世界で
クラスってノードを動作中に抜き差しするみたいな感覚を指向してるからなぁ。
基本的にあの辺りはインターネットみたいな動作しっぱなしの世界で
クラスってノードを動作中に抜き差しするみたいな感覚を指向してるからなぁ。
683デフォルトの名無しさん
2017/06/02(金) 13:25:35.15ID:4h5vYSNt インタフェース以外の継承はすべて糞
684デフォルトの名無しさん
2017/06/02(金) 13:27:17.37ID:PwRFjZu6 >>679
その都度オブジェクトたちに尋ねるのが、まさにsmalltalkがオブジェクト指向の最たるものの所以で、当時も今もそこについては変わらないんですけどね。
さすがにgnu-smalltalkでは一覧性に難ありな所が^^;
逆です。
その便利な機能のみで、入出力とかはともかく、自分がこう動いて欲しいと望む機能を実現できる。
そこに関してsmalltalkとFPに通じる所があるのも同意します。
ただあれはsmalltalkであってsmalltalkじゃ無いというか。。。
smalltalkって制御構造もメッセージで実現してるけど、Haskellと同じで構造化プログラミングを模倣してるだけで、やや普通のオブジェクト指向言語より構造化プログラミングから逸脱してる気もしますし、確かに生産性は高いんですけど。
ただ、既存の関数やメソッドを一切使わず新しい機能を実現する手間は、その基本的な便利機能の充実度から、Haskellのが生産性は高いかと。
探すより作った方が早い場面もありますし。
(いあ、smalltalkは探すスピード上げる方向の進化と考えれば、作った方が早いって場面も少ないんでしょうが)
その都度オブジェクトたちに尋ねるのが、まさにsmalltalkがオブジェクト指向の最たるものの所以で、当時も今もそこについては変わらないんですけどね。
さすがにgnu-smalltalkでは一覧性に難ありな所が^^;
逆です。
その便利な機能のみで、入出力とかはともかく、自分がこう動いて欲しいと望む機能を実現できる。
そこに関してsmalltalkとFPに通じる所があるのも同意します。
ただあれはsmalltalkであってsmalltalkじゃ無いというか。。。
smalltalkって制御構造もメッセージで実現してるけど、Haskellと同じで構造化プログラミングを模倣してるだけで、やや普通のオブジェクト指向言語より構造化プログラミングから逸脱してる気もしますし、確かに生産性は高いんですけど。
ただ、既存の関数やメソッドを一切使わず新しい機能を実現する手間は、その基本的な便利機能の充実度から、Haskellのが生産性は高いかと。
探すより作った方が早い場面もありますし。
(いあ、smalltalkは探すスピード上げる方向の進化と考えれば、作った方が早いって場面も少ないんでしょうが)
685デフォルトの名無しさん
2017/06/02(金) 13:33:45.72ID:PwRFjZu6 >>681
昔はGUI部分も同じ言語で書いてたからオブジェクト指向が有用だったですが、今はGUI部分はHTMLなりXAMLで書くことも増えて来ましたし、複雑な部分はDSLに任せて分担作業が、複雑巨大なプログラムに対する解の様に思います。
昔はGUI部分も同じ言語で書いてたからオブジェクト指向が有用だったですが、今はGUI部分はHTMLなりXAMLで書くことも増えて来ましたし、複雑な部分はDSLに任せて分担作業が、複雑巨大なプログラムに対する解の様に思います。
686デフォルトの名無しさん
2017/06/02(金) 13:46:34.00ID:Uh1XLH/T 遅延結合って、実行時に型を調べて処理を分岐してるだけでしょ?
687デフォルトの名無しさん
2017/06/02(金) 13:57:11.97ID:ybQLwqcw >>684
> さすがにgnu-smalltalkでは一覧性に難ありな所が^^;
> ただあれはsmalltalkであってsmalltalkじゃ無いというか。。。
具体的にはどういったところがでしょうか? 後学のため教えていたければ幸いです
> smalltalkは探すスピード上げる方向の進化と考えれば、作った方が早いって場面も少ないんでしょうが
SmalltalkがOSモドキと忌み嫌われつつもイメージベースで居続けるのはこの利便性を捨てないためです
ユーザー定義のものも組み込みのものも区別せずにオブジェクトストアに保持し、OODBのように探せます
> さすがにgnu-smalltalkでは一覧性に難ありな所が^^;
> ただあれはsmalltalkであってsmalltalkじゃ無いというか。。。
具体的にはどういったところがでしょうか? 後学のため教えていたければ幸いです
> smalltalkは探すスピード上げる方向の進化と考えれば、作った方が早いって場面も少ないんでしょうが
SmalltalkがOSモドキと忌み嫌われつつもイメージベースで居続けるのはこの利便性を捨てないためです
ユーザー定義のものも組み込みのものも区別せずにオブジェクトストアに保持し、OODBのように探せます
688デフォルトの名無しさん
2017/06/02(金) 14:05:56.39ID:ybQLwqcw >>686
実行時についてはそうなのですが、それを設計や運用時にも徹底する(それをサポートできるシステムであること)がミソです
決定をできるだけ先送りにして固定化しない、ぎりぎり直前でも(場合によっては事後でも)差し替え可能に保ちます
基本的な考え方はこちらに書かれていますのでよかったら読んでみてください
「ソフトウェア工学」は矛盾語法か? - アラン・ケイ
http://metatoys.org/oxymoron/oxymoron.html
アラン・ケイもよく言っていますが、これができるのはおそらくLISPとSmalltalkくらいかと
実行時についてはそうなのですが、それを設計や運用時にも徹底する(それをサポートできるシステムであること)がミソです
決定をできるだけ先送りにして固定化しない、ぎりぎり直前でも(場合によっては事後でも)差し替え可能に保ちます
基本的な考え方はこちらに書かれていますのでよかったら読んでみてください
「ソフトウェア工学」は矛盾語法か? - アラン・ケイ
http://metatoys.org/oxymoron/oxymoron.html
アラン・ケイもよく言っていますが、これができるのはおそらくLISPとSmalltalkくらいかと
689デフォルトの名無しさん
2017/06/02(金) 15:12:57.10ID:PwRFjZu6 >>687
あれ。
Squeakの時に低レベルのもの書く時って、それ用のsmalltalk無かったでしたっけ?
名前忘れたけど。。。
gnu-smalltalkみたいなのが主流にならないと、結局OSモドキに引き篭もって外とやり取りなんですよね。。。
例えば鯖のログを必要な箇所だけ見れる様に加工したいって時でシェルやLLが使われますが、smalltalkはその代替えにならない。
その為だけにOSモドキを立ち上げる手間が壁になる。
まあ、それはHaskellも微妙な立場なんですが、シェル知らなくても、各種LL(HaskellはLLじゃ無いけど関数知らなくてもって意味でHaskell自身の関数も含む)の関数やクラス知らなくても、Haskellなら、自分の発想でこういう加工したいってすぐに自作出来ます。
ただ、コンパイルが遅いので、LLとどっちが便利かが微妙になるだけで。。。
smalltalkはOSモドキと一体の生産性ですが、現実問題、言語は問題解決の手段であって、手段を使用する事自体に手間が掛かってしまっては元も子もないと考えます。
。。。Haskellもその点で微妙ですけどね。
(runghcでLLとして実行しても型検査はするから起動がLLより遅い)
Haskellのパターンマッチや遅延評価やモナドは作り手の知識が少なくても「作りやすい」仕組みだと感じます。
一方のsmalltalkは知識が少なくても「探しやすい」仕組み。
そう感じました。
LLはどっちも80点だけど、総合点で上回る的な。
でも規模が大きくなると型付言語が欲しくなる。。。
あれ。
Squeakの時に低レベルのもの書く時って、それ用のsmalltalk無かったでしたっけ?
名前忘れたけど。。。
gnu-smalltalkみたいなのが主流にならないと、結局OSモドキに引き篭もって外とやり取りなんですよね。。。
例えば鯖のログを必要な箇所だけ見れる様に加工したいって時でシェルやLLが使われますが、smalltalkはその代替えにならない。
その為だけにOSモドキを立ち上げる手間が壁になる。
まあ、それはHaskellも微妙な立場なんですが、シェル知らなくても、各種LL(HaskellはLLじゃ無いけど関数知らなくてもって意味でHaskell自身の関数も含む)の関数やクラス知らなくても、Haskellなら、自分の発想でこういう加工したいってすぐに自作出来ます。
ただ、コンパイルが遅いので、LLとどっちが便利かが微妙になるだけで。。。
smalltalkはOSモドキと一体の生産性ですが、現実問題、言語は問題解決の手段であって、手段を使用する事自体に手間が掛かってしまっては元も子もないと考えます。
。。。Haskellもその点で微妙ですけどね。
(runghcでLLとして実行しても型検査はするから起動がLLより遅い)
Haskellのパターンマッチや遅延評価やモナドは作り手の知識が少なくても「作りやすい」仕組みだと感じます。
一方のsmalltalkは知識が少なくても「探しやすい」仕組み。
そう感じました。
LLはどっちも80点だけど、総合点で上回る的な。
でも規模が大きくなると型付言語が欲しくなる。。。
690デフォルトの名無しさん
2017/06/02(金) 17:01:43.90ID:ybQLwqcw >>689
> シェル知らなくても、各種LL(HaskellはLLじゃ無いけど関数知らなくてもって意味でHaskell自身の関数も含む)の関数やクラス知らなくても、
> Haskellなら、自分の発想でこういう加工したいってすぐに自作出来ます。
つまりHaskellでは組み込みの関数をいっさい知らなくとも(使わなくても)ログの整形作業が自作できるのですか?
それは驚きですね(反語的に)
> シェル知らなくても、各種LL(HaskellはLLじゃ無いけど関数知らなくてもって意味でHaskell自身の関数も含む)の関数やクラス知らなくても、
> Haskellなら、自分の発想でこういう加工したいってすぐに自作出来ます。
つまりHaskellでは組み込みの関数をいっさい知らなくとも(使わなくても)ログの整形作業が自作できるのですか?
それは驚きですね(反語的に)
691デフォルトの名無しさん
2017/06/02(金) 17:24:22.28ID:PwRFjZu6 出来ますね。
結局ライブラリ使った方が早いんですが、学習しながら作ると言う意味では即戦力です。
だからなんだと言われればそれまでですが、GUIとかのライブラリがポトペタで作れたりしないので開発環境としてはまだまだですが、言語としての学習コストは低いと思ってます。
結局ライブラリ使った方が早いんですが、学習しながら作ると言う意味では即戦力です。
だからなんだと言われればそれまでですが、GUIとかのライブラリがポトペタで作れたりしないので開発環境としてはまだまだですが、言語としての学習コストは低いと思ってます。
692デフォルトの名無しさん
2017/06/02(金) 17:35:52.70ID:ybQLwqcw693デフォルトの名無しさん
2017/06/02(金) 17:38:49.65ID:PwRFjZu6 あ、さすがに入出力関数は使いますよ?
でも、その中間の整形処理は一切組み込み関数知らなくても作れますし、その行為自体もそんなに手間じゃ無いです。
Cとかでもある意味整形処理は全部自作出来るわけですが、手間が全然違います。
smalltalkもそう言う意味では少ない知識で自前で作れると思いますが、ロジック部分に関してだけは、Haskellのがより少ない知識で済んでると思います。
GUIまで含めるとライブラリの塊と言うかライブラリそのものなsmalltalkのが生産性は高いんですが。。。
それこそsmalltalkそのものがOSとして普及しないとあんまり意味がないと言うか。。。
でも、その中間の整形処理は一切組み込み関数知らなくても作れますし、その行為自体もそんなに手間じゃ無いです。
Cとかでもある意味整形処理は全部自作出来るわけですが、手間が全然違います。
smalltalkもそう言う意味では少ない知識で自前で作れると思いますが、ロジック部分に関してだけは、Haskellのがより少ない知識で済んでると思います。
GUIまで含めるとライブラリの塊と言うかライブラリそのものなsmalltalkのが生産性は高いんですが。。。
それこそsmalltalkそのものがOSとして普及しないとあんまり意味がないと言うか。。。
694デフォルトの名無しさん
2017/06/02(金) 17:44:01.62ID:PwRFjZu6 >>692
もう出勤1時間前なので流石に今日は作れませんが、何かコードを提示して、組み込み関数を自作して行きましょうか。
上でも書いたですが、制御構造と最低限の入出力関数があれば作れはします。
手間の問題というだけです。
もう出勤1時間前なので流石に今日は作れませんが、何かコードを提示して、組み込み関数を自作して行きましょうか。
上でも書いたですが、制御構造と最低限の入出力関数があれば作れはします。
手間の問題というだけです。
695デフォルトの名無しさん
2017/06/02(金) 18:57:35.54ID:ybQLwqcw >>694
> 今日は作れませんが、何かコードを提示して、組み込み関数を自作して行きましょうか。
おもしろそうですねぜひお願いします
> それこそsmalltalkそのものがOSとして普及しないとあんまり意味がないと言うか。。。
Dockerとかありますし、ホストOS内でOSモドキを動かすことにマシンパワーや心理的障壁は下がってきていると思いますので
「意味がない」と言うことはないと思いますよ
> 今日は作れませんが、何かコードを提示して、組み込み関数を自作して行きましょうか。
おもしろそうですねぜひお願いします
> それこそsmalltalkそのものがOSとして普及しないとあんまり意味がないと言うか。。。
Dockerとかありますし、ホストOS内でOSモドキを動かすことにマシンパワーや心理的障壁は下がってきていると思いますので
「意味がない」と言うことはないと思いますよ
696デフォルトの名無しさん
2017/06/03(土) 02:39:21.79ID:uXpVhTjv 中規模以上の範囲におけるDRY原則を
実現するための手段が
オブジェクト指向じゃないの?
そういう意味ではオブジェクト指向が
なくてもプログラミング出来る。
しかし重複部分を無くすには
オブジェクト指向しかないでしょ?
実現するための手段が
オブジェクト指向じゃないの?
そういう意味ではオブジェクト指向が
なくてもプログラミング出来る。
しかし重複部分を無くすには
オブジェクト指向しかないでしょ?
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のコードで
メモリに一気には読み込めない巨大なファイルを扱わなければならないとしたら
今の枠組みのまま対応することはできないでしょう?それと同じ話です
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「おこめ券は米以外の食品も買える。効果的な活用を」 地元で農水相 [山形県] [少考さん★]
- 【速報】「女芸人No.1決定戦 THE W」9代目女王にニッチェ! 7年ぶり3度目で悲願の優勝 [牛丼★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★11 [蚤の市★]
- 【芸能】『女芸人No.1決定戦THE W』 粗品が最後にバッサリ「優勝賞金1000万円にしてはレベル低い大会」 [冬月記者★]
- 旧姓使用拡大に連合会長が反発 「何の説明もない。選択的夫婦別氏制度導入を」 男女共同参画会議 [ぐれ★]
- 向こう3カ月のコメ価格、下落予想強まる…新の収穫量増え需給緩むか 米穀安定供給…調査 [蚤の市★]
