アカウント名:
パスワード:
> 判断条件が128個あるなら128個のcaseが並ぶswitch文は問題ないと思うけど
C/C++だと,分岐が128個もあるような大きなswitch 文は関数テーブルつかって書きなおす方が保守しやすくなる,ってよく言われてます.
すくなくとも私は 128個もcaseが並んでいたら,その時点でそのコードを読む気力が無くなります.これ全パターンデバッグできてるの?break とか抜けたりしてないの?等,いちいちチェックしたくないので.
> C/C++だと,分岐が128個もあるような大きなswitch 文は> 関数テーブルつかって書きなおす方が保守しやすくなる,> ってよく言われてます.
関数テーブルを使うと甚だしい性能劣化を招くこともある。(勿論、そうでない場合もある)
break の抜けをチェックしてでも性能をあげなきゃいけない状況も往々にしてある。
ケースバイケースだよ。 # これを言いたかった。
それから全パターンデバッグについては関数テーブルを使う場合でも試験するのが当然。
糞コードはSwitch文から生まれる使う時は細心の注意を払う必要があります
可読性、メンテナンス性をぶち壊す根源
別に大きなswitch文でも問題ないと思う。見やすいシンプルな条件なら。小細工をしたほうが悪くなるコードってのもあるもんだ。
テストケースも、逆に作りやすいはず。「いちいちチェックしたくない」と言うことは、もともと貴方はテストの網羅性を考慮してない。その発想にはちょっとゾッとしました。
仕様書からテーブルをつくってテーブルから関数テーブルとテストケースを自動生成するんです.
> テストケースも、逆に作りやすいはず。
大きなswitch文でコード書いて,それからテストケース書いてると,それこそ網羅性が維持できないですよ.ぞっとしませんか?
イベントループはcaseがたくさん並んでいるもんだよね。
7(8)ビット文字を一つ読んで、記号、数字、英字それぞれの処理をするとしたらどうしてもcaseが128個になるよねisalpha等の使えない速度や環境の事情もあるだろうし
isalphaの中身がそうならざるおえないコード体系だって有るし。だから、部分を抜き出して馬鹿とか言うのは文系。文系って文脈読めないんだよね。
そうならざるおえない
文系を馬鹿にする前に、もうちょっと文系の勉強をした方がいいかもね。
いいえ、これは再帰です。
return 0;
>関数の最後が『return 0;』でも、正常なら最後まで通るコードなら問題ないと思うけど。
戻り先で値を読んでの処理をしない場合でも,コーディングの規約として明示的に0を戻り値とすることにしている~ということも考えられるけどコードの断片だけを見せられても,まともな議論が出来ない
switch文の最適化なら今時どのコンパイラでもやってくれますけど、意味的に等価なelif分岐を同様に扱ってくれないことはままありますね。
「128個」という数字に何を察するか。読み手の技量と経験しだいで達筆も落書きになります。
判断条件が128個あるなら128個のcaseが並ぶswitch文は問題ないと思うけど。
もし、 [JavaScript] とっても長いswitch/case文 [unkode-mania.net]のことを言っているのであれば、
var rnd = Math.floor(Math.random() * 128) ;
rndは0〜127の128通りであるにもかかわらず、case 0〜case 128の 129個のcaseが並ぶswitch文は、やっぱり問題だと思
まったくですな。javascript のランダム関数って 1 を返すのかと思ってググって確認してしまいましたよ。
# デフォルトのまま、現在時刻を seed に使っていることにも一言いいたい。
何か問題でも?
ありそうな seed のあたりをつけやすいですよね。まあ用途次第で、それほどランダムであることにこだわらないのなら十分でしょうが。
判断条件が8個くらいしかないのに4個でswitch-caseが終わっていて、しかもdefault処理書いてないから残り4個の時にはめちゃくちゃな値が入るという素敵なコードを見たことが・・・見つけたときには思わずモニターに向けてツッコミを入れてしまいました。#しかもリリース済みバージョン。
20年ぐらい前、プログラムをまず紙に書いてた頃に関数名が連番なプロジェクトを見たことありますね。時代でしょ
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲはアレゲ以上のなにものでもなさげ -- アレゲ研究家
別に (スコア:0)
関数の最後が『return 0;』でも、正常なら最後まで通るコードなら問題ないと思うけど。
謎の連番で命名されたクラス名/メンバ変数名でも、命名の取り決めがちゃんとあれば問題ないと思うけど。
Re:別に (スコア:2)
> 判断条件が128個あるなら128個のcaseが並ぶswitch文は問題ないと思うけど
C/C++だと,分岐が128個もあるような大きなswitch 文は
関数テーブルつかって書きなおす方が保守しやすくなる,
ってよく言われてます.
すくなくとも私は 128個もcaseが並んでいたら,その時点でそのコードを読む気力が無くなります.
これ全パターンデバッグできてるの?break とか抜けたりしてないの?等,いちいちチェックしたくないので.
Re:別に (スコア:2)
> C/C++だと,分岐が128個もあるような大きなswitch 文は
> 関数テーブルつかって書きなおす方が保守しやすくなる,
> ってよく言われてます.
関数テーブルを使うと甚だしい性能劣化を
招くこともある。(勿論、そうでない場合もある)
break の抜けをチェックしてでも性能をあげなきゃ
いけない状況も往々にしてある。
ケースバイケースだよ。 # これを言いたかった。
それから全パターンデバッグについては
関数テーブルを使う場合でも試験するのが当然。
Re: (スコア:0)
糞コードはSwitch文から生まれる
使う時は細心の注意を払う必要があります
可読性、メンテナンス性をぶち壊す根源
Re: (スコア:0)
別に大きなswitch文でも問題ないと思う。見やすいシンプルな条件なら。
小細工をしたほうが悪くなるコードってのもあるもんだ。
テストケースも、逆に作りやすいはず。
「いちいちチェックしたくない」と言うことは、もともと貴方はテストの網羅性を考慮してない。
その発想にはちょっとゾッとしました。
Re: (スコア:0)
仕様書からテーブルをつくって
テーブルから関数テーブルとテストケースを自動生成するんです.
> テストケースも、逆に作りやすいはず。
大きなswitch文でコード書いて,
それからテストケース書いてると,それこそ網羅性が維持できないですよ.ぞっとしませんか?
Re: (スコア:0)
イベントループはcaseがたくさん並んでいるもんだよね。
Re: (スコア:0)
7(8)ビット文字を一つ読んで、記号、数字、英字それぞれの処理をするとしたらどうしてもcaseが128個になるよね
isalpha等の使えない速度や環境の事情もあるだろうし
Re:別に (スコア:1, すばらしい洞察)
isalphaの中身がそうならざるおえないコード体系だって有るし。
だから、部分を抜き出して馬鹿とか言うのは文系。
文系って文脈読めないんだよね。
Re:別に (スコア:1, すばらしい洞察)
そうならざるおえない
文系を馬鹿にする前に、もうちょっと文系の勉強をした方がいいかもね。
Re: (スコア:0)
#これがネストループ
Re: (スコア:0)
本人は本当にしてやったりと思ってるんだろうなあ
Re:別に(物の見事に捕まえてくれて有難う) (スコア:1)
いいえ、これは再帰です。
Re:別に(物の見事に捕まえてくれて有難う) (スコア:1)
return 0;
Re: (スコア:0)
>関数の最後が『return 0;』でも、正常なら最後まで通るコードなら問題ないと思うけど。
戻り先で値を読んでの処理をしない場合でも,コーディングの規約として明示的に0を戻り値とすることにしている~ということも考えられるけど
コードの断片だけを見せられても,まともな議論が出来ない
Re: (スコア:0)
switch文の最適化なら今時どのコンパイラでもやってくれますけど、
意味的に等価なelif分岐を同様に扱ってくれないことはままありますね。
「128個」という数字に何を察するか。読み手の技量と経験しだいで達筆も落書きになります。
Re: (スコア:0)
判断条件が128個あるなら128個のcaseが並ぶswitch文は問題ないと思うけど。
もし、 [JavaScript] とっても長いswitch/case文 [unkode-mania.net]のことを言っているのであれば、
rndは0〜127の128通りであるにもかかわらず、case 0〜case 128の
129個のcaseが並ぶswitch文は、やっぱり問題だと思
Re: (スコア:0)
まったくですな。
javascript のランダム関数って 1 を返すのかと思ってググって確認してしまいましたよ。
# デフォルトのまま、現在時刻を seed に使っていることにも一言いいたい。
Re: (スコア:0)
# デフォルトのまま、現在時刻を seed に使っていることにも一言いいたい。
何か問題でも?
Re: (スコア:0)
ありそうな seed のあたりをつけやすいですよね。
まあ用途次第で、それほどランダムであることにこだわらないのなら十分でしょうが。
Re: (スコア:0)
判断条件が8個くらいしかないのに4個でswitch-caseが終わっていて、しかもdefault処理書いてないから
残り4個の時にはめちゃくちゃな値が入るという素敵なコードを見たことが・・・
見つけたときには思わずモニターに向けてツッコミを入れてしまいました。
#しかもリリース済みバージョン。
Re: (スコア:0)
基本的にbreakの漏れがないのかを判断し辛いものはswitchで書くべきではないし、全ての条件において共通の変数に値を代入するだけなら配列でよい(ウンコードにあるのはまさにそれ)。
関数テーブルに置き換えるのは、処理速度の面で抵抗がある場合もあるけど、長大なswitch文は局所性が悪くなり、キャッシュのヒットミスを増加させるので、switch文で書くメリットは少ない。このあたりは関数のインライン化と同様に考えると判断しやすい。
でも、switch文で分かりやすく書ける場合もあるから、そういうときはswitch文を使うべき。稀だけどね。
Re: (スコア:0)
20年ぐらい前、プログラムをまず紙に書いてた頃に関数名が連番なプロジェクトを見たことありますね。
時代でしょ