コーディングスタイルにこだわるスレ
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2007/10/28(日) 15:59:01 コーディングスタイルについて熱く語れ
382デフォルトの名無しさん
2009/12/05(土) 02:18:36 >>381 ガッ
383デフォルトの名無しさん
2009/12/05(土) 09:47:04 対応する中括弧のインデントの階層を同じにしろといつも思ってる
なんでみんな階層変えて書くの?死ぬの?
なんでみんな階層変えて書くの?死ぬの?
384デフォルトの名無しさん
2009/12/05(土) 11:38:34385デフォルトの名無しさん
2009/12/05(土) 18:53:46 一つのクラス内やファイル内に記述する関数やメソッドの順番ってどうしてる?
たとえばCで f1()からf2()とf3()が呼ばれて、f3()からf4()が呼ばれる場合、自分は
void f2() { ... }
void f4() { ... }
void f3() { f4(); ... }
void f1() { f2(); ... f3(); ... }
のように、呼び出される関数を上の方に書いてるんだけど、
呼び出される関数を下の方に書くスタイルもあるよね。
こういう理由でこういうスタイルにしているというのがあれば教えて。
たとえばCで f1()からf2()とf3()が呼ばれて、f3()からf4()が呼ばれる場合、自分は
void f2() { ... }
void f4() { ... }
void f3() { f4(); ... }
void f1() { f2(); ... f3(); ... }
のように、呼び出される関数を上の方に書いてるんだけど、
呼び出される関数を下の方に書くスタイルもあるよね。
こういう理由でこういうスタイルにしているというのがあれば教えて。
386デフォルトの名無しさん
2009/12/05(土) 19:12:42 トップダウンで実装してる時はトップダウンで。
ボトムアップで実装してる時はボトムアップで。
# コーディング規則があるときや、既存のプロジェクトでは他に合わせて。
ボトムアップで実装してる時はボトムアップで。
# コーディング規則があるときや、既存のプロジェクトでは他に合わせて。
387デフォルトの名無しさん
2009/12/05(土) 20:35:30388デフォルトの名無しさん
2009/12/06(日) 00:23:38 >>385
プロトタイプ宣言はつけてるのでどんな順番でもいいのだが、
追加・変更した関数を上に持ってくる。 だいたい
いじる関数は決まってるからな。
自然と、下に行くほど枯れた関数ということになる。
機能単位でまとめられるようであれば別ファイルに
くくり出すときに雑魚は下の方でソートしてる。
起動時間などの最適化をかけるために順序を
変えることもある。 起動時に使うものをなるべく
一箇所に集めて上に持ってくるとか。
プロトタイプ宣言はつけてるのでどんな順番でもいいのだが、
追加・変更した関数を上に持ってくる。 だいたい
いじる関数は決まってるからな。
自然と、下に行くほど枯れた関数ということになる。
機能単位でまとめられるようであれば別ファイルに
くくり出すときに雑魚は下の方でソートしてる。
起動時間などの最適化をかけるために順序を
変えることもある。 起動時に使うものをなるべく
一箇所に集めて上に持ってくるとか。
389デフォルトの名無しさん
2009/12/06(日) 00:49:16 宣言を繰り返すのが面倒だから、呼ばれる側が上。
自然とファイルローカルな関数が上に来て、外部関数は下に来る。
ヘッダで宣言してる外部関数は、ヘッダでの宣言順にあわせる。
自然とファイルローカルな関数が上に来て、外部関数は下に来る。
ヘッダで宣言してる外部関数は、ヘッダでの宣言順にあわせる。
390デフォルトの名無しさん
2009/12/06(日) 11:46:02 他人のソースをいくつか読んでみて、
見やすいのと見難いので比較してみれば?
わしは前フリ長いの嫌いなんで、上位の関数を
上に書いて欲しい。 わからないところだけ下を見る。
つか、クラスで最初に private もって来る奴とかいないだろ?
それと同じことじゃね?
見やすいのと見難いので比較してみれば?
わしは前フリ長いの嫌いなんで、上位の関数を
上に書いて欲しい。 わからないところだけ下を見る。
つか、クラスで最初に private もって来る奴とかいないだろ?
それと同じことじゃね?
391デフォルトの名無しさん
2009/12/06(日) 12:08:47 >>390
ふつーにいるだろ? privateを最初に書くの。
ふつーにいるだろ? privateを最初に書くの。
392デフォルトの名無しさん
2009/12/06(日) 12:09:15 if(hoge)
if (hoge)
if( hoge )
どう書く?
カッコが入れ子になった場合に一番見やすいのは最後だと思うが野暮ったい
if (hoge)
if( hoge )
どう書く?
カッコが入れ子になった場合に一番見やすいのは最後だと思うが野暮ったい
393デフォルトの名無しさん
2009/12/06(日) 12:13:30 if (hoge)
関数やマクロの場合は hoge(...) と、カッコの前を空けない。
if (...), for (...), while (...) などは空ける。
関数やマクロの場合は hoge(...) と、カッコの前を空けない。
if (...), for (...), while (...) などは空ける。
394デフォルトの名無しさん
2009/12/06(日) 12:29:09 >>392
2番目がふつー。
2番目がふつー。
395デフォルトの名無しさん
2009/12/06(日) 13:13:26 if ( hoge )
だな。
for, while も同様。
だな。
for, while も同様。
396デフォルトの名無しさん
2009/12/06(日) 13:17:05 カッコの内側に空白を入れるのは、マイクロソフトのサンプルとかが
そのスタイルだよね。
そのスタイルだよね。
397デフォルトの名無しさん
2009/12/06(日) 13:20:39 MSはC++では1番目,C#は2番目
398デフォルトの名無しさん
2009/12/06(日) 13:21:20訂正C++は3番目
399デフォルトの名無しさん
2009/12/06(日) 13:24:19 今MSDNのサンプルで確認したら統一されてないな。
あったりなかったり。
カッコの内側のスペース。
あったりなかったり。
カッコの内側のスペース。
400デフォルトの名無しさん
2009/12/06(日) 13:28:46 VS2008のオートフォーマットは、デフォルトでは、C#はカッコの
内側にスペース入れない設定。
C++は、設定項目がなかった。
内側にスペース入れない設定。
C++は、設定項目がなかった。
401デフォルトの名無しさん
2009/12/07(月) 17:33:08 一番大切な事は、それを書いて自分が何を感じるかだ
402デフォルトの名無しさん
2009/12/07(月) 19:33:21 >>401
もちろんコスモを感じる
もちろんコスモを感じる
403デフォルトの名無しさん
2009/12/08(火) 00:30:35 ブランクを感じる。
ごめん、書いてみたかっただけw
ごめん、書いてみたかっただけw
404385
2009/12/08(火) 12:23:16 なるほど、色々参考になった。
自分の場合、ソースの流れを追うときに、呼び出される関数が上にあるか下にあるかが
あらかじめ分かってた方がスムーズに追えるかなと思うんだが、順番を気にしない人が
けっこう多いんだね。
自分の場合、ソースの流れを追うときに、呼び出される関数が上にあるか下にあるかが
あらかじめ分かってた方がスムーズに追えるかなと思うんだが、順番を気にしない人が
けっこう多いんだね。
405デフォルトの名無しさん
2009/12/08(火) 13:46:29406デフォルトの名無しさん
2009/12/08(火) 13:52:38 >>405
関数の深さ制限って、何のため?深くて何が悪いの?
「そろそろ関数分けるか・・・あ、もう3段目だ。やめとこ。」とか言っちゃうの?
名前を汚すって、何のために?
private なりファイルローカルなり、もっとマシな仕組みが言語側にあるでしょ?
どっちも意味わかんない。
関数の深さ制限って、何のため?深くて何が悪いの?
「そろそろ関数分けるか・・・あ、もう3段目だ。やめとこ。」とか言っちゃうの?
名前を汚すって、何のために?
private なりファイルローカルなり、もっとマシな仕組みが言語側にあるでしょ?
どっちも意味わかんない。
407デフォルトの名無しさん
2009/12/08(火) 14:06:17 > 「そろそろ関数分けるか・・・あ、もう3段目だ。やめとこ。」とか言っちゃうの?
言わない。「そろそろ関数分け」たりしない。
適切に設けられた関数は既に簡潔に表現されてる。
結果、そんなに呼び出しが深くなったりはしない。
> 名前を汚すって、何のために?
すまない、完全にこれは蛇足。
privateでかつ、仮状態のメソッドを区別するためにそうしてるだけ。
汚い名前をつけとくと、落ち着かないでしょ?
キレイな名前がつくときは、整理されて明確な役割を担ったとき。
ま、この話題はどうでもいいな。
言わない。「そろそろ関数分け」たりしない。
適切に設けられた関数は既に簡潔に表現されてる。
結果、そんなに呼び出しが深くなったりはしない。
> 名前を汚すって、何のために?
すまない、完全にこれは蛇足。
privateでかつ、仮状態のメソッドを区別するためにそうしてるだけ。
汚い名前をつけとくと、落ち着かないでしょ?
キレイな名前がつくときは、整理されて明確な役割を担ったとき。
ま、この話題はどうでもいいな。
408デフォルトの名無しさん
2009/12/08(火) 14:31:20 f1(){ f2(); f3()}
f2(){ f3(); f4()}
f3(){ f4(); }
のようにスパゲティに依存してるのはちょっと気持ち悪いが、
単に深くなるのは気にしないな。
ていうか関数が2層しかない、って相当単純なものしか書いてないんじゃないの?
f2(){ f3(); f4()}
f3(){ f4(); }
のようにスパゲティに依存してるのはちょっと気持ち悪いが、
単に深くなるのは気にしないな。
ていうか関数が2層しかない、って相当単純なものしか書いてないんじゃないの?
409デフォルトの名無しさん
2009/12/08(火) 14:36:58410デフォルトの名無しさん
2009/12/08(火) 14:39:14 > 言わない。「そろそろ関数分け」たりしない。
> 適切に設けられた関数は既に簡潔に表現されてる。
事後の関数分けをしないでもいいって、どんな神プログラマだよw
> 適切に設けられた関数は既に簡潔に表現されてる。
事後の関数分けをしないでもいいって、どんな神プログラマだよw
411デフォルトの名無しさん
2009/12/08(火) 14:41:21 > ていうか関数が2層しかない、って相当単純なものしか書いてないんじゃないの?
しらんがなw
それと、二層どころか、ほとんどは一層だよ。
publicなメソッドから、同じクラスのほかのpublicメソッドを呼び出したりはしない。
メソッドのオーバーロードの場合は除いて、ね。
publicメソッドからたまーに、privateなメソッドを呼び出したりするだけ。
だから、publicなメソッド同士の記述の順番なんぞどうでもいい。
なぜなら、そこに呼び出しあうような関係は無いから。
privateメソッドがそれらの間にあると読みにくいと思うから、
上のほうか、下のほうにまとめておく。邪魔だから。
しらんがなw
それと、二層どころか、ほとんどは一層だよ。
publicなメソッドから、同じクラスのほかのpublicメソッドを呼び出したりはしない。
メソッドのオーバーロードの場合は除いて、ね。
publicメソッドからたまーに、privateなメソッドを呼び出したりするだけ。
だから、publicなメソッド同士の記述の順番なんぞどうでもいい。
なぜなら、そこに呼び出しあうような関係は無いから。
privateメソッドがそれらの間にあると読みにくいと思うから、
上のほうか、下のほうにまとめておく。邪魔だから。
412デフォルトの名無しさん
2009/12/08(火) 14:42:14 > 事後の関数分けをしないでもいいって、どんな神プログラマだよw
残念、俺は糞プログラマだよw
残念、俺は糞プログラマだよw
413デフォルトの名無しさん
2009/12/08(火) 14:42:55 底辺はリファクタリングを知らない。
414デフォルトの名無しさん
2009/12/08(火) 14:47:21415デフォルトの名無しさん
2009/12/08(火) 15:38:25 コーディング規約の大半は普通のプログラマのためではなく、
あなたの隣に座っているプログラマのような何かが生産し続ける、
見ただけで死ぬような目潰しコードを多少は見られるようにするという
崇高な試みのために存在する。
あなたの隣に座っているプログラマのような何かが生産し続ける、
見ただけで死ぬような目潰しコードを多少は見られるようにするという
崇高な試みのために存在する。
416デフォルトの名無しさん
2009/12/09(水) 00:16:00 むしろコーディングに主義主張を持つ俺らみたいのが二人以上いると
宗教戦争を起こすので「めんどくせえからこーしとけ」的なルールな気もw
宗教戦争を起こすので「めんどくせえからこーしとけ」的なルールな気もw
417385
2009/12/09(水) 02:05:52 >>411
なるほど。たしかにメソッドの記述の順番が気になる箇所は、
関数をどんどん深く呼び出してる箇所とほぼ一致してるなあ。
そういう箇所はコードが読みにくいというよりも、そもそも
クラス構造に問題がありそう。
そういった、クラスの構造や粒度などについて書かれてる
書籍でおすすめのものがあれば教えてくれるとうれしい。
なるほど。たしかにメソッドの記述の順番が気になる箇所は、
関数をどんどん深く呼び出してる箇所とほぼ一致してるなあ。
そういう箇所はコードが読みにくいというよりも、そもそも
クラス構造に問題がありそう。
そういった、クラスの構造や粒度などについて書かれてる
書籍でおすすめのものがあれば教えてくれるとうれしい。
418デフォルトの名無しさん
2009/12/09(水) 12:10:51 ソースを上から順に読むとか、飛び先を目で探すとかってことは
めったにないんで、べつに順番はどうでもいい。
気になるんだったら、アルファベット順にでも並べとけばいい。
めったにないんで、べつに順番はどうでもいい。
気になるんだったら、アルファベット順にでも並べとけばいい。
419411
2009/12/09(水) 13:29:14 >>417
まず大前提としてはKISS(Keep it simple, stupid)があって、
これはいつまでたっても我々にとって有効な指針になると思う…。
「Cプログラミング診断室 藤原 博文」
構造化のテクを磨くことも大事。楽しい読み物。
余計なことやヘンなことはしない、ということの大事さが分かる。
「リファクタリング マーチン ファウラー」
目新しさは無いかもしれないが、押さえておいていいかも。
「オブジェクト指向における再利用のためのデザインパターン GoF」
「オブジェクト指向入門 第2版 原則・コンセプト バートランド・メイヤー」
自力で独学でOOP能力を高めていくのも大事だけど、
OOPとは何ぞや、優れた設計とは何ぞや、を本から学びたければ。
個人的に、デザパタ本は手垢で黒くなってきてるほど読んでる。
> クラスの構造や粒度などについて書かれてる書籍
で、肝心のコレはちょっと思いつかないw
ただ、図書館行って片っ端から技術書立ち読みしたら、
それっぽい本にきっと出合えると思う。
アジャイルなんたらっていう赤い本も面白かった気が。
技術系MLアーカイブを追っかけたり
(ttp://java-house.jp/ml/topics/topics.html#style)
するのもいいかも。なんかいい本あったら教えてw
まず大前提としてはKISS(Keep it simple, stupid)があって、
これはいつまでたっても我々にとって有効な指針になると思う…。
「Cプログラミング診断室 藤原 博文」
構造化のテクを磨くことも大事。楽しい読み物。
余計なことやヘンなことはしない、ということの大事さが分かる。
「リファクタリング マーチン ファウラー」
目新しさは無いかもしれないが、押さえておいていいかも。
「オブジェクト指向における再利用のためのデザインパターン GoF」
「オブジェクト指向入門 第2版 原則・コンセプト バートランド・メイヤー」
自力で独学でOOP能力を高めていくのも大事だけど、
OOPとは何ぞや、優れた設計とは何ぞや、を本から学びたければ。
個人的に、デザパタ本は手垢で黒くなってきてるほど読んでる。
> クラスの構造や粒度などについて書かれてる書籍
で、肝心のコレはちょっと思いつかないw
ただ、図書館行って片っ端から技術書立ち読みしたら、
それっぽい本にきっと出合えると思う。
アジャイルなんたらっていう赤い本も面白かった気が。
技術系MLアーカイブを追っかけたり
(ttp://java-house.jp/ml/topics/topics.html#style)
するのもいいかも。なんかいい本あったら教えてw
420デフォルトの名無しさん
2009/12/09(水) 13:35:48 Cプログラミング診断室
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/index.html
これならお手軽に読める。内容はちょっと古いかもしれないし、
内容のすべてに同意できるとは限らないけど、
ある程度の距離を保って読めば、やっぱ今でも面白いかと。
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/index.html
これならお手軽に読める。内容はちょっと古いかもしれないし、
内容のすべてに同意できるとは限らないけど、
ある程度の距離を保って読めば、やっぱ今でも面白いかと。
421デフォルトの名無しさん
2009/12/10(木) 00:01:11 カーニハンの「プログラミング作法」ぐらい読んどけよ。
422デフォルトの名無しさん
2009/12/10(木) 00:09:02 診断室で一番共感したのは、糞グラマを無理に使うくらいなら切り捨てた方がマシ、
ってとこだな
ってとこだな
424デフォルトの名無しさん
2009/12/12(土) 02:46:17 関数を分割するべきか否かを、関数の行数や
if等のネストの深さで、機械的に判断するのは間違い。
…などと書いてみるテスト。
一連の処理の固まりを、「処理内容が大体想像できる一文」で
置換する(記述を要約する)のが正しい関数化の手法であって、
行数等を判断基準に関数化するというのは、
ぶつ切りしてるに過ぎないと思う。
でもってこの「〜する」の一文を見つけたり、まとめられるように
フローをアレンジする能力ってのが、プログラムのセンスって奴だと思う。
if等のネストの深さで、機械的に判断するのは間違い。
…などと書いてみるテスト。
一連の処理の固まりを、「処理内容が大体想像できる一文」で
置換する(記述を要約する)のが正しい関数化の手法であって、
行数等を判断基準に関数化するというのは、
ぶつ切りしてるに過ぎないと思う。
でもってこの「〜する」の一文を見つけたり、まとめられるように
フローをアレンジする能力ってのが、プログラムのセンスって奴だと思う。
425デフォルトの名無しさん
2009/12/13(日) 00:14:47 バカを統制するのには機械的な基準はある程度有効
426デフォルトの名無しさん
2009/12/13(日) 00:28:09 「こういうコーディングスタイル、ダサいよな」みたいな話題で、
わざわざ「俺はバカどもを使ってるから仕方なくやってんだよ」って
反論してくるやつって、実は本人がそのダサいスタイルなんじゃないかって
気がしてならない。
わざわざ「俺はバカどもを使ってるから仕方なくやってんだよ」って
反論してくるやつって、実は本人がそのダサいスタイルなんじゃないかって
気がしてならない。
427デフォルトの名無しさん
2009/12/13(日) 18:32:43 無能プロジェクトリーダの決める規準より言語設計者の決めるものの方がまし、
という意味で、言語がこと細かにスタイルを規定して欲しい。
という意味で、言語がこと細かにスタイルを規定して欲しい。
428デフォルトの名無しさん
2009/12/13(日) 19:15:24 Pythonのことか
429デフォルトの名無しさん
2009/12/13(日) 20:28:37 >425
関数名(+引数等) = 処理内容の要約となるよう設計(分割)すべき、
ってルールはさほど難しく無いと思うんだ。
…と思ったけど要約できん奴は、ダラダラ書くんだろうな…
ダラダラ書かせない為に機械的制限は有効だと思うけど、
えてして基本が忘れ去られてる、と思うんだ漏れは。
関数名(+引数等) = 処理内容の要約となるよう設計(分割)すべき、
ってルールはさほど難しく無いと思うんだ。
…と思ったけど要約できん奴は、ダラダラ書くんだろうな…
ダラダラ書かせない為に機械的制限は有効だと思うけど、
えてして基本が忘れ去られてる、と思うんだ漏れは。
430デフォルトの名無しさん
2009/12/14(月) 23:31:25 そして void add_A_and_B(void) みたいな
関数を書く奴が出てくるんだな。
関数を書く奴が出てくるんだな。
431デフォルトの名無しさん
2009/12/14(月) 23:36:42 そんなレベルならどんな規則で縛ろうと無意味
432デフォルトの名無しさん
2009/12/15(火) 02:07:21 >430
そーいうのを良しとするとは書いてなかろう。
そーいうのばかり抑制する事に気を取られて、
基本的な部分がおざなりになってるということ。
そーいうのを良しとするとは書いてなかろう。
そーいうのばかり抑制する事に気を取られて、
基本的な部分がおざなりになってるということ。
433デフォルトの名無しさん
2009/12/22(火) 15:01:18 enum { SpecialID1, SpecialID2 }; でそれぞれに値を
記憶する場所があってそれを設定する場合に
1) Set_SpecialID1or2(SpecialID1, int value)
2) Set_SpecialID1(int value), Set_SpecialID2(int value)
3) Set(SpecialID1, int value)
4) Set_Special(flag, val1, ...) //flag: 1のみ、2のみもしくは両方を指定可能
どれが好き?
わしは 3) でこっそり実装して 2) の
マクロを提供って感じなんだがオススメとかある?
記憶する場所があってそれを設定する場合に
1) Set_SpecialID1or2(SpecialID1, int value)
2) Set_SpecialID1(int value), Set_SpecialID2(int value)
3) Set(SpecialID1, int value)
4) Set_Special(flag, val1, ...) //flag: 1のみ、2のみもしくは両方を指定可能
どれが好き?
わしは 3) でこっそり実装して 2) の
マクロを提供って感じなんだがオススメとかある?
434デフォルトの名無しさん
2009/12/22(火) 18:47:11435デフォルトの名無しさん
2009/12/22(火) 23:01:42 だって、シンボル数が増えると
起動時間遅くなるから。。。
起動時間遅くなるから。。。
436デフォルトの名無しさん
2009/12/23(水) 01:22:14 >>433
口頭で動作を説明する場合の表現に近いコードを選ぶべし。
口頭で動作を説明する場合の表現に近いコードを選ぶべし。
437デフォルトの名無しさん
2009/12/23(水) 19:35:57 じゃ、SVOC だな。
438デフォルトの名無しさん
2009/12/24(木) 03:10:27 >433
漏れならこう書く。
bool SetHoge( int key, int value )
bool GetHoge( int key, int& value )
int GetHoge( int key, int error_value = 0 ) //手抜き版
エラーハンドリングが不要なケースではもっと端折るけど。
漏れならこう書く。
bool SetHoge( int key, int value )
bool GetHoge( int key, int& value )
int GetHoge( int key, int error_value = 0 ) //手抜き版
エラーハンドリングが不要なケースではもっと端折るけど。
439デフォルトの名無しさん
2009/12/24(木) 21:47:18 なんかこういうのってデザインパターンにないんだっけ?
440デフォルトの名無しさん
2009/12/24(木) 22:07:50 ない
441デフォルトの名無しさん
2010/01/27(水) 12:43:02 >>433
本当に、単純に値を出し入れするだけなら
3)かなあ。これSpecialIDの設定はintじゃないよね?
ところで、C#をやるようになってから
C++でこの手の値入出力系のメンバにGet,Setをつけなくなった。
こんな感じ。
class tes
{
private:
int m_data;
public:
int Data() const { return this->m_data; }
void Data(int data) { this->m_data = data; }
};
実装していて今の所問題ない。俺の場合は。
これって、どんな問題が考えられる?
本当に、単純に値を出し入れするだけなら
3)かなあ。これSpecialIDの設定はintじゃないよね?
ところで、C#をやるようになってから
C++でこの手の値入出力系のメンバにGet,Setをつけなくなった。
こんな感じ。
class tes
{
private:
int m_data;
public:
int Data() const { return this->m_data; }
void Data(int data) { this->m_data = data; }
};
実装していて今の所問題ない。俺の場合は。
これって、どんな問題が考えられる?
442デフォルトの名無しさん
2010/01/28(木) 00:36:10443デフォルトの名無しさん
2010/02/20(土) 16:25:28444デフォルトの名無しさん
2010/02/20(土) 16:28:26 rubyとかだとね、x.data = 0と書けるね。
445デフォルトの名無しさん
2010/02/21(日) 09:56:48 コーディングルールとして完全に縛ってれば別に問題は無いんじゃね。初期化子とかに
似ているといえば似ている気もしなくもないし。
ただ、暗黙の変換に似た気持ち悪さは感じるが。
似ているといえば似ている気もしなくもないし。
ただ、暗黙の変換に似た気持ち悪さは感じるが。
446デフォルトの名無しさん
2010/02/21(日) 17:38:20 関数をオーバーロードにするか、別名の関数にするかの判断基準ってどうしてます?
447デフォルトの名無しさん
2010/02/21(日) 23:09:19 漏れは機能が似てるならオーバーロードするね
448デフォルトの名無しさん
2010/02/21(日) 23:14:09 そういうのはクラスを使う人のための配慮だから実装がどうだからオーバーロード使うとかいう
基準を設けるのは間違ってるだろ
基準を設けるのは間違ってるだろ
449デフォルトの名無しさん
2010/02/22(月) 00:08:58 メリットが何もないからオーバーロードはしない
450デフォルトの名無しさん
2010/02/22(月) 02:43:29 メリットのある場合もある
無い時はしない方がいい
暗黙の型変換とかと同じで、しないと大変なことになるんじゃなければ、しない方がいい
無い時はしない方がいい
暗黙の型変換とかと同じで、しないと大変なことになるんじゃなければ、しない方がいい
451デフォルトの名無しさん
2010/02/22(月) 08:31:37452デフォルトの名無しさん
2010/03/05(金) 16:33:59 関数で、自分では操作しないけど戻り値は自己責任で自由に使ってねって言う場合、
std::vector<int> &GetVector() const { return const_cast<std::vector<int> &>(this->m_vector); }
こんな感じで書いてるんだけど、まずいかな。
const関数なんで使う側はコピーを返してると勘違いするとか。
なんか、自分ではいじらない、ただ渡したものは自由に使っていいよ
っていうものの正しい書き方が見えない。orz
std::vector<int> &GetVector() const { return const_cast<std::vector<int> &>(this->m_vector); }
こんな感じで書いてるんだけど、まずいかな。
const関数なんで使う側はコピーを返してると勘違いするとか。
なんか、自分ではいじらない、ただ渡したものは自由に使っていいよ
っていうものの正しい書き方が見えない。orz
453デフォルトの名無しさん
2010/03/05(金) 17:00:54 const_castが必要になる状況は不自然。無理を通している。
constのvectorってのも不可解。何に使うつもり?
constのvectorってのも不可解。何に使うつもり?
454デフォルトの名無しさん
2010/03/05(金) 17:09:19 constメソッドにするとvs2008ではメンバが
const定義扱いでコンパイルされるらしい。
this->m_vectorはconstじゃないけど、GetVector() const;で内からそのまま返すと
error C2440: 'return' : 'const std::vector<_Ty>' から 'std::vector<_Ty> &' に変換できません。
とエラーが出る。
const定義扱いでコンパイルされるらしい。
this->m_vectorはconstじゃないけど、GetVector() const;で内からそのまま返すと
error C2440: 'return' : 'const std::vector<_Ty>' から 'std::vector<_Ty> &' に変換できません。
とエラーが出る。
455デフォルトの名無しさん
2010/03/05(金) 19:14:42 >>454が何を言っているのかわからない
456デフォルトの名無しさん
2010/03/05(金) 19:34:56457デフォルトの名無しさん
2010/03/05(金) 19:57:36 const 版と非 const 版を作る。
const オブジェクトに対しても使えるようにするなら、メンバを mutable 修飾する。
スタイル的には、そんな設計がおかしい。
変更する必要のある側が保持して、使う側はその時点のものを借りる関係であるべきだ。
452 のは、ヨソの家の無線LANにただのりするような構造だ。
仕方の無いときはあるが、そんな時は別のスレがふさわしい。
const オブジェクトに対しても使えるようにするなら、メンバを mutable 修飾する。
スタイル的には、そんな設計がおかしい。
変更する必要のある側が保持して、使う側はその時点のものを借りる関係であるべきだ。
452 のは、ヨソの家の無線LANにただのりするような構造だ。
仕方の無いときはあるが、そんな時は別のスレがふさわしい。
458デフォルトの名無しさん
2010/03/05(金) 20:55:11459デフォルトの名無しさん
2010/03/06(土) 01:04:58460デフォルトの名無しさん
2010/03/06(土) 02:23:03461デフォルトの名無しさん
2010/03/06(土) 03:11:30462デフォルトの名無しさん
2010/03/06(土) 03:20:03 >>461
なんで >459 へのレスが >456 へのレスと同じになるの?
なんで >459 へのレスが >456 へのレスと同じになるの?
463デフォルトの名無しさん
2010/03/06(土) 13:45:49464デフォルトの名無しさん
2010/03/06(土) 13:53:10 コンパイルエラーが出るからconst外しをするとか
コーディングスタイル以前の問題
コーディングスタイル以前の問題
465デフォルトの名無しさん
2010/03/06(土) 13:59:57 > 内部遷移が複雑なロジックとかだと、中で余計な事しないよ的な意味で
メンバ変数、しかもベクタ丸ごと外に晒そうなんて考える奴が言う台詞か?w
メンバ変数、しかもベクタ丸ごと外に晒そうなんて考える奴が言う台詞か?w
466デフォルトの名無しさん
2010/03/06(土) 17:28:15467デフォルトの名無しさん
2010/03/06(土) 17:33:42 >>466
それって普通の「内部状態変更しないよ的な意味でのconst」と何が違うの?
それって普通の「内部状態変更しないよ的な意味でのconst」と何が違うの?
468デフォルトの名無しさん
2010/03/06(土) 17:44:49 上の例だと、渡す時は内部状態を操作しないけど、戻り値は自己責任で自由に使ってね
それによって内部状態が変更されるよって言う場合。
std::vector<int> &GetVector() const;
それによって内部状態が変更されるよって言う場合。
std::vector<int> &GetVector() const;
469デフォルトの名無しさん
2010/03/06(土) 18:00:30 >>468
外部で自由に設定していいものを「内部状態」とは言わんだろうし、
それを反映してコードでもメンバ変数にするべきじゃないでしょ。
ってすでに >457 も >459 も言ってるんだけど、それについてはどう
なのさ?
外部で自由に設定していいものを「内部状態」とは言わんだろうし、
それを反映してコードでもメンバ変数にするべきじゃないでしょ。
ってすでに >457 も >459 も言ってるんだけど、それについてはどう
なのさ?
470デフォルトの名無しさん
2010/03/07(日) 00:54:36 >>466
const tes ctes;
があったとき、ctes が変更されそうな操作をコンパイラがエラーにしてくれるのは素晴らしいことだ。
非 const メンバ関数を呼んだり、非 const ポインタ(や参照)への変換はもちろんエラーだ。
他に、オブジェクト内部の変数のアドレスを返すことについても、コンパイラは追跡してくれる。
非 const のアドレスを返すと、外から内部状態を変更されてしまうかも知れないから、わざわざチェック
してエラーにしてくれる。
458 のエラーは、C++ の規格でそうなっている。
とても有難い機能で、コンパイラベンダのみなさんがこの機能を頑張って実装してくれたお陰で、僕らは
constness の追跡について機械任せでいられる。
これにより、 const メンバ関数だけを呼ぶ限り、const オブジェクトについて、関数を呼んだ時も呼んだ
後も内部状態が変化していないことを想定していいことになる。お行儀のいいコードならだけど。
だから、const の意味を二つに分ける必要なんて無い。
アリナシの話は、それどころか原則 const であるべきで、観念的に副作用がある場合のみ非 const
であるべき。
そして const 版と非 const 版の両方が必要なら実装すればいい。
const tes ctes;
があったとき、ctes が変更されそうな操作をコンパイラがエラーにしてくれるのは素晴らしいことだ。
非 const メンバ関数を呼んだり、非 const ポインタ(や参照)への変換はもちろんエラーだ。
他に、オブジェクト内部の変数のアドレスを返すことについても、コンパイラは追跡してくれる。
非 const のアドレスを返すと、外から内部状態を変更されてしまうかも知れないから、わざわざチェック
してエラーにしてくれる。
458 のエラーは、C++ の規格でそうなっている。
とても有難い機能で、コンパイラベンダのみなさんがこの機能を頑張って実装してくれたお陰で、僕らは
constness の追跡について機械任せでいられる。
これにより、 const メンバ関数だけを呼ぶ限り、const オブジェクトについて、関数を呼んだ時も呼んだ
後も内部状態が変化していないことを想定していいことになる。お行儀のいいコードならだけど。
だから、const の意味を二つに分ける必要なんて無い。
アリナシの話は、それどころか原則 const であるべきで、観念的に副作用がある場合のみ非 const
であるべき。
そして const 版と非 const 版の両方が必要なら実装すればいい。
471デフォルトの名無しさん
2010/03/14(日) 17:06:10 C++のクラスでメンバ変数が多いとき、コンストラクタ初期化子を
改行して書くと思うんだけどどう書く?
セミコロンとカンマをどこに持ってくるのかが知りたい
1)
hoge::hoge()
: foo(),
bar(),
baz()
2) googleスタイル?
hoge::hoge()
: foo(),
bar(),
baz()
3)
hoge::hoge()
: foo()
, bar()
, baz()
4)
hoge::hoge() :
foo(),
bar(),
baz()
改行して書くと思うんだけどどう書く?
セミコロンとカンマをどこに持ってくるのかが知りたい
1)
hoge::hoge()
: foo(),
bar(),
baz()
2) googleスタイル?
hoge::hoge()
: foo(),
bar(),
baz()
3)
hoge::hoge()
: foo()
, bar()
, baz()
4)
hoge::hoge() :
foo(),
bar(),
baz()
472デフォルトの名無しさん
2010/03/14(日) 17:08:09 セミコロンじゃなくてコロンだった
473デフォルトの名無しさん
2010/03/14(日) 17:18:54 // インラインなら
hoge(): foo(apple), bar(banana),
yaw(orange), baz(strawberry)
{ ... }
// ソースに書くならこう
hoge::hoge():
foo(apple), bar(banana), yaw(orange),
baz(strawberry)
{
...
}
hoge(): foo(apple), bar(banana),
yaw(orange), baz(strawberry)
{ ... }
// ソースに書くならこう
hoge::hoge():
foo(apple), bar(banana), yaw(orange),
baz(strawberry)
{
...
}
474デフォルトの名無しさん
2010/03/14(日) 18:31:09 やっぱコロン、カンマは後ろに持ってきたほうが見た目がいいよね
回答ありがとう
回答ありがとう
475デフォルトの名無しさん
2010/03/15(月) 08:29:36 俺は真逆で、コロンが前に来てないと落ち着かない
というより、前置か二項っぽい意味合いのものは、行頭に来るように置くのが普通
だと思うけどなぁ
というより、前置か二項っぽい意味合いのものは、行頭に来るように置くのが普通
だと思うけどなぁ
476デフォルトの名無しさん
2010/03/15(月) 09:18:03 自分を中心に地球が回ってると考えるタイプの方ですね
477デフォルトの名無しさん
2010/03/15(月) 09:59:37478デフォルトの名無しさん
2010/03/15(月) 10:19:09 普通かどうかで言えば、コンマが後ろにくるのが普通だと思われているからこそ
enum 宣言や配列初期化子に余分なコンマがあっても許されるようになったのだろう。
俺は後ろ派だが、手前派には
・行単位の追加削除移動の時に手当ての必要が少ない
・縦に並べた時に筆算のようになるし、自然言語と親和する
というようなメリットがあるので理解できる。
後ろ派はメリットよりは慣習的なものだと思う。
改行の持つ意味合いが強かった頃の名残りではなかろうか。
コロンに関しては、元の英語での使い方が一対一や一対多の左側を明示するもの
なのだから、makefile やラベルのように後ろに付けるのが普通だろう。
enum 宣言や配列初期化子に余分なコンマがあっても許されるようになったのだろう。
俺は後ろ派だが、手前派には
・行単位の追加削除移動の時に手当ての必要が少ない
・縦に並べた時に筆算のようになるし、自然言語と親和する
というようなメリットがあるので理解できる。
後ろ派はメリットよりは慣習的なものだと思う。
改行の持つ意味合いが強かった頃の名残りではなかろうか。
コロンに関しては、元の英語での使い方が一対一や一対多の左側を明示するもの
なのだから、makefile やラベルのように後ろに付けるのが普通だろう。
479デフォルトの名無しさん
2010/03/15(月) 10:27:34 コロンは前、カンマは後ろ派
480デフォルトの名無しさん
2010/03/15(月) 10:29:51481デフォルトの名無しさん
2010/03/15(月) 10:33:48 漏れ、改行しないんだけど
hoge::hoge(): foo(), bar(), baz()
hoge::hoge(): foo(), bar(), baz()
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★12 [蚤の市★]
- 中国の渡航自粛要請1カ月 大阪の観光バス予約ゼロ、東北にも波及 [蚤の市★]
- 【神戸】エレベーター「かご」なく男性医師が転落死 大手「三菱電機ビルソリューションズ」の担当者、安全装置切り放置か [ぐれ★]
- 【日本人の旅行離れ】国内旅行すら行けなくなった……オーバーツーリズムだけじゃない 旅行者減少の異常事態 [ぐれ★]
- 不倫疑惑の永野芽郁さん、CM削除ドミノの違約金“やはり発生は免れない”可能性 約10億円になる見込み、本人は全額支払う覚悟 [牛丼★]
- 女性天皇「賛成」69%、将来の皇位継承「不安」68%…読売世論調査 [蚤の市★]
- かめはめ波打って仕事行く(5連続成功中)
- 高市、メガソーラー廃止。環境破壊が社会問題化 [792147417]
- 他人のリクエストで自分の癖と異なる絵を上げる絵師いるじゃん?
- 日本人がホルホルの対象にしている生物、海外にも生息すると判明 [603416639]
- 【悲報】フィギュアオタク「2月に結婚予定だった彼女にフラれた。ドラゴンボールのフィギュアも式で飾ろうと話してたのになぜ…」 [802034645]
- 職業訓練行ってるんだけど月13日しか行かないのに毎月18万貰えてる
