お願いします。言語は問いません。
オブジェクト指向言語じゃなくても
オブジェクト指向の話であれば問題ありません。
探検
オブジェクト指向の活用方法を教えて下さい
■ このスレッドは過去ログ倉庫に格納されています
2014/03/25(火) 21:44:07.66ID:AtcH5MLU
2014/03/27(木) 01:42:00.90ID:E6f/eeJ0
>>62
なんでそんなに追い詰められてんの?
なんでそんなに追い詰められてんの?
2014/03/27(木) 01:47:38.94ID:gcsG9K2Q
>>61
プログラムの実行順が気になる?
それは抽象化ができてないから。
長いコードがあって、その順番まで意識しないといけなくなってる。
つまりそのコードは細かい断片で考えることができないということだよ。
変数もスコープが広くなってるね。着目したい変数でgrepしてわかるということは
変数名は長くなっているはず。でないと他の変数名とかぶるはずだからね。で、関数は使われてないと。
(関数が適切に使われていれば同じ"ローカル"変数名が何度も出てくる。同じでいいから名前考える手間省けるよ?)
関数は引数と戻り値があるだけ。それはいつどのタイミングでも使っても良い。
このようになっていれば、全体のことは考えずにその関数という小さな部分で考えることが出来る。
大きなものを大きなまま作るのではなく小さな物にしていく。
そうすれば順番なんて気にすることはないよ。
順番なんて気にしていたら、ユニットテストで関数をテストするときどうするのさ?
ユニットテストではある関数を狙い撃ちでテストするのよ?
プログラムの実行順が気になる?
それは抽象化ができてないから。
長いコードがあって、その順番まで意識しないといけなくなってる。
つまりそのコードは細かい断片で考えることができないということだよ。
変数もスコープが広くなってるね。着目したい変数でgrepしてわかるということは
変数名は長くなっているはず。でないと他の変数名とかぶるはずだからね。で、関数は使われてないと。
(関数が適切に使われていれば同じ"ローカル"変数名が何度も出てくる。同じでいいから名前考える手間省けるよ?)
関数は引数と戻り値があるだけ。それはいつどのタイミングでも使っても良い。
このようになっていれば、全体のことは考えずにその関数という小さな部分で考えることが出来る。
大きなものを大きなまま作るのではなく小さな物にしていく。
そうすれば順番なんて気にすることはないよ。
順番なんて気にしていたら、ユニットテストで関数をテストするときどうするのさ?
ユニットテストではある関数を狙い撃ちでテストするのよ?
2014/03/27(木) 01:48:13.52ID:gcsG9K2Q
2014/03/27(木) 01:48:36.67ID:E6f/eeJ0
LoCは何かと馬鹿にされがちだけど、
逆にCOCOMO2でとか言われても誰が答えられるってんだっていう。
つか変数や関数の数って何だよ。どうしてそれが気になる。コボラーか?
俺はどれも気にしないし、計測ツールもいれてねえよチクショウ。
逆にCOCOMO2でとか言われても誰が答えられるってんだっていう。
つか変数や関数の数って何だよ。どうしてそれが気になる。コボラーか?
俺はどれも気にしないし、計測ツールもいれてねえよチクショウ。
2014/03/27(木) 01:49:47.41ID:2gDV9B/K
(オブジェクト指向から離れちゃうけど)関数を一画面に収まる規模にして、複数の関数から
構成するようにすると、関数呼び出しが発生することになってしまいます。それが必然性が
ないものだったら、ロジックを追いづらいし、メンテしずらくなってしまうような気がしま
す。大体、関数の名前を考えるのに苦労してしまって、変な名前をつけちゃいそうです。
個人の技術力の問題であれば、しばらくROMってます。
構成するようにすると、関数呼び出しが発生することになってしまいます。それが必然性が
ないものだったら、ロジックを追いづらいし、メンテしずらくなってしまうような気がしま
す。大体、関数の名前を考えるのに苦労してしまって、変な名前をつけちゃいそうです。
個人の技術力の問題であれば、しばらくROMってます。
2014/03/27(木) 01:53:16.02ID:gcsG9K2Q
LoCは「同じ仕様のアプリを作った時に短いほうが優れているだろう」という
判断には使えるがそれ以外の目的では使えないよ。
LoCが多くてもは生産性が高いことにはならない
(たとえばコピペをすれば簡単に水増しできるが、これは品質を下げる行為)
判断には使えるがそれ以外の目的では使えないよ。
LoCが多くてもは生産性が高いことにはならない
(たとえばコピペをすれば簡単に水増しできるが、これは品質を下げる行為)
2014/03/27(木) 01:55:37.34ID:zuVXk4tw
Javaは現代のCOBOL
2014/03/27(木) 02:05:57.47ID:gcsG9K2Q
>>67
> 関数呼び出しが発生することになってしまいます。それが必然性が
> ないものだったら、ロジックを追いづらいし
それも俺の中では答えが出てる。
それは関数呼び出しをした時、関数の中まで見ないとロジックが
わからないようなコード(関数)になっているから。
たとえば、printf()という関数、その関数の中まで追ってみないでしょう?
それは関数名さえ見れば、中を追わなくてわかるから。
追わなくてもわかるというのは、脳に記憶できているということ。
関数の仕様がわかりやすいものは記憶できるが
中で何やっているかさっぱりな関数は記憶できない。
そういう関数は複雑ということ。記憶できないような関数を作らない。
大きなアプリを作るとき、コードをいちいち読んでいたらいくら時間があっても足りない。
だから読む時間を記憶することで圧縮する。とはいっても複雑なものは記憶できないし、
数が多くても記憶できない。俺は記憶術の天才じゃないのでね。
だから、関数はできるだけ単純な機能にする。複雑で高機能なものをたくさん作るよりも
(たくさん作ると名前をつけるのに困るし)
単純なものを少数作って、それを組み合わせるほうが覚えることが少ない。
中を見ないとわからないような関数は作らない。そういうのはだめな関数。
(オブジェクト指向にする理由としてオブジェクトという単位でグループ分けしておけば、覚えやすいというのもある)
そうやって読むべき所を減らしていけばいいんだよ。関数の中を見なくて済むような
そんな関数にしていけば、関数呼び出しが発生してもロジックは追える。見なくて言い分早く追える。
> 関数呼び出しが発生することになってしまいます。それが必然性が
> ないものだったら、ロジックを追いづらいし
それも俺の中では答えが出てる。
それは関数呼び出しをした時、関数の中まで見ないとロジックが
わからないようなコード(関数)になっているから。
たとえば、printf()という関数、その関数の中まで追ってみないでしょう?
それは関数名さえ見れば、中を追わなくてわかるから。
追わなくてもわかるというのは、脳に記憶できているということ。
関数の仕様がわかりやすいものは記憶できるが
中で何やっているかさっぱりな関数は記憶できない。
そういう関数は複雑ということ。記憶できないような関数を作らない。
大きなアプリを作るとき、コードをいちいち読んでいたらいくら時間があっても足りない。
だから読む時間を記憶することで圧縮する。とはいっても複雑なものは記憶できないし、
数が多くても記憶できない。俺は記憶術の天才じゃないのでね。
だから、関数はできるだけ単純な機能にする。複雑で高機能なものをたくさん作るよりも
(たくさん作ると名前をつけるのに困るし)
単純なものを少数作って、それを組み合わせるほうが覚えることが少ない。
中を見ないとわからないような関数は作らない。そういうのはだめな関数。
(オブジェクト指向にする理由としてオブジェクトという単位でグループ分けしておけば、覚えやすいというのもある)
そうやって読むべき所を減らしていけばいいんだよ。関数の中を見なくて済むような
そんな関数にしていけば、関数呼び出しが発生してもロジックは追える。見なくて言い分早く追える。
2014/03/27(木) 07:13:03.30ID:EL0PowgV
オブジェクト指向のこころは良い本だ
72デフォルトの名無しさん
2014/03/27(木) 07:26:53.08ID:6dxUJoHd 「オブジェクト」が参照なのって割と不便だよね。
2014/03/27(木) 10:03:27.48ID:E6f/eeJ0
関数型プログラミング的に言うと、
副作用(内部情報を持つ、外部デバイスにアクセスする等)のある関数は
プログラムを複雑にする悪玉菌扱いなんだけどね。
かといって純粋関数だけでプログラムかけるかっていう現実問題はあるけど。
しかし問題の切り分け方として、データと処理がセットになることが必ずしも礼賛されるかというとそうでもない。
副作用(内部情報を持つ、外部デバイスにアクセスする等)のある関数は
プログラムを複雑にする悪玉菌扱いなんだけどね。
かといって純粋関数だけでプログラムかけるかっていう現実問題はあるけど。
しかし問題の切り分け方として、データと処理がセットになることが必ずしも礼賛されるかというとそうでもない。
2014/03/27(木) 11:42:05.43ID:pwhdAG7g
>>70
実際にはprintf()の中身は複雑なんですけどね。
https://www.sourceware.org/cgi-bin/cvsweb.cgi/libc/stdio/Attic/vfprintf.c?rev=1.30&content-type=text/x-cvsweb-markup&cvsroot=glibc
実際にはprintf()の中身は複雑なんですけどね。
https://www.sourceware.org/cgi-bin/cvsweb.cgi/libc/stdio/Attic/vfprintf.c?rev=1.30&content-type=text/x-cvsweb-markup&cvsroot=glibc
2014/03/27(木) 12:26:13.49ID:rDeXrVt7
もっとも身近なオブジェクト指向の概念って、
ファイルやソケットのディスクリプタかな
説明もしやすいし理解も早い
ファイルやソケットのディスクリプタかな
説明もしやすいし理解も早い
2014/03/27(木) 12:52:47.48ID:Q+RTv4Ce
ファイラー上で見るファイルオブジェクト
あれのポップアップメニューが変化するのを見せるのがよさそう
あれのポップアップメニューが変化するのを見せるのがよさそう
2014/03/27(木) 15:10:04.52ID:qIhM9I6N
>>75
俺はStringクラスだと思うね。
この例を出すとどうも必ず叩かれるんだけどw
前提として長さをprivateで持ってる実装を考える(例えばjava.lang.Stringね)。
それを、連続したchar領域などと比較する。
strlenしないと長さが得られないのが後者で、
内部に既に長さを持ってるのが前者。
文字列データと、長さ、っていう非常に近い関係のものが、
内部に一緒に揃ってる。
一緒にあったほうがマシだから、一緒にある。
クラスの内側にそれを隠し持ってる。
そして、いろんなメソッドの内部でふんだんに参照してる。
俺はStringクラスだと思うね。
この例を出すとどうも必ず叩かれるんだけどw
前提として長さをprivateで持ってる実装を考える(例えばjava.lang.Stringね)。
それを、連続したchar領域などと比較する。
strlenしないと長さが得られないのが後者で、
内部に既に長さを持ってるのが前者。
文字列データと、長さ、っていう非常に近い関係のものが、
内部に一緒に揃ってる。
一緒にあったほうがマシだから、一緒にある。
クラスの内側にそれを隠し持ってる。
そして、いろんなメソッドの内部でふんだんに参照してる。
2014/03/27(木) 15:29:20.56ID:zuVXk4tw
strlenしないと長さが得られないのか、最初から長さを持ってるのか、
中身がどういう仕掛けになってるのか気にしなくていいのがオブジェクト指向なんじゃないの?
中身がどういう仕掛けになってるのか気にしなくていいのがオブジェクト指向なんじゃないの?
2014/03/27(木) 15:29:34.54ID:Q+RTv4Ce
昔はそう思ったこともあるが実装とI/Fがあまりにも近すぎてよくない
80デフォルトの名無しさん
2014/03/27(木) 16:23:36.30ID:R9FKO6iJ JavaのStringだと、lengthはフィールドじゃなくてメソッドでは?
内部で保持してるのかどうかは知らんが
内部で保持してるのかどうかは知らんが
2014/03/27(木) 19:09:37.68ID:+xc3TnzN
>ファイルやソケットのディスクリプタかな
ハンドル持ち回りはCによる実装レベルでも十分確立されてるし
OO言語じゃないと実装がとても大変って例はないもんかね
ハンドル持ち回りはCによる実装レベルでも十分確立されてるし
OO言語じゃないと実装がとても大変って例はないもんかね
2014/03/27(木) 20:16:21.85ID:rDeXrVt7
2014/03/27(木) 20:31:07.44ID:gcsG9K2Q
>>74
> 実際にはprintf()の中身は複雑なんですけどね。
いや、知ってるってw
複雑だけど、関数にすることで、
”中を見なくて良くなっている"
これがいい関数の例。
中を見ないと、どんなことやってるかわからないよ〜。
となってるのが、悪い関数の例。
> 実際にはprintf()の中身は複雑なんですけどね。
いや、知ってるってw
複雑だけど、関数にすることで、
”中を見なくて良くなっている"
これがいい関数の例。
中を見ないと、どんなことやってるかわからないよ〜。
となってるのが、悪い関数の例。
2014/03/27(木) 21:26:09.20ID:ZhR8Azo0
C++のストリーム演算子らへんは何をやってるのかさっぱり判らない悪い例じゃないの
2014/03/27(木) 21:34:12.95ID:gcsG9K2Q
>>84
何をやってるのかさっぱりわからないのは、
ストリーム演算子の中身の話であって、
そのストリーム演算子を使う人は
中身を見なくても、使えるでしょう?
関数の中身を見ないとロジックが追えないというのは
つまりこういうことだよ。(関数名は例ではない)
function process() {
initialize();
calc_price();
save_data()
}
何をやってるのかさっぱりわからないのは、
ストリーム演算子の中身の話であって、
そのストリーム演算子を使う人は
中身を見なくても、使えるでしょう?
関数の中身を見ないとロジックが追えないというのは
つまりこういうことだよ。(関数名は例ではない)
function process() {
initialize();
calc_price();
save_data()
}
2014/03/27(木) 21:55:08.72ID:ZhR8Azo0
>>85
お話が通じないことが良く判ったよ
俺流オペレータが何をやってるのかは中を見なと判らないでしょ
だからストリーム演算子の例を出したのに「使う人は使える」
>(関数名は例ではない)
ちゃんとした関数名にすれば中身見る必要無いだろ
お話が通じないことが良く判ったよ
俺流オペレータが何をやってるのかは中を見なと判らないでしょ
だからストリーム演算子の例を出したのに「使う人は使える」
>(関数名は例ではない)
ちゃんとした関数名にすれば中身見る必要無いだろ
2014/03/27(木) 22:02:47.00ID:ZhR8Azo0
printfも可変引数の仕組みと書式の関係が判ってようやく
初めて使えるレベルになるものだと思うけどな
それって結局中身見ないとまともに使えないでござるよ…って事にならないかね?
まさかこんなスレでprintfの中身を一度も見たことない奴なんていないだろうから
きっと錯覚してるだけだよ
初めて使えるレベルになるものだと思うけどな
それって結局中身見ないとまともに使えないでござるよ…って事にならないかね?
まさかこんなスレでprintfの中身を一度も見たことない奴なんていないだろうから
きっと錯覚してるだけだよ
2014/03/27(木) 22:06:56.92ID:+xc3TnzN
そういう意味だと上のハンドル志向が一番解りやすい
中を見たいとも思わないし
中を見たいとも思わないし
2014/03/27(木) 22:09:08.87ID:UpPNmNS/
誰かJava8のStreamの話をしてくれ。
2014/03/27(木) 22:12:33.90ID:ZhR8Azo0
かなりprintf族もハンドル取るのあるだろ
いやそういうことではなくて、関数名だけでちゃんと表現できてれば中身見る必要なんてないんだよ
結局いくら関数化しても中身見ないといけないようなケースは必ず存在するんだよ
いやそういうことではなくて、関数名だけでちゃんと表現できてれば中身見る必要なんてないんだよ
結局いくら関数化しても中身見ないといけないようなケースは必ず存在するんだよ
2014/03/27(木) 22:18:02.77ID:GOaviY18
今言う中身は実装じゃね?
実装を知らなくても使い方が分かればいいと
例は良くわかんない
実装を知らなくても使い方が分かればいいと
例は良くわかんない
2014/03/27(木) 22:26:01.90ID:ZhR8Azo0
実装を知らなくても使い方を想像できるってのは
裏返せば過去に自分が似たような物を作ったり設計書見たりとか
それなりの経験のある中の事じゃないの?
実装がさっぱり想像できないのをいくら眺めたところで
使い方が判るようになるとはとても思えないけど
裏返せば過去に自分が似たような物を作ったり設計書見たりとか
それなりの経験のある中の事じゃないの?
実装がさっぱり想像できないのをいくら眺めたところで
使い方が判るようになるとはとても思えないけど
2014/03/27(木) 22:27:02.26ID:1568NTop
コメントとか仕様書とかに使い方が書いてあれば実装を見なくても済む
printfのすべての実装なんて見たことないけど、仕様書どうりの動作をするとわかっている
printfのすべての実装なんて見たことないけど、仕様書どうりの動作をするとわかっている
2014/03/27(木) 22:36:29.59ID:GOaviY18
想像して使うってのはよく分からないけどsleep()とかsystem()はそれに近いかも?
使い方を知って、かつそれが曖昧になっても関数名や引数で思い出せるってところが分かり易さじゃない?
逆に見ても分からないってのは設計として複雑な気が
std::coutでいえば<<なら直感的だけど>>だと途端に恐怖を覚える
使い方を知って、かつそれが曖昧になっても関数名や引数で思い出せるってところが分かり易さじゃない?
逆に見ても分からないってのは設計として複雑な気が
std::coutでいえば<<なら直感的だけど>>だと途端に恐怖を覚える
2014/03/27(木) 22:41:51.63ID:zuVXk4tw
GoogleのC++スタイルガイドではストリームはやめろprintf使っとけって事になってるな。
2014/03/27(木) 23:09:47.29ID:1568NTop
他の言語に全く採用されないところをみるに、たんに演算子いじれてすごいでしょアピールで実利はなかったんだったんだろう
2014/03/27(木) 23:29:08.64ID:ZhR8Azo0
可変引数は呼び出し側自己申告以外にチェック機能が無いからバグの温床になりやすく
標準ライブラリからは除外したかったと昔どっかで読んだよ
正規表現みたいに書式と引数の型から判定するような仕組みは作れたはずだけど
それを言語仕様に含めてしまうと1関数でしかなかったprintfの書式文字列を
今更特別扱いするのは抵抗がとか紆余曲折あって全く別の方向に逃げた
標準ライブラリからは除外したかったと昔どっかで読んだよ
正規表現みたいに書式と引数の型から判定するような仕組みは作れたはずだけど
それを言語仕様に含めてしまうと1関数でしかなかったprintfの書式文字列を
今更特別扱いするのは抵抗がとか紆余曲折あって全く別の方向に逃げた
2014/03/27(木) 23:34:55.71ID:1568NTop
コンパイラが警告してくれるけどね
2014/03/27(木) 23:55:40.61ID:gcsG9K2Q
100デフォルトの名無しさん
2014/03/27(木) 23:59:54.87ID:zuVXk4tw 俺流オペレータの代表格だわな
101デフォルトの名無しさん
2014/03/28(金) 00:09:53.54ID:9wj0hHB8 代表格 = 同じではないという意味。
102デフォルトの名無しさん
2014/03/28(金) 00:14:00.53ID:Ek64RinZ そのストリーム演算子を使う人は
中身を見なくても、使えるでしょう?
関数の中身を見ないとロジックが追えないというのは
つまりこういうことだよ。(関数名は例ではない)
function process() {
initialize();
calc_price();
save_data()
}
定義済みのストリーム演算子は覚えればいいから、中を見ないでわかる。
俺俺オペレータで中を見ないとロジックを追えないようなものは
上に書いてあるのと同じ問題がある。
関数がダメなんじゃなくて使い方の問題。
オペレータもそれ自体がダメなんじゃなくて、使い方の問題。
中を見ないとロジック追えないような関数(オペレータも)はダメな関数。
話はこれと何も変わっとらん。反論にはなっていない。むしろ俺と同じことを言ってるだけ。
中身を見なくても、使えるでしょう?
関数の中身を見ないとロジックが追えないというのは
つまりこういうことだよ。(関数名は例ではない)
function process() {
initialize();
calc_price();
save_data()
}
定義済みのストリーム演算子は覚えればいいから、中を見ないでわかる。
俺俺オペレータで中を見ないとロジックを追えないようなものは
上に書いてあるのと同じ問題がある。
関数がダメなんじゃなくて使い方の問題。
オペレータもそれ自体がダメなんじゃなくて、使い方の問題。
中を見ないとロジック追えないような関数(オペレータも)はダメな関数。
話はこれと何も変わっとらん。反論にはなっていない。むしろ俺と同じことを言ってるだけ。
103デフォルトの名無しさん
2014/03/28(金) 00:37:59.39ID:MtUKbk72 例えばさ、AppleとかMicroSoftのAPIは実装非公開だし、実装知らなくても使ってますよみんな。
つか、中身はブラックボックスでいいって表現に語弊があるのかな。
全体の構造を見てるときは個々の中身は気にしなくてもいい、
個々の中身を検討してるときは他のオブジェクトは気にしなくてもいいって意味だよ。
スコープを小さくすればわかりやすいよねってこと。
つか、中身はブラックボックスでいいって表現に語弊があるのかな。
全体の構造を見てるときは個々の中身は気にしなくてもいい、
個々の中身を検討してるときは他のオブジェクトは気にしなくてもいいって意味だよ。
スコープを小さくすればわかりやすいよねってこと。
104デフォルトの名無しさん
2014/03/28(金) 00:40:38.80ID:Ek64RinZ そういうこと。全体の構造を見ている時に
個々の中身を気にしなくちゃいけないコードを書いているから
>>67 みたいに
> 関数呼び出しが発生することになってしまいます。それが必然性が
> ないものだったら、ロジックを追いづらいし
関数呼び出しでロジックが追いづらくなっちゃうわけ。
それは関数の作り方が悪いせいであって関数のせいじゃないんだよ。
個々の中身を気にしなくちゃいけないコードを書いているから
>>67 みたいに
> 関数呼び出しが発生することになってしまいます。それが必然性が
> ないものだったら、ロジックを追いづらいし
関数呼び出しでロジックが追いづらくなっちゃうわけ。
それは関数の作り方が悪いせいであって関数のせいじゃないんだよ。
105デフォルトの名無しさん
2014/03/28(金) 00:53:28.66ID:jDIkKEXq 本来シフト演算子なはずの << やら >> を入出力に使うっていうのが、
演算子オーバーロードの悪い使い方(=俺流オペレータ)の代表格だっていう話では。
演算子オーバーロードの悪い使い方(=俺流オペレータ)の代表格だっていう話では。
106デフォルトの名無しさん
2014/03/28(金) 01:15:21.16ID:DmpYV1MJ (構造化プログラミングのスレかな?)
107デフォルトの名無しさん
2014/03/28(金) 01:52:09.43ID:wFHfzfhB (ここまでオブジェクト指向の活用方法の具体例なし)
108デフォルトの名無しさん
2014/03/28(金) 01:54:17.33ID:Ek64RinZ >>105
話ずれてるなぁ。
良い関数と悪い関数の違いの話だよ?
自分で勝手に作った関数でその中を見ないと
呼び出し元が何やってるかわからないのがダメって話。
ストリーム演算子は普通に記憶してるじゃんか。
中見ないでしょ?
話ずれてるなぁ。
良い関数と悪い関数の違いの話だよ?
自分で勝手に作った関数でその中を見ないと
呼び出し元が何やってるかわからないのがダメって話。
ストリーム演算子は普通に記憶してるじゃんか。
中見ないでしょ?
109デフォルトの名無しさん
2014/03/28(金) 02:34:08.23ID:uMoDJ17A 具体例ならエロい人のソースを覗き見…
ぐへへ
ぐへへ
110デフォルトの名無しさん
2014/03/28(金) 11:21:32.67ID:Vf+Kze9a >>102
> function process() {
> initialize();
> calc_price();
> save_data()
> }
その三つの関数は、再利用もしないし、他からも呼ばれないんじゃないの?
だったら、中身を見る必要ないよね。
中身を見る必要があるとしたら、バグフィックスか仕様変更のときかでしょ。
> function process() {
> initialize();
> calc_price();
> save_data()
> }
その三つの関数は、再利用もしないし、他からも呼ばれないんじゃないの?
だったら、中身を見る必要ないよね。
中身を見る必要があるとしたら、バグフィックスか仕様変更のときかでしょ。
111デフォルトの名無しさん
2014/03/28(金) 18:36:40.74ID:Ek64RinZ > 中身を見る必要があるとしたら、バグフィックスか仕様変更のときかでしょ。
ほら中見てるじゃんw
ほら中見てるじゃんw
112デフォルトの名無しさん
2014/03/28(金) 18:44:51.50ID:VVPQgbpw 中身を見なくていい = 機能もバグ取りもドキュメントも完成してるってことだから
今自分または開発チームが手がけてる関数は全て悪い関数ということになる。
今自分または開発チームが手がけてる関数は全て悪い関数ということになる。
113デフォルトの名無しさん
2014/03/28(金) 18:50:33.65ID:QLpZv79z114デフォルトの名無しさん
2014/03/28(金) 18:58:13.19ID:Vf+Kze9a >>111
> ほら中見てるじゃんw
見ないとロジック追えないだろ。
どんな関数でもメソッドでも同じ。
バグフィックスか仕様変更が必要なら、どんな場合でもそのコードを見る必要がある。
このことと、その関数の良し悪しは関係無い。
> ほら中見てるじゃんw
見ないとロジック追えないだろ。
どんな関数でもメソッドでも同じ。
バグフィックスか仕様変更が必要なら、どんな場合でもそのコードを見る必要がある。
このことと、その関数の良し悪しは関係無い。
115デフォルトの名無しさん
2014/03/28(金) 19:03:06.04ID:QLpZv79z >>114
> > ほら中見てるじゃんw
> 見ないとロジック追えないだろ。
君は少し勘違いしてるね。
上位関数のロジックを追う時に
下位関数のロジックを追わないとわからないって話だよ。
> function process() {
> initialize();
> calc_price();
> save_data()
> }
上位関数 = processのロジックを追う時に
下位関数 = initializeやcalc_priceやsave_data の
ロジックを追わないと上位関数が何をしているのかわからない。
function process(name) {
printf("hello " + name);
}
でもこの場合は上位関数(process)のロジックを追っている時に
下位関数(printf)のロジックは追わない。
> > ほら中見てるじゃんw
> 見ないとロジック追えないだろ。
君は少し勘違いしてるね。
上位関数のロジックを追う時に
下位関数のロジックを追わないとわからないって話だよ。
> function process() {
> initialize();
> calc_price();
> save_data()
> }
上位関数 = processのロジックを追う時に
下位関数 = initializeやcalc_priceやsave_data の
ロジックを追わないと上位関数が何をしているのかわからない。
function process(name) {
printf("hello " + name);
}
でもこの場合は上位関数(process)のロジックを追っている時に
下位関数(printf)のロジックは追わない。
116デフォルトの名無しさん
2014/03/28(金) 19:05:59.21ID:QLpZv79z 上位関数のロジックを追う時に
下位関数のロジックを追わないとわからないような
コードになってるから、
コードを解析するときに、関数があるたびに
下位関数の実装先にあっちこっちジャンプしていって大変なことになる。
下位関数のロジックを追わないとわからないような
コードになってるから、
コードを解析するときに、関数があるたびに
下位関数の実装先にあっちこっちジャンプしていって大変なことになる。
117デフォルトの名無しさん
2014/03/28(金) 19:20:17.16ID:QLpZv79z ここから発展して、
privateメソッドが、privateメソッドを読んでいて
そのprivateメソッドが、更にprivateメソッドを読んでいて
更にそのprivateメソッドが、privateメソッドを・・・みたいに
(再帰ではなく)文法上のコールスタックが深いものも
ダメな関数の一例だろうね。
なぜなら、privateメソッドは通常汎用的ではない。
汎用的なものに比べたら使われる回数が少ない。
こんなものは覚えられないし、覚える必要もない。
だから上位関数のロジックを追ってる時に
下位関数のロジックを追うことになる。
privateメソッドが、privateメソッドを読んでいて
そのprivateメソッドが、更にprivateメソッドを読んでいて
更にそのprivateメソッドが、privateメソッドを・・・みたいに
(再帰ではなく)文法上のコールスタックが深いものも
ダメな関数の一例だろうね。
なぜなら、privateメソッドは通常汎用的ではない。
汎用的なものに比べたら使われる回数が少ない。
こんなものは覚えられないし、覚える必要もない。
だから上位関数のロジックを追ってる時に
下位関数のロジックを追うことになる。
118デフォルトの名無しさん
2014/03/28(金) 20:50:21.98ID:VVPQgbpw119デフォルトの名無しさん
2014/03/29(土) 01:06:59.37ID:YRxS2933 オブジェクト指向は1990年代の話題
当時は実装メモリも少なかったので、コンパイルサイズの上限に達しないように
コンパイル単位となるファイルや関数を小さくしなければならなかった。また
CPUの性能も低かったので、コンパイル単位を小さくすることで再makeにかかる
時間を節約していた。そうでなければとてもじゃないが、実務では使えなかった。
現代では分かりやすさを犠牲にしてまで、小さい関数を量産する必要はなくなっ
ている。
以上、教科書に載らないオブジェクト指向の歴史
当時は実装メモリも少なかったので、コンパイルサイズの上限に達しないように
コンパイル単位となるファイルや関数を小さくしなければならなかった。また
CPUの性能も低かったので、コンパイル単位を小さくすることで再makeにかかる
時間を節約していた。そうでなければとてもじゃないが、実務では使えなかった。
現代では分かりやすさを犠牲にしてまで、小さい関数を量産する必要はなくなっ
ている。
以上、教科書に載らないオブジェクト指向の歴史
120デフォルトの名無しさん
2014/03/29(土) 01:21:57.46ID:3OHlSsnI121デフォルトの名無しさん
2014/03/29(土) 01:27:50.25ID:3OHlSsnI >>57
鳥肌立った
鳥肌立った
122デフォルトの名無しさん
2014/03/29(土) 01:30:44.27ID:3OHlSsnI >>67
ずっと読んでて思ったけど、もしかしてこの人がstaticおじさん?
ずっと読んでて思ったけど、もしかしてこの人がstaticおじさん?
123デフォルトの名無しさん
2014/03/29(土) 01:39:31.14ID:3OHlSsnI ようやくスレ全部読んだが、ポリモーフィズムとか委譲とかDIとかやってて、そういう話をしてるもんだと思って覗いたから
なんか逆に新鮮な気持ちになったぜ
俺が恵まれてるだけなんだろうが、50行を超える関数には出会ったことがない
自分でも書いたことがない
なんか逆に新鮮な気持ちになったぜ
俺が恵まれてるだけなんだろうが、50行を超える関数には出会ったことがない
自分でも書いたことがない
124デフォルトの名無しさん
2014/03/29(土) 01:45:14.49ID:2x5p0G/E 50行を超える関数ぐらい出会うだろ?
オープンソースのコード読んだことある?
オープンソースのコード読んだことある?
125デフォルトの名無しさん
2014/03/29(土) 08:53:28.56ID:VG1PVttb オブジェクト指向で作られたライブラリを手続きの中で利用するのがベスト。
自身の構造をオブジェクトのネットワークで表現するのは問題を複雑にするだけ。
オブジェクト指向は基盤レイヤーで収まっていればいい。
より上のレイヤーは構造化プログラミングとモジュール化で対応すべきだ。
自身の構造をオブジェクトのネットワークで表現するのは問題を複雑にするだけ。
オブジェクト指向は基盤レイヤーで収まっていればいい。
より上のレイヤーは構造化プログラミングとモジュール化で対応すべきだ。
126デフォルトの名無しさん
2014/03/29(土) 10:41:15.74ID:FZRsbrVI127デフォルトの名無しさん
2014/03/29(土) 13:47:53.85ID:qOhcuGD/ 言いたい事はわかる。きれいに階層化されたツリー構造の方が処理を追いやすい。
しかし、どうしてもオブジェクトグラフがネットワーク状になる場合があるし、
ユーザーがオブジェクトどうしを自由に接続できるアプリだってある。
しかし、どうしてもオブジェクトグラフがネットワーク状になる場合があるし、
ユーザーがオブジェクトどうしを自由に接続できるアプリだってある。
128デフォルトの名無しさん
2014/03/29(土) 14:12:25.86ID:riFdWRlf プログラマ適性なしは言い過ぎ
最近は非オブジェクト指向の言語も注目されてきてるよね
最近は非オブジェクト指向の言語も注目されてきてるよね
129デフォルトの名無しさん
2014/03/29(土) 15:10:59.76ID:T0jzXlJE 関数型の次はなんだ?
130デフォルトの名無しさん
2014/03/29(土) 17:53:31.03ID:nUN7khDD OOだろうが非OOだろうが、
粒度の小さなデータ構造でネットワークを形成することを
「複雑にする」と思う時点でプログラミングに向いていない。
粒度の小さなデータ構造でネットワークを形成することを
「複雑にする」と思う時点でプログラミングに向いていない。
131デフォルトの名無しさん
2014/03/29(土) 18:15:38.16ID:VG1PVttb メインルーチンでまとめて管理すればいいものを、
処理とデータをセットにすることに拘った挙句、
メディエータパターンなんてマヌケな再発明を強いられるOOPに哀愁を禁じえない。
処理とデータをセットにすることに拘った挙句、
メディエータパターンなんてマヌケな再発明を強いられるOOPに哀愁を禁じえない。
132デフォルトの名無しさん
2014/03/29(土) 18:26:03.80ID:qOhcuGD/ 巨大なメインルーチンねえ。描画とかどうすんのかな。
133デフォルトの名無しさん
2014/03/29(土) 18:36:10.02ID:VG1PVttb 描画はイベントドリブンか、メインループの中で描画オブジェクトの配列を作るわ。
134デフォルトの名無しさん
2014/03/29(土) 19:00:43.30ID:nUN7khDD >>131
あんたも適性ないね
あんたも適性ないね
135デフォルトの名無しさん
2014/03/29(土) 19:40:22.20ID:VG1PVttb しかたない。SEにでも転職するか。
136デフォルトの名無しさん
2014/03/29(土) 20:02:51.62ID:riFdWRlf 適性とかそういう話じゃないなコレ、教育不足に経験不足だ
137デフォルトの名無しさん
2014/03/30(日) 02:19:44.18ID:3Fl9YNZ5 数珠つなぎのメソッドチェーンを呼び出して何をするのかと思ったら、単に変数
に値を代入(または取得)して終わり、みたいのをよく見かけます。途中に現れる
メソッド名を見ても必然性を感じません。その階層で何をするでもないのです。
そういう場合はただの変数の代入に書き換えます。
(ついでなので)変数の名前はその目的が分かる名前に直します。
まるでオブジェクト指向の本質は多重のメソッド呼び出しだ、と言わんばかりな
のです。自分はそんなことより、単なる変数・関数であったとしても命名を重視
したいです。
規模の大きいソフトウェアの場合、名前をグルーピングして、階層を持たせて命
名することに異論はありません。でもそもそもそんなに大きいソフトウェアを
作っているわけではないんです。
世界にひとつだけの名前にして衝突を未然に防ぎたい、ということでしょうか?
に値を代入(または取得)して終わり、みたいのをよく見かけます。途中に現れる
メソッド名を見ても必然性を感じません。その階層で何をするでもないのです。
そういう場合はただの変数の代入に書き換えます。
(ついでなので)変数の名前はその目的が分かる名前に直します。
まるでオブジェクト指向の本質は多重のメソッド呼び出しだ、と言わんばかりな
のです。自分はそんなことより、単なる変数・関数であったとしても命名を重視
したいです。
規模の大きいソフトウェアの場合、名前をグルーピングして、階層を持たせて命
名することに異論はありません。でもそもそもそんなに大きいソフトウェアを
作っているわけではないんです。
世界にひとつだけの名前にして衝突を未然に防ぎたい、ということでしょうか?
138デフォルトの名無しさん
2014/03/30(日) 02:26:07.76ID:3Fl9YNZ5 同じことがメソッド呼び出しにも言えます。チェーンしているメソッドがそれぞ
れ何を意味しているのか分かりづらい上、記述の順序と実行の順序が異なるので
す。
例えば文章において、姓名は「姓」と「名」を近くに記述することで「姓名」と
なって、ひとりの人を表わすことができます。日付の「年」「月」「日」も電話
番号の「市外局番」「市内局番」「加入者番号」も同様です。これらをばらばら
に離して記述すると読み解くのに苦労することでしょう。
記述の順序が実行の順序と一致しないというのは、そういう状況に似ています。
ソースプログラムがまるでなぞなぞのようになってしまうのです。
実行順序が隣り合っているものは隣り合わせて記述すると分かりやすいプログラ
ムになります。修正も簡単です。テキストエディタやgrepが強力なプログラミン
グツールになります。
れ何を意味しているのか分かりづらい上、記述の順序と実行の順序が異なるので
す。
例えば文章において、姓名は「姓」と「名」を近くに記述することで「姓名」と
なって、ひとりの人を表わすことができます。日付の「年」「月」「日」も電話
番号の「市外局番」「市内局番」「加入者番号」も同様です。これらをばらばら
に離して記述すると読み解くのに苦労することでしょう。
記述の順序が実行の順序と一致しないというのは、そういう状況に似ています。
ソースプログラムがまるでなぞなぞのようになってしまうのです。
実行順序が隣り合っているものは隣り合わせて記述すると分かりやすいプログラ
ムになります。修正も簡単です。テキストエディタやgrepが強力なプログラミン
グツールになります。
139デフォルトの名無しさん
2014/03/30(日) 02:40:59.19ID:xYPcFXGk140デフォルトの名無しさん
2014/03/30(日) 02:59:11.38ID:WoVbd8CL >>137-138
あなた、オブジェクト指向の話をしてないですよ。
あなた、オブジェクト指向の話をしてないですよ。
141デフォルトの名無しさん
2014/03/30(日) 03:06:19.07ID:f3QUPmmN メソッドチェーンが何かを知らない人に説明しておくと、
value を foo関数で加工して、bar関数で加工して、baz関数で加工するという、
シェルスクリプトで言えば
cat var | foo | bar | baz というのを
baz(bar(foo(value))) という逆順で書くのではなく、
value.foo().bar().baz() という風に
処理の順番の通りにかけるようにした方法です。
ただそれだけのことです。
どちらがわかりやすいかは言うまでもありませんね。
value を foo関数で加工して、bar関数で加工して、baz関数で加工するという、
シェルスクリプトで言えば
cat var | foo | bar | baz というのを
baz(bar(foo(value))) という逆順で書くのではなく、
value.foo().bar().baz() という風に
処理の順番の通りにかけるようにした方法です。
ただそれだけのことです。
どちらがわかりやすいかは言うまでもありませんね。
142デフォルトの名無しさん
2014/03/30(日) 03:10:55.68ID:DA7dDHvX メソッドチェーンだと書いている順番に
処理が実行されるからわかりやすいんだよな。
オブジェクト指向だと、メソッド名短くても
かぶらないからその点でもメリットがある。
処理が実行されるからわかりやすいんだよな。
オブジェクト指向だと、メソッド名短くても
かぶらないからその点でもメリットがある。
143デフォルトの名無しさん
2014/03/30(日) 03:11:55.59ID:F8tYL6fO なあんだ!どっちの目を使うかなんだね!
144デフォルトの名無しさん
2014/03/30(日) 03:28:36.95ID:DA7dDHvX > baz(bar(foo(value))) という逆順で書くのではなく、
これって引数無いからまだわかりやすいけど、
引数あると見にくいんだよね。
baz(bar(foo(value, 1, 2), true), "test");
呼び出しが深くなるにつれて、bazと"test"みたいに距離がどんどん離れちゃう。
これがメソッドチェーンだと
value.foo(1,2).bar(true).baz("test");
このように関数と引数が近くに集まる。
これって引数無いからまだわかりやすいけど、
引数あると見にくいんだよね。
baz(bar(foo(value, 1, 2), true), "test");
呼び出しが深くなるにつれて、bazと"test"みたいに距離がどんどん離れちゃう。
これがメソッドチェーンだと
value.foo(1,2).bar(true).baz("test");
このように関数と引数が近くに集まる。
145デフォルトの名無しさん
2014/03/30(日) 03:30:32.83ID:DA7dDHvX これもオブジェクト指向の活用方法の一つだろうね。
146デフォルトの名無しさん
2014/03/30(日) 03:34:47.32ID:eSXxjJTc だらだら連ねて1文に詰め込むのはデバッガで追いにくくなるからあまり好きじゃない。
147デフォルトの名無しさん
2014/03/30(日) 11:13:41.29ID:CUSBQvN9148デフォルトの名無しさん
2014/03/30(日) 11:13:50.33ID:Ep1/Keko 返り値をチェックして独自のエラーログを出したいw
149デフォルトの名無しさん
2014/03/30(日) 11:14:24.92ID:CUSBQvN9 >>146
どんなオンボロデバッガ使ってんだ?
どんなオンボロデバッガ使ってんだ?
150デフォルトの名無しさん
2014/03/30(日) 11:52:19.72ID:DA7dDHvX >>146
つまり、
baz(bar(foo(value, 1, 2), true), "test");
こういうのを
v = foo(value, 1, 2);
v = bar(v, true);
v = baz(v, "test");
って書くってこと?
おっと、メソッドチェーンとは関係ない話だったから
関数の方でレスしちゃったw
つまり、
baz(bar(foo(value, 1, 2), true), "test");
こういうのを
v = foo(value, 1, 2);
v = bar(v, true);
v = baz(v, "test");
って書くってこと?
おっと、メソッドチェーンとは関係ない話だったから
関数の方でレスしちゃったw
151デフォルトの名無しさん
2014/03/30(日) 11:57:24.64ID:IecYjjCX152デフォルトの名無しさん
2014/03/30(日) 12:01:26.08ID:DA7dDHvX 訂正(笑)
> baz(bar(foo(value, 1, 2), true), "test");
bar( ) の挙動確認したいから、この行の bar( ) の呼び出しでブレーク掛けられるデバッガ教えてくれ
> baz(bar(foo(value, 1, 2), true), "test");
bar( ) の挙動確認したいから、この行の bar( ) の呼び出しでブレーク掛けられるデバッガ教えてくれ
153デフォルトの名無しさん
2014/03/30(日) 12:07:13.82ID:DA7dDHvX メソッドチェーンならこれが使える。
メソッドチェーンの p デバッグ? それ tap でできるよAdd Starasakichy
http://d.hatena.ne.jp/mas-higa/20100805/1281018189
function p(obj) { print obj }
value.foo(1,2).bar(true).tap(p).("test");
まあ関数でも使えるよ。見難くなるけどねw
baz(p(bar(foo(value, 1, 2), true)), "test");
メソッドチェーンの p デバッグ? それ tap でできるよAdd Starasakichy
http://d.hatena.ne.jp/mas-higa/20100805/1281018189
function p(obj) { print obj }
value.foo(1,2).bar(true).tap(p).("test");
まあ関数でも使えるよ。見難くなるけどねw
baz(p(bar(foo(value, 1, 2), true)), "test");
154デフォルトの名無しさん
2014/03/30(日) 12:32:55.33ID:rCEPh8in 難しいことをしようとすれば、何を使っても複雑になる。
言語やパラダイムが複雑なんじゃなくて、解決しようとしている問題が複雑なだけなんだ。
言語やパラダイムが複雑なんじゃなくて、解決しようとしている問題が複雑なだけなんだ。
155デフォルトの名無しさん
2014/03/30(日) 12:47:55.23ID:DA7dDHvX えと、ああ、うん、
言語の違いっていうのは、問題がどうとかじゃなくて
読みやすさと書きやすさの違いの話なんだけどね。
言語の違いっていうのは、問題がどうとかじゃなくて
読みやすさと書きやすさの違いの話なんだけどね。
156デフォルトの名無しさん
2014/03/30(日) 13:17:38.07ID:CUSBQvN9 >>151
え?そんな簡単なこともできない開発環境でオブジェクト指向とか大笑いだな
え?そんな簡単なこともできない開発環境でオブジェクト指向とか大笑いだな
157デフォルトの名無しさん
2014/03/30(日) 13:27:57.55ID:3Fl9YNZ5 >>141
>シェルスクリプトで言えば
>cat var | foo | bar | baz というのを
このとき、foo や bar が何もしないプログラムであっても baz の前に入れることに
意味はありますか?関数型で組む場合は、何もしない関数 foo(), bar() を挟み込む
発想になったことがありません。必要になったとき、何かをしたくなったとき、その
ときに追加しています。
>シェルスクリプトで言えば
>cat var | foo | bar | baz というのを
このとき、foo や bar が何もしないプログラムであっても baz の前に入れることに
意味はありますか?関数型で組む場合は、何もしない関数 foo(), bar() を挟み込む
発想になったことがありません。必要になったとき、何かをしたくなったとき、その
ときに追加しています。
158デフォルトの名無しさん
2014/03/30(日) 13:31:27.59ID:amVAfrHC >>102
思うことは二つある。
1) 結局中身って見なくてもよくね?
どんな糞名前、糞用途でもAPIとして資料があって
int aaaaaaaaabbbbbbbbbbb(int x, int y)
x + yが素数のとき0を返し、それ以外のときyを返します。
となっていれば、中身は見なくてよくね?
実装なんてどーでもいいし想像したくもない。
2) 用途と名前が優れていればなおよし
シンプルな名前で表現されていれば、
APIリファレンスを紐解くことすら不要。
bool isprime(int x)ならこれだけで十分。
思うことは二つある。
1) 結局中身って見なくてもよくね?
どんな糞名前、糞用途でもAPIとして資料があって
int aaaaaaaaabbbbbbbbbbb(int x, int y)
x + yが素数のとき0を返し、それ以外のときyを返します。
となっていれば、中身は見なくてよくね?
実装なんてどーでもいいし想像したくもない。
2) 用途と名前が優れていればなおよし
シンプルな名前で表現されていれば、
APIリファレンスを紐解くことすら不要。
bool isprime(int x)ならこれだけで十分。
159デフォルトの名無しさん
2014/03/30(日) 13:35:22.35ID:qbWQb+53 継承とインターフェイスだけで十分便利
160デフォルトの名無しさん
2014/03/30(日) 14:01:44.17ID:qe+yThv9 >>157
たぶんお前の説明が下手くそだと思うんだが、いかなる場合も何もすることがない関数なんて言語問わず存在意義あるわけないじゃん
メソッドチェーン関係なく単に修正ミスとかだろ
もしくは、お前が知らないだけで何かの意味があるんだよ
よくみるなら具体例出してみろ
たぶんお前の説明が下手くそだと思うんだが、いかなる場合も何もすることがない関数なんて言語問わず存在意義あるわけないじゃん
メソッドチェーン関係なく単に修正ミスとかだろ
もしくは、お前が知らないだけで何かの意味があるんだよ
よくみるなら具体例出してみろ
161デフォルトの名無しさん
2014/03/30(日) 14:29:06.62ID:rCEPh8in With...End With ステートメント (Visual Basic)
http://msdn.microsoft.com/ja-jp/library/wc500chb.aspx
メソッドチェーンなんていらない。
言語側でwithステートメントを用意すれば済む話。
http://msdn.microsoft.com/ja-jp/library/wc500chb.aspx
メソッドチェーンなんていらない。
言語側でwithステートメントを用意すれば済む話。
162デフォルトの名無しさん
2014/03/30(日) 14:30:58.29ID:DA7dDHvX それでどうやって一行で書くの?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 [蚤の市★]
- 【地震】青森県で震度6強 長周期地震動も 津波注意報すべて解除 ★7 [ぐれ★] [ぐれ★]
- トランプ大統領 エヌビディア製AI半導体の中国輸出許可 安全保障重視の方針転換 [蚤の市★]
- 【広島】「万引きした人を追跡」コンビニ店員の男性(46)を果物ナイフで刺したか 中国籍の少年(17)を殺人未遂容疑で現行犯逮捕 [ぐれ★]
- 【サッカー】58歳カズ「オファーが来ている」 J3福島と近日中にも交渉 早ければ年内にも決断 [征夷大将軍★]
- 気象庁・高市内閣「この後311級の地震の可能性があります。北海道〜関東の人は1週間は地震が来てもすぐ逃げられる格好をしてください」 [597533159]
- 【動画】ファッションモデルまんこ、裸でランウェイを歩く。これがファッションだと言われて [749674962]
- 【悲報】高市早苗の擬人化がXで大バズりwwwwwwwwwwww [455031798]
- バリ島で万引きした高校生が叩かれているけどさ
- 早大名誉教授「高市内閣の高支持率はデータ操作か、支持している日本人がアホなのか」👈核心を突いてしまう [868050967]
- こんぺこ!こんぺこ!こんぺこ!🐰🏡
