ヘタなコードの書き方
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/04/12(土) 23:20:23* サブルーチン(関数)を長くする。数百行以上。
* コピペ多用
* ネストを深くする
* フラグを多用する
* マジックナンバーを使いまくる
* 識別子(変数名、関数名)は意味不明に
* グローバル変数つかいまくり
まとめサイト
http://www34.atwiki.jp/hetacode/
↓以下、応用編、上級者編
0153デフォルトの名無しさん
2008/04/16(水) 00:06:13* * * 対 象 デ ー タ 更 新 * * *
みたいなの。
特にログでやると検索できねーだろ。アホか。
0154デフォルトの名無しさん
2008/04/16(水) 00:27:130155デフォルトの名無しさん
2008/04/16(水) 01:04:54if ((a >= 0) && (b <= 0) && (c != ((10 * 3) / d) + e)) {
・文字を詰める
if(a>=0&&b<=0&&c!=10*3/d+e){
0156デフォルトの名無しさん
2008/04/16(水) 01:04:54全員でやってないと、なにかの拍子に書き換えられちゃうんだよな。
デフォルトの力の前には無力だ。
0157デフォルトの名無しさん
2008/04/16(水) 02:55:47return1個は慣れればどうってことないけどその人は初体験だったみたい。
ソースレビューはなかったらしい。
多重ネストでforから脱出するフラグがいっぱい♪
0158デフォルトの名無しさん
2008/04/16(水) 03:03:46例外使ってないってことはCかな。
0159デフォルトの名無しさん
2008/04/16(水) 07:02:41それは駄目なのか?むしろ括弧はつけろと思うが
演算子はつめてもいいんじゃないか?
0160デフォルトの名無しさん
2008/04/16(水) 07:13:25でも、レビューしたとき「なくてもいいのは知ってるけど、つける規約になってるからつけて」って言われてつけてる。
コンパイルは -Wall なんで、「ambiguous ...」みたいなメッセージをたまに見るところをみると
おれもまだまだダメちんのようです。
0161デフォルトの名無しさん
2008/04/16(水) 08:02:340162デフォルトの名無しさん
2008/04/16(水) 18:14:03Javaでは
int a[];
よりも
int[] a;
として欲しい
0163デフォルトの名無しさん
2008/04/16(水) 22:50:53struct Item {
int id;
int size;
string name;
}
Item items[NUM];
・基本
int id[NUM];
int size[NUM];
string name[NUM];
・上級者
struct Item {
int id[NUM];
int size[NUM];
string name[NUM];
}
Item item
0164デフォルトの名無しさん
2008/04/16(水) 23:36:51基本って何の基本だ?
AoSよりSoAの方がいいという話は聞いたことがあるが、未だにメリットがわからない・・・
0165デフォルトの名無しさん
2008/04/16(水) 23:43:32はどうかな? 「素直にif文使えよ」と言っといたんだけど。
x += (x >= 0) ? +100 : -100;
ならなんとか許容範囲。
0166デフォルトの名無しさん
2008/04/16(水) 23:45:46パディングの分だけ無駄領域が出にくいとか。
つーか、AoSとかSoAってのも初めて聞いた。
0167デフォルトの名無しさん
2008/04/16(水) 23:51:59>>1 に載ってる基本レベルかなと思って。
0168デフォルトの名無しさん
2008/04/16(水) 23:54:11> x >= 0 ? x += 100 : x -= 100;
gcc-4.1.2だとコンパイルできん。
0169デフォルトの名無しさん
2008/04/16(水) 23:55:53struct Hoge {
int hoge_xxx;
int hoge_yyy;
int hoge_zzz;
};
struct tmとかCの標準ライブラリでもやってるけど。
0170デフォルトの名無しさん
2008/04/16(水) 23:56:47私は頭が悪いので少しでも考えないといけないソースは苦手です。
0171デフォルトの名無しさん
2008/04/16(水) 23:58:49FORTRANとかアセンブラの話じゃなくて、C++の話。
0172デフォルトの名無しさん
2008/04/16(水) 23:59:14プログラムの律速はキャッシュミスにあるので、使用するアルゴリズム、処理によって
データ構造を適切に選ぶ必要がある。
また、組み込み系などメモリがシビアな時は、速度を犠牲にして空間効率を高めたりするので、
開発環境によっても自然、アルゴリズムとデータ構造は適切に選択しなければならない。
0173デフォルトの名無しさん
2008/04/17(木) 00:05:23富士通だか日立だか忘れたけど、もと有名企業の社員で技術力には自信がありますとかHPでアピールしてる
フリーの人から仕事をもらったら、そういうコード書いてたよ。
こういうところがアマチュアと違うんだとか、本人は得意げだったけど。
0174デフォルトの名無しさん
2008/04/17(木) 00:22:22書けばいいってもんじゃないんだがなあw
しかも書いてあるコメント見ると、>>7みたいなのがほとんどだった。
0175デフォルトの名無しさん
2008/04/17(木) 01:51:14調べてみたが、C++ならおkだが、Cだとだめらしい。初めて知ったよw
つーか、>>170の言う通りだよなあ…
0176デフォルトの名無しさん
2008/04/17(木) 02:46:05こういう書き方が玄人の証と考えていた時期が俺にもありました。
0177デフォルトの名無しさん
2008/04/17(木) 02:46:480178デフォルトの名無しさん
2008/04/17(木) 03:57:320179デフォルトの名無しさん
2008/04/17(木) 10:52:47"Hacker's Delight"レベルなら許すんだがなあw
0180デフォルトの名無しさん
2008/04/17(木) 11:09:53妙に大仰なファイルヘッダ書くのは素人くさいなあと思う。
ずれまくりだとは思うがこんな感じ。
//----------------------------------------------------------------------------//
// //
// Sub System Name : Xxxxxx Module //
// File Name : Xxx_Main.h //
// Engineer : xxxxxxxx xxx //
// Created Date : yy.mm.dd //
// Last Edit : yy.mm.dd //
// Revision : nnn //
// Description : Xxxxxx Module Local Define //
// //
// Copyright (C) by xxxxxxxxxx Co.,Ltd. All rights reserved. //
// Author xxxxxxxxxx Co.,Ltd. //
// 機密文書:永久 xxxxxxxxx Confidential (Critical:Eternity) //
// //
//----------------------------------------------------------------------------//
日付やリビジョンを人手で入力してたり、
日本語でおkなのにもかかわらず微妙な「英語」で書きたがるのもお約束かなあ。
0181180
2008/04/17(木) 11:26:37//----------------------------------------------------------------------------//
// 機密文書:永久 xxxxxxxxxx Confidential (Critical:Eternity) //
// この文書、図面、Source Code、及び、含有する全情報の所有権,著作権は //
// xxxxxxxxxxxxxx株式会社に属する。事前にxxxxxxxxxxxxxx株式会社の文書による //
// 許可無くして、xxxxxxxxxxxxxx株式会社の物品の製造以外の目的に、この図面、 //
// Source Codeを複写、複製及び使用してはならない。 //
// Copyright(c); xxxxxxxxxx Co.,Ltd. All rights reserved. //
// Use,duplication or disclosure restricted by the law & xxxxxxxxxx Co.,Ltd. //
//----------------------------------------------------------------------------//
// ****************************** [ XX_Common.h : EOF ] ******************************
別に法務部から何か言われたとか、上司から指示があったとか、
コーディング規約で決まってるとか一切なくて、本人の独断で入れたみたい。
こんなの書かなくても機密保持契約は有効だし、
会社の著作物であることは当然なんだけど、もしかしてわかってないのかなあ…
0182デフォルトの名無しさん
2008/04/17(木) 11:32:24あれこれ理由はなくて、書いた本人が単にそういう様式で書きたかっただけだろ?
「ぷれぜんてっど ばい おれ」みたいな感じで
0183デフォルトの名無しさん
2008/04/17(木) 13:16:24英語表記で書くのってなんか馬鹿っぽいよね。<Source Code
自意識過剰な人なのかもな。
0184デフォルトの名無しさん
2008/04/17(木) 14:29:44コードそのものでも>>176とか>>178みたいに「個性」を表現したがる。
そういう奴はコードレビューでいじめてやるのだが。
0185デフォルトの名無しさん
2008/04/17(木) 14:43:22もちろんコメントつけてわかりやすくしといた方がいいけど。
全くもって速度がどうでもいい場所で
そういうコードばっかり考えて時間無駄にしてるならともかく、
コンパイラが最適化してくれない部分を
そういうテクで補うクセが付いてる人って、俺は羨ましいけどなぁ。
自分はなかなか思いつかんし。
>>178みたいなテクを考える人が減ってくのはちょっと寂しい。
0186デフォルトの名無しさん
2008/04/17(木) 14:50:57もしかして逆アセンブルとかしてデバッグできない人?
すべてのケースで、またすべてのコンパイラで成り立つか分からないが、
多くの場合3項演算子使った最適化に有利。
そんなこと知らないとしたら、>>184みたいな人間にレビュー付き合わされる人間て可哀想。
0187デフォルトの名無しさん
2008/04/17(木) 14:51:51真偽値を1,0と決め付けている点で五十歩百歩。技巧以前の問題なのだ。
0189デフォルトの名無しさん
2008/04/17(木) 14:59:41符号付きなら論理シフトになるか算術シフトになるか決まってないし
32ビットと決め打ちだし、そもそも普通のif文のほうが早い可能性もあるし
0190デフォルトの名無しさん
2008/04/17(木) 15:28:27う?178のどこに真偽値が?
まぁどっちにしても環境を限定した書き方だから
処理系をまたぐであろうプコードでそんなの書けないだろうけど。
0191デフォルトの名無しさん
2008/04/17(木) 15:28:58○コード
orz
0192デフォルトの名無しさん
2008/04/17(木) 15:40:06「システムを運用しているうちにサーバの応答が遅くなり、しまいには無応答になる。サーバを再起動すれば治るが、
数日でまた応答しなくなる」というクライアントの訴えを受けてサーバを調べた俺が見たものは……
メモリを埋めつくす数十プリニウスものexcel.exeだった。
0193デフォルトの名無しさん
2008/04/17(木) 15:53:59三項演算子自体の可読性も性能も別段悪くないんだが…
0194デフォルトの名無しさん
2008/04/17(木) 16:22:18>速いんだし。
x>>31 が abs(x) より速いという確証があるのか?
>全くもって速度がどうでもいい場所で
速度が問題になる箇所ならインラインアセンブラ使えって話だ。
>>187
>決め付けている点で
関係演算子の結果は、そう決まっている。
>>189
>論理シフトになるか算術シフトになるか決まってないし
こっちは処理系定義なんで、移植する気がないなら問題にはならない。
まあ個人的には、どっちもキモいな。
0195デフォルトの名無しさん
2008/04/17(木) 16:24:500197デフォルトの名無しさん
2008/04/17(木) 17:53:22の方がさすがに速いだろうと思ったんだけど。違うの?
高速化に関しては初心者だけどさ。
>速度が問題になる箇所ならインラインアセンブラ使え
そらそうだろうけど、ゲームなんかだと毎秒30〜60回実行されるコードが
何万行とあるじゃん。チリも積もればなんとかで、手軽に条件分岐を減らせるなら
減らした方がいいと思うけど。俺の場合は上にコメント書く。
abs(x)使うやり方は気になるw まさか((x - abs(x)) & -200)とか?
0198197
2008/04/17(木) 17:56:18なんかいけそうな気もするけど無理か。スレ汚しスマソ
0199デフォルトの名無しさん
2008/04/17(木) 21:07:25簡単な計算は可読性重視、速度無視
0200デフォルトの名無しさん
2008/04/17(木) 21:25:48struct Hoge {
int hoge_xxx;
int hoge_yyy;
int hoge_zzz;
};
struct tmとかCの標準ライブラリでもあるけど。
0201デフォルトの名無しさん
2008/04/17(木) 21:35:160202デフォルトの名無しさん
2008/04/17(木) 21:45:16これは俺もよく見る。そのたび同じことを思う。
0203デフォルトの名無しさん
2008/04/17(木) 22:23:48スルーされたから?
0204デフォルトの名無しさん
2008/04/17(木) 22:34:520205側近中の側近 ◆0351148456
2008/04/17(木) 23:06:24処理時間をどうこう言ってる人がいるが、
保守性、可読性を優先させたほうがいいでしょう。
処理時間をどうこう言うなら、目標時間を定めてから。
1秒を0.95秒にしたところでユーザに喜ばれるだろうか?
こう言うと、
ちりも積もれば山となる、処理時間だって言える
ソースコード全てにおいて、スピードを考慮すべき
と答える人がいるが、
実は、ソースコードの5%が処理時間の95%を占めるという研究結果がある。
つまり、闇雲にスピードを追求してもあまり意味が無いってことだ。
むしろ、スピードを追求した結果、
保守性が低くなるどころがバグ満載では、本末転倒である。
(っ´▽`)っ
処理時間と保守性、可読性についてもっと知りたい、考えたい人には、
コードコンプリート下巻をお勧めしよう。
0206側近中の側近 ◆0351148456
2008/04/17(木) 23:11:32コードコンプリートは上巻を読まないと下巻は理解しづらいかもしれないね☆
上下巻併せて12,810円です。
上下巻ともに、広尾の都立中央図書館の1階開架に置いてあるようです☆
0207側近中の側近 ◆0351148456
2008/04/17(木) 23:13:39っていうか、名著中の名著だから、ここの人たちはみんな読んだことがあるんだろうね☆
(っ´ω`)っ 出しゃばってごめんね、いきててごめんね、
0208デフォルトの名無しさん
2008/04/17(木) 23:18:31観念的な空論をとなえるのをやめてちゃんとプロファイルをとれば、
こんな流言に左右されずに適切な最適化を実施すること(あるいは実施しないこと)ができる。
ところで漏れが組んだシステムで↑みたいな極端な例は殆ど無かったなぁ。
実はかなり特殊な領域を対象にした研究なんじゃないだろうか。
0209デフォルトの名無しさん
2008/04/17(木) 23:23:34まあなんにせよ速度の最適化にはまず測定からだ。
0210208
2008/04/17(木) 23:31:49ちょっと前の俺に反論。
高速化したい対象だけ注視しないで、UIやらなんやらを含む全コードを見れば
やっぱり極々一部が大半のCPUパワーを使っているような気がするぞ。
0211デフォルトの名無しさん
2008/04/17(木) 23:32:10毎度、毎度ファイル先頭に1行
ってなんだよやめてくれよw
0212側近中の側近 ◆0351148456
2008/04/17(木) 23:33:18こういう感じだね☆
処理時間の目標の設定(Plan)
↓
測定(See)
↓↑
処置(Do)
0213デフォルトの名無しさん
2008/04/17(木) 23:33:19これ書いた人、ローカル変数の頭に全部"the"つけてるんだよね。こんな感じ:
#define UC unsigned char
#define CLEAR 0
static void Xxx_YyyClear( UC inXxxYyyName )
{
UC theXxxLocalYyyNameNo = CLEAR;
theXxxLocalYyyNameNo = inXxxYyyName;
xxxGlobalInfo[ theXxxLocalYyyNameNo ] = clearXxxYyyyInfo;
}
強烈でしょw 固有名詞は伏せたけど、実在のコード。
補完機能付きのエディタ使ってないのに、
使い捨てのローカル変数にこんな長い名前つけてて、なんともご苦労様なことで…
あ、関数名が(動詞+目的語ではなく)目的語+動詞になるのもへたくそっぽくない?
0214側近中の側近 ◆0351148456
2008/04/17(木) 23:39:17で、コードコンプリートってどうなの?名著なん?
0215デフォルトの名無しさん
2008/04/17(木) 23:40:09#define UC unsigned char
0216デフォルトの名無しさん
2008/04/17(木) 23:45:54ネタ帳から貼ったの忘れてたよ。
0217デフォルトの名無しさん
2008/04/17(木) 23:51:58名前もあれだけど、なんでtypedefにしないんだ。
0218デフォルトの名無しさん
2008/04/18(金) 00:02:48>補完機能付きのエディタ使ってないのに、
こういう人たちは補完を使わない=出来る人間だと思ってる節がある。
全員分IDE買ってんのに「自分はEditor派なんで」。
・・・しかも当然遅い。
0219デフォルトの名無しさん
2008/04/18(金) 00:11:02実際にはそれはプロジェクトのヘッダファイルに入ってるんで、
それはまた別の困ったちゃん。ちなみに>>171w
まあ、typedef知らないんだろうと思うよ。
そういえばconstやstaticも使ってなかったな。
0220デフォルトの名無しさん
2008/04/18(金) 00:13:34絶対読まなきゃ、というほどではないにしろ、読んでおくほうが望ましい。
ちゃんとわかってて読めばいい本ですよ。
0221デフォルトの名無しさん
2008/04/18(金) 00:22:37女の陰口のようだ
0222デフォルトの名無しさん
2008/04/18(金) 00:34:52#ifdef GLOBAL_VALUE_DEFINE_XXX_COMM
// グローバルを作る
#define GLOBAL_XXX // GLOBAL→空白に変換
#define GLOBAL_XXX_VAL(v) =(v) // GLOBAL_VAL(数値)→(数値)を設定する
#else
// グローバルを使う
#define GLOBAL_XXX extern // GLOBAL→externに変換
#define GLOBAL_XXX_VAL(v) // GLOBAL_VAL→削除する
#endif
GLOBAL_XXX SomeStructAaa varAaa;
GLOBAL_XXX SomeStructBbb varBbb;
GLOBAL_XXX SomeStructCcc varCcc;
...
ある意味懐かしい感じがする。
0223デフォルトの名無しさん
2008/04/18(金) 00:50:08switch(xxx) {
case XXX: var1 = ...; var2 = ...; break;
case YYY: var1 = ...; var2 = ...; break;
case ZZZ: var1 = ...; var2 = ...; break;
}
0224デフォルトの名無しさん
2008/04/18(金) 00:56:17何でもかんでもって感じで多用されてたらうざいけど、使うこと自体は別にいいかなって思う。
それよりもプリプロセッサのネストが気になるw
0225デフォルトの名無しさん
2008/04/18(金) 01:02:16struct Xyz fooBarBaz[DIM_XXX][DIM_YYY][DIM_ZZZ] = {{{{1,2,3},
// 中略
{7,8,9}},
// 数十行くらい続く
0226デフォルトの名無しさん
2008/04/18(金) 01:12:33struct Xyz {
volatile int xxx;
volatile int yyy;
volatile int zzz;
};
つーか、文法的にはおkなのかなあ?
0227226
2008/04/18(金) 01:24:55それにしたってvolatileはないけど。
0228デフォルトの名無しさん
2008/04/18(金) 01:27:21縦に揃ってたら見やすいじゃん。
一貫性があれば異質な物にも気付きやすいし。
0229デフォルトの名無しさん
2008/04/18(金) 01:30:46const int * p;なら意味あるよん。
規格呼んだわけじゃないけどそれ以外は関数のexternと同じように無視される気がする。
0230デフォルトの名無しさん
2008/04/18(金) 01:39:35うん、だからポインタでないメンバと限定したわけだ。
(PODな)構造体のメンバがint * const memberとか宣言されてたらおかしいでしょ。
0231デフォルトの名無しさん
2008/04/18(金) 02:38:10case hoge: の後が一文(特に代入だけ)の場合、
俺も改行しないで列挙するなぁ。複数の文はさすがにアレだけど。
0232デフォルトの名無しさん
2008/04/18(金) 03:14:020233デフォルトの名無しさん
2008/04/18(金) 08:14:11三項演算子の一種であるので
C言語の場合ほぼイコールだけど
0234デフォルトの名無しさん
2008/04/18(金) 08:23:39>(PODな)構造体のメンバがint * const memberとか宣言されてたらおかしいでしょ。
別におかしくない。
初期化で値を設定して、その後変更するつもりがないメンバだろ?
0235デフォルトの名無しさん
2008/04/18(金) 14:26:49そのコードに必要だったかどうかは実物見ないとわからないけど、
一般論で言えば意味あるに決まってんじゃん・・・
割り込みで変更される可能性のあるメンバとか、
メモリマップトIOのアドレス範囲を構造体で定義するとか、
マルチスレッドで他スレッドからもアクセスされるフラグ的なものとか、
そんなときに使う。稀といえばまれか・・・
案外モノ知らない人多いんだな〜。
>>230
そのメンバには書き込んで欲しくないというときには、どう宣言せよと?
0236デフォルトの名無しさん
2008/04/18(金) 18:35:17226が遭遇した事例では、メンバに付けるよりも
構造体の変数を宣言するときにvolatile付けるほうが適切だったんだと思う。
0237デフォルトの名無しさん
2008/04/18(金) 18:55:49volatile習いたてですか?
0238デフォルトの名無しさん
2008/04/18(金) 18:59:58>つーか、文法的にはおkなのかなあ?
こんなこと書いてるし。
いや、「見かけたことはある」という程度には知ってるのか。
0239デフォルトの名無しさん
2008/04/18(金) 19:13:37カーネル内のコードやら aKode やら山ほど出てくるね。
なぜポインタにしか使わないとかそういう誤解があるんだろう。
0240デフォルトの名無しさん
2008/04/18(金) 22:49:14それだと今度は宣言する人が付け忘れちゃう可能性がなくない?
0241デフォルトの名無しさん
2008/04/18(金) 23:14:01ISO/IEC 9899:1999 6.7.3.3
The properties associated with qualified types are meaningful only for
expressions that are lvalues.
ISO/IEC 14882:1998 3.9.3.2
A compound type is not cv-qualified by the cv-qualifiers (is any) of
the types from which it is compounded.
つまり、メンバにいくらconst/volatileを指定しても、
構造体全体としては指定されてないのと同じということだ。
仮にメンバごとにアクセスする時だけconst/volatileの効果があるのだとしても、
構造体まるごとで操作した時にその効果がなくなるなら、全然意味ないじゃんって話。
で、全メンバに同じCV修飾子をつけるなら、構造体自体を修飾したほうが素直だろってこと。
もっとも、const/volatileは文法的には型に対する修飾子なので、
メンバの宣言に使っても文法上は間違いではない。
記憶クラス指定子のように、オブジェクトに対する指定を行なうものだと
考えるのがわかりやすいかな。
>>230,234
C++のクラスならおかしくない。が、そういうconstメンバはコンストラクタでしか
設定できないから、CやC++のPOD型で指定するのはおかしいって話。
0242デフォルトの名無しさん
2008/04/18(金) 23:14:02おれほとんどあてはまってる
みんなごめん
0243デフォルトの名無しさん
2008/04/18(金) 23:21:26メンバ変数にアクセスするときに効果があるんだったらそれでいいんじゃないか?
0244デフォルトの名無しさん
2008/04/18(金) 23:31:120245デフォルトの名無しさん
2008/04/18(金) 23:47:460246デフォルトの名無しさん
2008/04/19(土) 00:56:14abs(A++);
行ったり来たり...
0247デフォルトの名無しさん
2008/04/19(土) 01:00:05行数が少なくなる事で各メソッドの全体像を一瞥しやすくなる。
文字数はあまり関係ない。新規行および不具合のある行についてのみ横方向に解析するので。
{}がないことで処理が1行しかないと判定できる。これもデバッガ使用、机上デバッグ、リファクタリング等の際に有効に機能する。
システム保守等で取り扱うコード量が増える程この手の基本的な書き方が重要になってくる。
0248デフォルトの名無しさん
2008/04/19(土) 01:04:05これは何?
意味分からない
0249デフォルトの名無しさん
2008/04/19(土) 01:20:450250デフォルトの名無しさん
2008/04/19(土) 01:33:58>{}がないことで処理が1行しかないと判定できる。
{}が無いのにうっかり処理を2行書いてしまった部分を見逃す危険性は無い?
0251デフォルトの名無しさん
2008/04/19(土) 02:03:55このセミコロンは下に打っておかないと
1行追加するとき見逃す可能性があると思う
for ()
;
こんな風に
0252デフォルトの名無しさん
2008/04/19(土) 02:22:23処理をうっかり2行書いてしまった部分は変更を加えたのだからテスト対象になる。
また見逃してしまうようではシステム保守を担当できるスキルまで達していない事になる。
そもそも局所的にしかコードを把握していないようではシステム保守を任せることができない。
■ このスレッドは過去ログ倉庫に格納されています