この会社辞めようと思ったソースコード。
プログラマとして幻滅するソースコード。
プログラマを悩ませるソースコード。
ぬるぽ。
をつらつらと綴っていって頂戴。
ちなみにここは質問スレじゃないので
技術的な質問がしたいならム板に逝って gets()。
おまいらよ、これ↓を色紙に墨汁で書いて、
社訓として壁に貼ってもらうよう、社長にお願いしろ!!
有名人・大会社社長………一流人
成功者・研究者……………エリート
管理職・渉外職……………できるやつ
SE・営業マン……………平均的社会人
PG…………………………ハナクソ厨
フリー・シェア作者………ウンコパンツ
教えて君……………………ウジパンツ
>>1 乙〜。
>>4 >教えて君……………………ウジパンツ
これは同意。
7 :
仕様書無しさん:04/05/15 10:25
ある程度規模が大きいプロジェクトだと
クラス名やメソッド名、変数名をコード体系で命名し管理するのは一般的なのでしょうか?
新人のころはカルチャーショックを受けていましたが
たしかに何千ものクラスを扱うにはコード体系のほうが合理的なのかとも感じる。
AAAUp011001, AAAUp012013, AAAEx012999 クラスとか。
システム+種別+大分類+中分類+小分類で管理。
Sunのコーディング規約は読んだか?
パッケージが何のためにあるか理解しとるか?
それはインテリジェントコードと呼ばれるコボラ文化。虫唾が走る
名前の衝突を回避すべきなのはクラス名だけ
namespaceを使えば良いだけ
10 :
仕様書無しさん:04/05/15 10:49
>>7です。
>>8,
>>9 あっ、これC++です。
namespaceもコード体系になっています。
とにかくプロジェクトの規模が巨大で末端のプログラマは全体が見えません。
プロジェクト開始日が20世紀です。まだ一度もリリースされていません。
>>10 >プロジェクト開始日が20世紀です。まだ一度もリリースされていません。
今までの給料は一体何処から湧いていたんだ?
たぶん我々の税金から・・・
そんな巨大プロジェクトなら名前バラしても君の正体は分からんから、どんなプロジェクトか言ってみ。
14 :
仕様書無しさん:04/05/15 14:59
5年以上も一度もリリースされることなく続くプロジェクトってありえないだろ。
ゲーム開発では知ってるけどな。
Σプロジェクト Ver2.0b って感じだな。
>15
……雪?
>>10 C++になったのに昔のやりかた以外考えられない糞COBOLerが体系決めたんだね
何に対して合理的なのかを冷静に考えよう
俺んところもそういう感じ。
「経験豊富なSEが設計段階からきちんとやるんで大丈夫です」
経験豊富なのは旧システムのCOBOLの方で新システムで使うJavaは未経験ですかそうですか。
20 :
仕様書無しさん:04/05/16 22:57
結局はCOBOL。
22 :
仕様書無しさん:04/05/17 13:59
ソースのコメントに、そのときの心境を書かないで下さい。
読んでてつらいです。
ついでに、AAもつけないで下さい。
#Define { BEGIN
#Define } END
arienai
#define INTEGER int
#define CHARACTER char
26 :
仕様書無しさん:04/05/18 21:49
#define PIC9 int
#define PICX char
#define FILLER char
#define ENTRY main
28 :
仕様書無しさん:04/05/18 22:19
コピペしてから修正したような類似のコードだらけ。
不必要な処理がいろんなところに入っている。
ひとつのファイルに詰め込んでいる。
でもソースコードだけなら、修正するだけで済むからまだいいほう。
前任者が、ろくに仕様を詰めず、いつまで経ってもできなかったという話しで、
途中でバトンタッチされたソースだから、ほとんどできていないのといっしょの状態。
もっと驚きなのは、その前任者が今もプロジェクトにかかわっていること。
いつ辞めようかいな。この4月に入社したばかりなんだけどね。
public:
int m_flg;
if(m_flg == 0) {
...
31 :
仕様書無しさん:04/05/19 00:25
Defint A-Z
>>28 >前任者が、ろくに仕様を詰めず、いつまで経ってもできなかったという話しで、
>その前任者が今もプロジェクトにかかわっていること
こんな香具師が生き残ってる会社など、ろくな場所じゃない。
だが、今辞めるのは、君の経歴上、あまり得策じゃない。
2〜3年がんばってから転職しな。
たぶん、その方が給料も上がる。
糞コードに呑まれないように気を付けてな。(w
>>32-33 ありがとお。
でも俺、もうすぐ34歳だから転職は無理かもねw
前スレがまだ 20 レス余ってるので埋めてくれ
>36
981まで行ったからもうdat落ちしてるよ。
すまぬ、漏れが見ていたのは IE のキャッシュだったようだ。
>>34 ΩΩ Ω<な、なんだってー!
年下前提で書いていた自分に orz
40 :
仕様書無しさん:04/05/20 15:14
どういう愚痴ならベテランレベルなんだか
>>34 よかった。年下だ
仕様を確定した後に、書きなおしをお勧めする。
修正するより書きなおししたほうが早いだろ?
歳の差なんて関係ないさ
13歳前後がストライクゾーン
いや、15〜17歳が
いまとあるプロジェクトのメンテをしているんだが
定数宣言がいいかげんなんだよ
VB.NETなんだがDBからとってきた値をインデックス指定で取得しているんだが
まったく定数可されていないから激しくわかり難い
そのくせスプレッドのヘッダ文字列とかが変に定数化してあって笑える
SPD_COLUMN_22 = "番号"
みたいな
普通逆だろ
47 :
仕様書無しさん:04/05/20 22:38
病的システムの保守業務の担当者に任命されてしまった。
そのシステムでRDBを使っているのですが異常者が作ったとしか思えない設計。
・テーブルをエクスプロ−ラのフォルダとファイルとして捉えている。
・テーブル管理テーブルを作り、無理矢理テーブルのツリー構造を作っている。
・プログラム内で create/drop table しまくっている。
・1テーブルに1件のデータ。
辞めたい。
なんかそこまでいくとある意味才能を感じるんだが
どうしてその発揮方法をまちがえてしまうんだろうか。
そのシステム、見てみたいぞ
> ・プログラム内で create/drop table しまくっている。
> ・1テーブルに1件のデータ。
イイヨーイイヨー
コウバシイヨー
きっと、前保守担当が心労で入院したか逃げたんだろうな。
>>47 「やり過ぎ」を通り越してますなぁ。
すごいとは思うけど、あまり関わりたくない
>>47 これが生命維持装置管理システムとかだったら激萌え。
つーか、逃げるしかないとおも。
56 :
仕様書無しさん:04/05/21 00:11
COBOLer が「ファイル設計」と称してRDBのテーブル定義をしているが、
やりたいのは
>>47みたいなことなのかもしれない。
余談だがこないだ出てきたテーブル定義書がこんな感じだった。
レベル
01 キー項目
02 FooID X
02 BarID X
02 データ項目
02 BazValue 9
02 ……
RDBだぞ。「レベル」って何だよ。
>56
ちょうど今、それとよく似たテーブルを持つ不治痛製アプリ群をテストしてる。
一部全く動かずテストが進まねぇ…
>>47 でもOracle Filesとやらを使うときに流す
Oracle提供スクリプトも
覗いてみるとそれと似たような動きだったぞ
RDB側だけで全てをこなそうとしたときに陥りやすい現象ですな。
>>56 テーブル一枚に無理やりツリー構造を放り込もうとしていたのでわ。
普通に良くある糞設計。
>56
俺も不治痛の仕事でそういうのあったな。
Javaなのにデータ定義にレベルが書いてあって、
意味わからなくてかなり悩んだ。
COBOLが生き残ってるのはまぁ良いとして。
COBOLしか理解できないヴァカはさっさと氏ねよ。
>>56 DATA DIVISION.
WORKING-STORAGE SECTION.
とか書いてない?w
64 :
仕様書無しさん:04/05/21 21:11
巨大なクラスが1つしかないよ。メンバ変数/関数が大量。 そのせいでコードヘルパ機能が重すぎ。
常日頃「goto なんてぜってー使いたくねーよな !」といってる人間の
ソースを見た。
そしたら、
while (1) {
...
if (...) {
// エラー発生
break;
}
...
// 正常終了
break;
}
っていう記述が山のように...
この人は、goto によって処理の流れが汚くなるのがいやなんじゃなくって、
きっと goto という文字を見るとじんましんかなんかが出るから goto を
使わないようにしてるんだろうなって思った。
ム板の「gotoを使う〜」のスレを見てればよかったのにな。
>>65 同じ香具師はおれの周りでもよく見かけるよ。
カッコイイから言ってるだけかとも疑うのだが、
この前すこしかわった別の言い方してる香具師に出会った。
「ほら!ここにgoto使ってるでしょ!!見てみて!」
見てどうするというのだろうか・・
>>65 こんなのならよく書くけどなあ…ダメ?
BOOL result = TRUE;
while(result){
result = dosomething();
}
...
BOOL dosomething(){
//...
if(...){
return TRUE;
}
//...
return FALSE;
}
RESULT dosomething(){
//...
if(...){goto error;}
//...
if(){goto error;}
//...
return OK;
error:
handleError();
return NG;
}
こんなのも良く書くなあ…
goto何が何でもダメっておかしくない?
例えばC++やJavaなら例外使う場面で、gotoよく使うけどなあ・・・
うちも while(1)+break+continue のスパゲッティプログラムに
悩まされてるよ。_| ̄|○
>>69 >goto何が何でもダメっておかしくない?
禿同。
タコな使い方の goto なら「こんな事で goto 使うな!」と言いたくなるが、
使うべき所に使うのは問題ないかと。
ダイクストラが「なにもgotoが絶対にダメだというわけじゃない」
と言ったって……みんな知ってるよな? な?
do { } while(0); ならたまに使うことがあるな。
C++だと、goto 文の後で non-PODなクラスの自動変数の宣言が
できなかったりするし。
74 :
仕様書無しさん:04/05/22 00:43
getValue()って名前付けたら怒られた。
SYSF001ZA017()ってな感じの名前に書き換えさせられた。
深いネストを関数に切り出すのは、リファクタリングの最初のインポ。
>>75 単体で使えない関数を無駄に作ってそうだな。
>>77 外部に開かれないスコープであれば無問題。privateメソッドなんて
大抵そんなのバッカ。
>75
不能にしちゃダメだろ。
80 :
仕様書無しさん:04/05/22 01:38
>(大なり)と >=(大なりイコール)の使用禁止。
<(小なり)と <=(小なりイコール)で統一。
if (a >= 1 && a <= 100) // だめ!
if (1 <= a && a <= 100) // こう書け!
>>80 個人でポリシーもってやるのはいいとして
他人に強制されたくないな。
>>80 if (1 <= a && a <= 100)
という主張は何となくわかる気がする。
それよりもちょっと聞いてくれよ、うちで作ってる
自称「カスタマイズ性に優れたDBアクセスルーチン」ですよ。
メソッドが
void insert(String tablename, String key);
void update(String tablename, String columnname, String value);
void delete(String tablename, String key);
これ。例えば
INSERT INTO TheTable
(ID, NAME, INSERTDAY) VALUES
('A0001', 'この会社辞める', '2004/05/22)
を実現するには
insert("TheTable", "A0001");
update("TheTable", "NAME", "この会社辞める");
update("TheTable", "INSERTDAY", "2004/05/22");
こうしろと。ちなみに数値の列に数値扱いできない値を
updateした場合なんかのエラーは、呼んだ側からは
一切判定できないという諸刃の剣。
素人でなくともお勧めできない。
>>82 NOT NULL制約が複数あるテーブルが使えないような気がするけど?
>83
きっとそんなテーブルは「汎用的でない」から作らないんだよ(つ´д`;)
>>80 その規約作った人の気持ちも分からないではない。
個人的には右辺の値を基準に、
左辺の内容を評価するポリシーでやってるけど
>>80直感的に分かりやすそうだからこっちに変えようかよく悩む。
>>80これ、上のほうが見やすいと思う人っているの?
とりあえず他人が見ることを考えたら下にするだろう。
漏れも(変数名が長いとかで)見にくくなる場合以外は下だな。
ただ、規約にまでするのは確かにどうかと思うけど。
updateは
void update(String tablename, String key, String columnname, String value);
で
update("TheTable", "A0001", "NAME", "この会社辞める");
の間違い。
で、もちろんNOT NULLなんて存在しません。
あと複数列でキーになるようなのも当然だめ。
>>80 辞めようと思う程抵抗はないなぁ
言われたら「あーそうっすか気ィ付けますウィッス」ぐらい(←?)
ちなみにSQLerの先輩はbetween(var,min,max)な関数作ってたが
案外正解なのかも
DBアクセスするのにいちいち共通関数つくる会社多そうですよね
DBサーバーの負荷は考えずに処理のモジュール化ばかりを考える
あまり長くなく負荷をあげないものならよいのですが
大規模になったらDB負荷でダウンしそうなプログラム
DBのパフォーマンスの勉強はしないのか
まあ大規模なシステムを作っている会社なら
DBのパフォーマンスや整合性の方ほうを重視していると
思いますよ
91 :
仕様書無しさん:04/05/22 11:22
javadoc使用禁止。
自社製品のドキュメントジェネレータを使えと。
そのジェネレータが識別するための識別子をクラス名やメソッド名に埋め込めと。
識別子を入れ忘れたソースから生成したドキュメントを開くとコンパネが開く。
privateコンストラクタを使うとジェネレータがハングアップするから使用禁止。
こんなとこか。
>91
スゲー
>>91 せめて、ジェネレータを直せよ!!
と、とりあえず突っ込みたくなるな。
>>91 >識別子を入れ忘れたソースから生成したドキュメントを開くとコンパネが開く。
なんだよこれ・・・
95 :
仕様書無しさん:04/05/22 12:54
>>91です。
この自社製ドキュメントジェネレータ、Java版で33万円!
自社製のドキュメントビューワが付属。というかこれを使わないと見れません。
>>82 1つのSQLで済むところを3つのSQLを実行するの?
動作がかなり遅くなるな。
うちみたいにソースの可読性よりも速度を優先するのも
作って保守する人間としては大変だけれど。
>>91 >privateコンストラクタを使うとジェネレータがハングアップするから使用禁止。
Mathクラスのような、staticなメソッド群は作るなってことかw
>>97 メソッドは public void 以外禁止の悪寒w
引数の型は String[] の嵐ですか?
>>95 そのドキュンメントジェネレーターとやらの売上額が知りたいものだ
>101
>95 には「Java版33万円」と書いてある訳だが、社内専用のソフトに
価格がついているもんなの?
社内のほかの部署に売りつけるのか?
まぁ部署ごとに独立採算制の会社ならわからなくもないが。
Javaで
private void xxx() throws IOException {
try {
なんか処理;
} catch (Exception e) {
throw new IOException()
}
}
だれだこんなソース書けって教えた香具師はよ。
全例外処理がこうなってた。鬱・・
104 :
仕様書無しさん:04/05/23 13:10
どっかのソース見て意味もわからず真似し続けることってよくある。
新人とかいる場合には、例外処理方針とか事前にちゃんと打ち合わせとけ。
>>102 厳密な独立採算でなくても、部ごとに予算ってものがあるから。
まあ、社外にも販売しているけど、実質社内のみというやつじゃないのか?
やめたくなる、というわけでもないのだが、おかしなソースを発見。
int
function(object_t *obj)
{
obj->name = "hoge";
memcpy(obj->foo, bar, sizeof(hage));
/* その他obj を使った一連の操作が続く.... */
assert(obj);/* !? */
return 1;
}
そのassertは何?
operator bool()にすごい仕掛けが仕組んであるに一票。
object_t* に operator bool() は無理だろ。
109 :
仕様書無しさん:04/05/23 15:13
多分、テンプレで最初にこんな関数を一括作成すんじゃない?
int
function(object_t *obj)
{
assert(obj);
return 1;
}
その後、担当者がしこしこコードを追加していく。
でもたまたまコードを書く場所を間違えちゃってassertの前に書いちゃったと。
110 :
仕様書無しさん:04/05/23 15:15
その他obj を使った一連の操作の途中でobjに間違って0を代入するのを
防ぐためw
単にコピペミスに10000assert
>>109 たぶんそのパターン。
しかし、今見返したら同じパターンの関数が3か所。
まぁ、何も言わずに直しておいてやろうッと。
実は
>>110が正解だったらやだなぁ。
あぁ、俺の休日はいづこへ…。
>>112 まぁ、何も言わずに直しておいてやろうッと。
言ってやれよw
VB6使ってんだけど、変数がすべてpublicで宣言されてて頭クラクラ・・・
ちなみに後にメンテする香具師が分かりづらいと言う理由で、クラスとか構造体とかは
極力使用禁止・・・
---
W_S_契約日 = 20040606 '' ←ここと
W_S_契約期間 = 204 '' ←ここに値を積んで
Call 契約満了日取得() ''←この関数を呼べば
Debug.Print W_S_契約満了日 ''←ここに値がセットされている
---
このほうが判りやすいじゃんと反論されてしまいますたが・・・
>>114 VBは関数に引数を渡せないし、戻り値も返せない言語だったんですね!
ところで反論した香具師が得意な言語は何?
>>115 COBOLデスヨ・・・
まあ、場合によってはpublicで宣言した方がいいケースもあるだろうけど。
プロジェクト自体が「COBOLしか知らない人でも読めるVBソース」で書くことがテーマに
なってるという、冗談のようなプロジェクトだから・・・
117 :
仕様書無しさん:04/05/23 20:54
/* ==== ここまで読んだ ==== */
/****** 読む価値無かった ******/
/* ここから先はコメントです
コメント終了です */
やめたくなるほどじゃないけどかなり脱力したソース。(Java)
for(int i = 0; i < hogeList.size(); i++){
HashMap hogeMap = (HashMap) hogeList.get(i);
String nanika = (String) ((HashMap)hogeList.get(i)).get("nanika");
String doreka = (String) ((HashMap)hogeList.get(i)).get("doreka");
(以下延々と続く)
}
Map の変数の立場は・・・。
↑ きっと後で使おうと思ってたんだよ・・
オレが見た脱力系コード
void hage()
{
//* リリース時はこのコードを生かす*/ hogehoge();
/* デバッグ時はこっち */ hoge();
}
ってなコードがあった。リリース時にコード修正させんな・・・
どっちが生きてるかマジ分かりくい。
if (A == VAL){
hoge(A);
}else if (A == VAL){
huga(A);
}else{
if (A == VAL){
return A;
}
}
bool a = isA();
if (a == true) {
return true;
} else {
return false;
}
もちろんネタだよね?
ネタだとしたら質が悪い
きっと最初は後始末みたいな処理が書いてあったんだろ
だとしてもなんでリファクタリング(という程度でもないが)しないんだよ、と
>125
ネタでは無いと思う。
以前他人がそう書いているのをツッコミ入れたら、リーダー以下メンバー全員に
「こっちの方が見やすい」と言われ、以降それが規約になった。orz
数こそ力か……
まぁ生` > 127
ネタじゃない。
>>127おんなじ感じだな…
ちゅうか、後始末が入ってたとかそういうんじゃなく、
みんなとっても自然に普通にこんなふうに書くんだよ…
>>127 >以前他人がそう書いているのをツッコミ入れたら、リーダー以下メンバー全員に
>「こっちの方が見やすい」と言われ、以降それが規約になった。orz
>>129 >みんなとっても自然に普通にこんなふうに書くんだよ…
ぐは、マジですか・・・
俺のグループでこんなん書くのがいたら、
「もう一回 C の入門書読んでこい !!」
っつーとこだぞ。
行数稼ぎ方法にしても、低質だなぁ。
一行で済むところを六行も書いて。
>>131 なんというか、目的や意図があってこうしてるんじゃないところがみそだ。
isA()がなにか例外を吐く可能性のあるときは1行目は書いたほうがいいことも・・
いや、ないな。
boolean返す関数が例外なんか投げちゃいけません。めっ。
>134
いかなる場合もtrue吐き出すより良いと思うのですが。
病んでますか?私
も一つネタ投下。
フツー for を使って書くようなコード(単純にn回ループとか)を、何故か while 使って
書いてるヤシがいたのでその理由を聞いたら、
「for は(式を横に並べて書くから)見にくくて嫌」
だとさ。
まぁ ; で区切る辺り、昔流行ったスパゲティコードを彷彿とさせるのかもしれんが。
そういう新人がいたよ。そいつは言語教育担当にそういう刷り込みをされていたからだったんだが。
「反復回数が計算可能ならforを使え」って何度言ったことか・・・
whileのほうがforより小さい。だから「中に入ることが確実」な場合に承知で使ったならエラいが
新人じゃ単に刷り込みだろね。
>>123 もしこれが一つの関数なら、
この関数の存在自体が不要だな。
# 素直に isA() を呼べば最もわかりやすく、かつ短く済む
>>139 private:
foo m_hoge;
bool a = m_hoge.isA();
これがサンプルの時点ではしょられたと思いたい…
つかさ、この例の最大の問題って、
if (a == true)
この条件判断文じゃねーのか ?
C++かC99なら問題ないんでない?
>>123 会社じゃないが、ついさっき同類を発見したばかりだ。
『C++ Builder6 コンポーネント活用ガイド&実践プログラミング vol.1』の252ページ。
void __fastcall TForm1::Panel1DragOver(TObject *Sender, TObject * Source,
int X, int Y, TDragState State, bool &Accept)
{
TLabel* theLabel = dynamic_cast<TLabel *>(Source);
if (theLabel != NULL) {
Accept = true;
} else {
Accept = false;
}
}
>>144 これはぎりぎりセーフじゃないの?
Accept = theLavel != NULL;
はちょっと抵抗あるぞ
これぐらいなら最適化も効きそうだし
指摘個所は無駄な引数の方か?
Accept = ( theLabel != NULL ) ? true : false;
とか
Accept = theLabel ? true : false;
では?
>>146 やめてくれ
>>136 Iteratorは遅いから使わないほうがいい、て人ならいますが。
>>144 同類なのか?
漏れには別物にしか見えないが・・・
>>147 やめない(w
>Iteratorは遅いから使わないほうがいい、て人ならいますが。
OOPL使っている人ばかりではないぞ
>>147 イテレータが遅いわけがない。って、C++じゃあないのか?
# 遅いイテレータもあるが、遅いとゆより、しかたのないこと。
もっと明確に述べてくれたまい。
ちゅーか遅いイテレータなんて使い道無いやん。
あ、違った。遅いイテレータを持ったコンテナの使い道が無いのか。
コードの話してるのに・・・
デザパタ厨は来るな!
>153
いや、C++ STLのIteratorの話だと思うんだけど……
これがカタカナでイテレータ、と書いてたらRubyかなと思うんだが。
どうでもいいがnamazu.orgが凄いことに……
ねらー以外にあの文字列の意味が分かる香具師いるのか?
それともまさかクラッ(((;゚Д゚))))ガクガクブルブル
>>155 ん?臨時メンテ中でorzになってますた。
何が有ったん?
159 :
仕様書無しさん:04/05/27 14:53
141,144 と他の人の論点がずれてて面白い。
漏れも if( theLabel ) で良いと思うけど、変数の型が解り易い様に比較対照を
明示しろっていう人もいるかも知れんな。
>155
スラドにハックされたと書いてあったぞ。
も○ら組もヤラレタとか。
>160
あり。そうだったんか……
でも「orz」はマジダッタノネ(゚∀゚)アヒャ
162 :
仕様書無しさん:04/05/28 09:25
最近、ソースコードの保守ばかりの毎日にうんざりしています。
特異なソースコードのため得られるものも少ないです。
今は、COBOLチックなJavaやっています。
こんな状況下で仕事に対する面白さを見出すにはどうしたら良いでしょうか?
新規開発ばかりはないと思いますが。
>>162 大変失礼だが、なぜそういううんざいするような仕事に回されるのかを
真剣に考えたほうがいい。
うんざい
〔「有財餓鬼(うざいがき)」の略「有財」の転〕人をののしっていう語。まぬけ。
なるほど。勉強になりました。
165 :
仕様書無しさん:04/05/28 11:30
164=162なら、何故汚れ仕事を押し付けられるのか明快だなw
会長様の顔写真が240*320ピクセルのサイズで
常に最前面表示される社内アプリ。
画面サイズが1024*768なので激しく邪魔。
>>167 フリーソフトで最前面になっているのを非最前面に変えてしまえ。
169 :
仕様書無しさん:04/05/28 17:38
>167
竹藤?
170 :
仕様書無しさん:04/05/29 11:14
m_mode = 0;
if (...) m_mode = 1;
...
if (m_mode != 0){...}
else{...}
こんなソースがあった(インデントは略してる)
m_mode = 0;
if (...) m_mode = 1;
if (...) m_mode = 2;
...
switch(m_mode){
case 0:{...} break;
case 1:{...} break;
case 2:{...} break;
}
項目が増えたのでこう書き直した
でも、何度やってもcase 2にとばない
1日格闘した結果わかったこと
bool m_mode;
さらに、CVSで調べたら半年前の俺のソースだった…
>>171 つーか、直した後のソースも最悪だな。
そういうのはジャンプテーブル使えば格段にスッキリする。
>>171 「case 2にとばない」と思った時点でトレースできれば10分で終わっただろうに。
>>173 ジャンプテーブルってのが良くわからないんだが、
良ければやり方教えてくれ
C++って、ラベルを配列でもてるのか?
関数配列するとローカル変数参照できないし、
引数渡しだと、引数10個ぐらいくっつける羽目になるんだが
関数ポインタ覚えたてで使ってみたいんだろ。
3分岐しかないのにジャンプテーブルね...
173の発言は、switch文の存在自体を否定してるも同然
なのはいいとして
boolに0やら1やら入れるのがバグの原因だろ・・・
>>177 ジャンプテーブルなんて簡単なのに、面倒くさがるあんたの思考の方がよくわかんねぇ。
条件増える度にソースコード増やすの?テーブル増やすだけの方が簡単に決まってるよ。
つーか、ジャンプテーブルにするか、switchにするかは
ケースバイケースだと思われ。
switchでの処理の中身分からないと、どっちがいいなんていえないでしょ。
ジャンプテーブルぐらい入門書に載ってそうなモンだけどなー。
int func1(void)
{
return 0;
}
int func2(void)
{
return 0;
}
int func3(void)
{
return 0;
}
staticint (*func[])(void)=
{
{func1},
{func2},
{func3},
};
で、iが1の時にfunc1()、iが2の時にfunc2()、iが3の時にfunc3()を呼びたければ
func[i]();
とするだけ。switchより簡単だろ?
>>182 だから、そこまでコストかけてやるものなのかは、switchの中見ないと
なんとも言えないって話だよ。
分岐が数パターンのうえ、中身が数行、仕様が決定して将来分岐が
追加されることが無いってのだったら、そんなの大げさじゃん。
え、あそうなの。ごめん。
>>182 誰もジャンプテーブルの解説してくれとは言っとらんわ。
つーか、
> staticint (*func[])(void)=
> {
> {func1},
> {func2},
> {func3},
>
> };
>
> で、iが1の時にfunc1()、iが2の時にfunc2()、iが3の時にfunc3()を呼びたければ
>
> func[i]();
思いっきり間違ってまんがな。
俺の周りにも似たようなのが居るな。
いわゆるデザインパターン厨って奴で、無意味にStateパターンとかを使いたがる。
でも、こういう凡ミスによるバグが多くて、使えねえ。
>>184 おお、すまん。
> 誰もジャンプテーブルの解説してくれとは言っとらんわ。
この部分については間違ってた。
>>182 誰もそのジャンプテーブルがわからんなどとは言ってない…
難しいから使わないとも言ってない…
>>186 あのー、インデントのミスってswitchじゃ起きない、と電波な事が言いたいわけ?
インデント確かにミスったが、それがswitchを使ったせいか、ジャンプテーブルを使ったせいか。
オレには、ジャンプテーブルを使ったせい、などとは口が腐っても言えない。
あんたの脳内でとてもオモシロ電波な論理があって、switchではインデントミスが
100%起きないってのなら、納得しないでもないが……そんな論理無いだろ?
アレルギー早く治して、公平に物事を見る目を養え。
For i = 1 To 3
If i = 1 Then
処理1
ElseIf i = 2 Then
処理2
ElseIf i = 3 Then
処理3
End If
Next
だれか何がしたいのか教えてくれ…
switch 文内の case の分布の仕方を見て実質ジャンプテーブルに
展開するくらいは、今日びのコンパイラは普通にやりますが。
195 :
仕様書無しさん:04/05/29 21:32
つか、switch 文って、もともとその実装の詳細をコンパイラに委ねて、
それをジャンプテーブルにした方が良さげな時には、コンパイラがちゃんと
ジャンプテーブルを作ってくれる、という事を期待して書くものじゃないのか?
>>199 今、試しにDigital Mars C/C++ Compilersでコンパイルしてみたが、
staticintのtypoと、インデントミス以外はちゃんと動いてるみたいだけど……
どこがミスってるの?
つか、関数テーブルにこだわるだけでswitchの使いどころを
しらない原理主義者は、相手にする必要なし。無視スレ。
>>202 > で、iが1の時にfunc1()、iが2の時にfunc2()、iが3の時にfunc3()を呼びたければ
>
> func[i]();
>>195 普通、どう展開されるのかを気にするより、ソースコードの量及び可読性、メンテナンスのしやすさを論じるのでは
switch 使った方が妥当だと思われるケース。
switch( n ){
case HOGE: case MOGE:
hoge( n );
break;
case SAGE:
sage( n );
break;
}
こーいうのをジャンプテーブルで書くと、イマイチ美しくない。
>>205 インデントミスをインデックスミスと読み替えてやろうよ……
訂正。
sage(n) -> sage( );
>>182 まだわからんのか?
> で、iが1の時にfunc1()、iが2の時にfunc2()、iが3の時にfunc3()を呼びたければ
> func[i]();
iが0のときはどうなるんだ?
つーか、iが-1や999のときに〜を実行したい、なんて要求がきたらどうするつもりだ?
俺的には、
>>171のコードは
#define M_MODE_HOGE 0
#define M_MODE_FUGA 1
#define M_MODE_PIYO 2
...
switch(m_mode){
case M_MODE_HOGE:{...} break;
case M_MODE_FUGA:{...} break;
case M_MODE_PIYO:{...} break;
}
としておけば十分だと思う。
あほでした。逝ってきまつorz
思いっきりスレ違いな論議してる時点で、両者逝って良しなワケだが
>>206 >>195 の論拠
・case の後には定数しか書けない
・break キーワードを書かなければ、下に落ちてしまう
これらは明らかにジャンプテーブルに展開することを意識した仕様となっていると思うが・・・
ただ、条件の種類や数によって、それを展開すべきか否かが変わってくるので
どちらの状況にも効率よく対応できる switch が出来た、と。
>>186 定数と関数のポインタを持ったstructを組んだりするのは、組み込み系では良くある事なんだが……
switch文がそれこそ10000行になったりしてメンテできなくなるんだよね、それ……
多分
>>173は組み込み系か、石の制御か、そこらの仕事をよくしてるんじゃないか、と。
switchより早いし、分岐が多くなるとswitchはメンテできなくなるしね。
最初から分岐の処理は関数化しておくのが定石な分野も多いし
T_FUNC_TABLE funcTable[]={
/* KEY,PARA1,PARA2,func()*/
{ "ABC",C_PARA_1,C_PARA_2,func1},
:
:
}
というソースなら、交換機の世界ではデフォで使われてたりするな。
>>216 誰もジャンプテーブルを*絶対に*使うなとは言っとらんわ。
盲目的に「〜は使うな、〜を使え」なんてことを言うな、と指摘してるだけだ。
何事も適材適所。
で、
>>171のソースだけ見て「switchは使うな、ジャンプテーブルを使え」なんて
言うのはナンセンスだと漏れは言ってるんだ。
5桁の乱数を作る処理
For i = 1 To 5
乱数ジェネレータをシステムタイマ値で初期化
a = a + CInt(Rnd * 9) ' aは文字列変数
Next
r = Val(a) ' 文字列のaを数値に変換
同じ乱数が出来てたら最初から繰り返し
どうにかしてくれ…
>>215 >ただ、条件の種類や数によって、それを展開すべきか否かが変わってくるので
>どちらの状況にも効率よく対応できる switch が出来た、と。
うーん、条件の数が変わるならジャンプテーブルの方が柔軟な気が……
キーが2つのジャンプテーブル
for( i=0 ; i<sizeof(funcTable)/sizeof(funcTable[0]) ; i++ ){
if( funcTable[i].para1 == para1 && funcTable[i].para2 == para2 ){
funcTable[i].func();
return S_OK;
}
}
return S_NG; //見つからなかったYO!
キーが1つの場合の楽なコーディング方法の為にswitchが生まれた、という事なら判るが、柔軟なのはジャンプテーブルだな。
>>219 >誰もジャンプテーブルを*絶対に*使うなとは言っとらんわ。
>盲目的に「〜は使うな、〜を使え」なんてことを言うな、と指摘してるだけだ。
そう書いてあるように見えないです
-1とか999とかの反論なら、
>>221で出来てるのでは。
だれもできるか出来ないかの話はしてないと思われ…
いや、-1とかの話があったからしてないわけではないんだが
突っ込みの大本はそこではないというのは分かると思うが…
そのうち、条件分岐もジャンプテーブルっていいそ
>>220 多分、恐ろしいほど正確な分布の乱数を取りたかったのかな。
見るに5桁の乱数をとりたいんだろうけど、
a = (int)(Rnd/100000);
とすると、intの最大値を2^32と仮定すると
4294967296
で
67296以上の数が出てくる確率が、他の数字よりも1/42949だけ少ない。
……ってRnd使ってる時点で、精度なんてアテにならん……
>>221 違う。
例えば、キーが2個から3個に変わることは頻繁にある。
その時、
「今まで2個だったから if を使っていたけど、
3個だと(このプロセッサ上では)テーブルにすれば1命令分得するから、
実装方法をテーブルに変更しよう」
なんて馬鹿なことをやらない為だ。
>>222 > >誰もジャンプテーブルを*絶対に*使うなとは言っとらんわ。
> >盲目的に「〜は使うな、〜を使え」なんてことを言うな、と指摘してるだけだ。
> そう書いてあるように見えないです
そうか?
> いわゆるデザインパターン厨って奴で、無意味にStateパターンとかを使いたがる。
で漏れの意図は表現できていると思ったんだがなあ。
念のために解説しておくと、「Stateパターンを使う奴はデザインパターン厨だから
使えない」なんて言ってるわけじゃないぞ。
漏れも、*必要とあれば*ジャンプテーブルやStateパターンを使うこともあるし。
> -1とか999とかの反論なら、
>>221で出来てるのでは。
なぜ
>>221が反論になっているのかわからん。
解説してくれ。
>>227 >>195とか
>>215とかの流れからして、その理論は飛躍し過ぎでは。
ただ、元々switchで作っていて、キーが2つに増えるとなると、どう考えてもswitchよりジャンプテーブルのほうが対応は楽だろう。
switchという仕組みでは、どう頑張ってもキー1つしか使えないし(switchを入れ子にすれば出来なくないか。しかしそんなソース、メンテしたくねぇぞ!)
よってその論理おかしい。
>>226 rand()の返す値はRAND_MAXで定義されてて
それは、最悪32767なので
結局一回じゃ5桁は無理かもしれん
で、面倒だから桁ごとに一回にしたんだろ
きわめて正当なプログラムっぽいぞ
>>226 分布を考えるなら、そもそも簡便な実装の乱数関数は、
組にして使うべきではないというのは常識…
それ以前の部分に突っ込みどころ満載なわけだが…
>>228 オレ222じゃないけど、普通に理解したけど……
typedef strucrt {
int key;
int (*func)(void);
} T_FUNC_TABLE;
T_FUNC_TABLE funcTable[] = {
{ -1, funcAAA },
:
{999, funcZZZ },
};
for( i=0 ; i<sizeof(funcTable)/sizeof(funcTable[0]) ; i++){
if(funcTable[i].key == key){
funcTable[i].func()
}
}
って所かな。
>>230 これ、VBのプログラムで、まあ、桁数が足りんからとかそういう理由ではないんだ。
というか、乱数の使い方をそもそも理解してないだよね…
>>233 すまんプログラム良く見てなかった
ジャンプテーブルとごっちゃにw
書いてみて判ったけど、テーブル化ってのは「規模が大きなプログラム」では非常に有効な手なんだろうな。
慣れれば条件が柔軟に設定できる気がする。
判定とテーブルの組み合わせで、かなり柔軟な条件のジャンプテーブルが出来るな。
>>229 すまん、
>>221 の文読んで無意識に "キー" という言葉を使ってしまった。
もっと具体的に書く。
switch(a)
{
case 0: ... break;
case 1: ... break;
}
この場合、実装上は if にした方が早い事が多いが、
switch(a)
{
case 0: ... break;
case 1: ... break;
case 2: ... break;
case 3: ... break;
case 4: ... break;
}
この場合はテーブルにした方が早い事が多い。
このような変更に容易に対応できるのが switch 文。
>>232 おお、そうだな。
よく読まずにレスしてた。スマソ。
ただ、俺的には
> i<sizeof(funcTable)/sizeof(funcTable[0])
ってやるより、番兵を使うほうが好きかな。
>>236 ああ、つまり速度の最適化をコンパイラに判断させる為にswitch文を使う、という事か。
実装志向ですなー。
で、結局
>>206に戻るワケですね。
対応できる、というよりは
コンパイラが勝手に対応してくれる、
と書いたほうが分かりやすかったかな?
それで、ジャンプテーブルより仮想関数がよい
という結論には何年後にたどり着く予定?
いい加減うぜえよ
>>238 で、そこら辺の細かなメンテを switch を使えば
コンパイラが勝手にやってくれるので、
わざわざプログラマが
「ここは if を使うか、テーブルを使うか?」
なんて悩む必要が無くなる。
caseの中身を{...}と書いているワケですが、この{...}が実は60行ぐらい軽く逝っちゃうのは良くある事でして。
処理を内蔵するにはswitchのcaseって文法的に根本からして向いてないんだよね。
switchの悪い点は、まさしくソコで、ソコを無視してswitchを推すのもどうかなーと。
>>220 全桁同じ数字ばっかだよ
9が出ね〜よ
同値が出まくってめちゃパフォーマンスが悪いよ
>>243 その場合、case が2つの時でもテーブルジャンプとなる。
勿論、各関数の引数の整合性も取らなくてはならない。
そして、case が1つ増えて、その関数が引数をもう一つ取らなくては
いけなくなったら、前の2つの関数のプロトタイプも変更となる。
>>182 って、あくまで例え話だよね。本人も実際はやってみてない。
だって、変数スコープの関係で、caseのひとまとまりを関数呼び出しに
機械的にはくくり出せないもん。
実際やろうとする人(それがいいかは別として)はgotoで
実装するのかな。
キーが複数になっても、それらのキーを内部的なスカラー値にすれば、
少なくともネストしたswitchなんて書かなくて済むが
>>247 いや、スカラー値を持つのは、かなりメンテナンス性が悪い。
>>232のソースを書いて思ったのは、そういったメンテナンス性がテーブルだと柔軟に出来そうだという事。
typedef struct{
int *pParameter;
int parameter;
int (func*)(void);
} FUNC_TABLE;
なんてしておくと、例えば
a=2の時はfunc1()
b=5の時はfunc2()
なんてのも出来るでしょ。
switchと比べて云々って話じゃなく、いいテクニックだなと思った。
>>242 > caseの中身を{...}と書いているワケですが、この{...}が実は60行ぐらい軽く逝っちゃうのは良くある事でして。
本当に「良くある事」か?
少なくとも漏れのまわりでは、数行〜十数行ぐらいのものが大半を占めてるがねぇ。
> 処理を内蔵するにはswitchのcaseって文法的に根本からして向いてないんだよね。
漏れが嫌いなのは、そうやって
・caseの中身に何十行も処理を書くのは見通しが悪い。
↓
・そもそも、そういう記述ができるswitch〜case文自体に文法的問題がある。
↓
・ということで、switch文はやめてジャンプテーブルを使いましょう。
と話を飛躍させて、高々数行の処理のswitch文をもジャンプテーブルに
書き換えようとする香具師だけだ。
だるい流れだな
なんか、やっぱり荒れてるというか…
てか、テーブルジャンプに関しては176の下2行に書いてあるとおりだ
全ての原因は、bool型なのにtrue, false以外を代入しているところ
なんでそんなことしているのは半年前の俺に聞いてくれ
.cppばっかり追ってたから、.hに原因があるとは思わなかったし…
あと、func[m_mode]() ってやるよりかは m_modeをvoid *() 型として宣言してやって
m_modeに直に関数ポインタを突っ込んでやったほうがすっきりしないか?
このスレ観てると、うちの会社が平和に思えてくるよ。
ありがと。
> いわゆるデザインパターン厨って奴で、無意味にStateパターンとかを使いたがる。
で漏れの意図は表現できていると思ったんだがなあ。
これは禿げしく同意だな。
ほとんどのケースでStateパターン使わない方がいいって結論になるよな。
デザパタの中では使用頻度の低いパターンだと思うぞ。
>249
柔軟性が高いほど良いって思想はどうかと思うがナ。
無駄な柔軟性は危険を孕む。
例えば>232のソースはそのまんまだと、テーブル書き換えができてしまう。
あと>207,210も指摘してるが、ジャンプテーブルは引数の数が揃ってないと
美しさがイマイチ。
(不要な引数を用意したりすると、後で読んだとき「?」になったり…)
>>255 柔軟性よりも単純さだな。
常にコードは単純に。
Stateパターンの使いどころは、「系」が明確にモデル化できるところ。
状態とパラメータ群の関係が閉じている場合だ。
業務システムでは、adhocなパラメータ制御をやらざるをえない場面が多々ある。
よって、そんなに出番はない。
えっと・・・
どうでも良いことでアフォみたいに言い争ってる香具師・・・・約4名
あきれてる通りすがり・・・約6名
こんなところか?
見てて悲しい論争だw
こんなスレ読むの辞めようと思った……
まあまて、彼らが仮想関数を再発明する過程をじっくり見守ろうではないか。
てか、はじめからそういうスレだと思うが…
スレタイを見ろ。>テーブラーども
switchだとかジャンプテーブルだとかについての
視野の狭い主観的な美意識を基にした他人から見たらつまらんこだわり
それ自体がスレタイみたいなソースを生みまくってる、という事には
奴等は多分一生気付かないんだろうな
たとえ例だろうとそこにコメントが一行も無い辺りに
奴等の腐れプログラムヲタっぷりが炸裂してやがらぁ
↑コメントが無いので
上の話の内容がさっぱり理解出来ず
今、枕を涙で濡らしている香具師
今度はコメントっすか…
次から次へとすげーのが沸いてくるな
コメント必要なのは精々>182,218,221,232 位だな。
他(>207,211,220,236)はコメント要るか?
この程度読めんとPGなんてやってられんと思うが。
…何か見事にテーブル至上派とswitch擁護派に分かれてしまったが他意はない。
「コメントがないから読めない」ってのはそもそも誤り
「わかりやすく書かれていないからよめない」なら正しいが
脊髄反射煽りウゼェ
専門学校に(・∀・)カエレ!!
「俺はコメントなんて要らないし俺の書くコードも美しくて分かりやすいから必要ない だから俺は付けない」
がスレタイを生産してんだよ。
被害者なら加害者になるなよ
>>270 「コメントが無いから読めない」という被害にあったことは無いなぁ
ついでに言うと「わかりやすく書かれていないからよめない」という被害にもあったことが無い。
書きなおすからな
>>271 それでも、元の仕様がわからないから書き直せないってことはあるでしょ?
変な動きするけどバグなのか仕様なのかはっきりしなかったり。
ある機能がオーバースペックの可能性があるけど、削っていいか判断できず、
簡潔なコードに直せないとか。
いや「仕様をコメントとして添えろ」とまでは主張するつもりはないがな。
日曜なので、なんとなくマターリ気分でツッこんでみるわ。
コメントには意図を書くべきだと思ってるんですが
>>272 「元の仕様がわからない」って状態は確かに存在する。ソースしか存在しないような状態ダナ
そういう場合は「元の仕様」と「目標とする仕様」の双方を書く。
その段階で双方の仕様書が、保守作業の定義となる。定義も不能な作業を行っても完了判定が出来ないしな
作業定義が終了したなら、「ソースに手を入れる」べきか「書きなおす」べきなの判断が可能になる。違っているか?
当然「元の仕様」が記述出来ないなら、その判断は即座に可能だ
>いや「仕様をコメントとして添えろ」とまでは主張するつもりはないがな。
組織によって呼び方は違うが、外部仕様/機能仕様/外形仕様と呼ばれる仕様書が存在しなければ
そのプログラムは保守対象にはならん。だからまず仕様書を書くわけだよ
日曜なのでマターリ気分で切り返してみたぞ(W
理想論に生きている人ですね(´ー`)
>>それでも、元の仕様がわからないから書き直せないってことはあるでしょ?
>>変な動きするけどバグなのか仕様なのかはっきりしなかったり。
>>ある機能がオーバースペックの可能性があるけど、削っていいか判断できず、
>>簡潔なコードに直せないとか。
とりあえず上司を巻き込み、問い詰めて仕様を逆算する判断の責任を転嫁する。
まずはそれからだねw
>>275 うん。まあソウかもシレン。でもこの程度の方法論も出てこない/通らない、
品質に対する意識のヒクーイ組織で仕事していたって楽しく無いからな
正面から反論してみ。
>>276 よさげ
リスクのマネジメントだな。
熊とワルツを踊れ
,..-──- 、
/. : : : : : : : : :: \
/.: : : : : : : : : : : : : : ヽ
,!::: : : : : :,-…-…-ミ: : :',
{:: : : : :: : :i '⌒' '⌒'i: : :} ワノレツって・・・
{:: : : : : : | ェェ ェェ | : :} ∩___∩ Shall we dance?
{ : : : : : :| ,.、 |: :;! / ヽ
__ヾ: : : :: :i r‐-ニ-┐| :ノ | ● ● |
ゞ : :イ! ヽ 二゙ノイ‐′ | ( _●_) ミ
` ー一'´ヽ \ ,,-''"彡 |∪| __/`''--、
) |@ |ヽ/ ヽノ ̄ ヽ
| | ノ / ⊂) メ ヽ_,,,---
| .|@ | |_ノ ,へ / ヽ ヽノ ̄
| |_ / / | / | | ヽ_,,-''"
__|_ \\,,-'"\__/ /
>>68 最初の while ループは
do {
result = dosomethinb();
} while(result);
ってしない?あるいわ
while ((result = dosomething())) ;
とか?
ジャンプテーブルを使うと綺麗な場合、下請け関数たちの呼び出しプロトコルが固定的で、それぞれの動作がchっこう姓を持っている場合かな?
システムコール一つで、各種ドライバにopen,read,write,closeできるというような
そういう束で扱いたい時には自然とジャンプテーブルにしてるな。
代入している場所、分岐している場所、テーブルの3箇所になるんで
ジャンプテーブルは「著しく可読性を下げる」と思う
ここは、派生か関数ポインタの直接代入で切り抜けろよ、と思う
まぁ、俺自身はWindowsかLinuxがベースの仕事が多いから
携帯とかのプアーな環境ではそれもありなんだが
switchも最適化かかるから一概に悪くないと思う
そうや、unreachが使える言語ってC99だっけ?
switch+default unreachで必ずジャンプテーブルを組んでくれればそれでFAなんだがな
>>282 >代入している場所、分岐している場所、テーブルの3箇所になるんで
>ジャンプテーブルは「著しく可読性を下げる」と思う
switch でもアホみたいにでかい switch はどうなんですか?
何事も程度問題なんだよ。お前の主観はどうでもいい。
switchでもテーブルでもいいけどさ、ケースバイケースだろ
どっちもメリット、デメリットあるんだから
相手のデメリットを指摘してどーなの?なんて言っても仕方ないだろ
それとも、ここで片方に決めないとまずいのか?
自分がこっちのケースのほうが絶対に綺麗に行くって
信じたほうをかけばいいんでないかな
ぶっちゃけどうでもいい
>285
禿同
この程度で辞めたいと思うヤシが居るのか?
居るから議論になってるのかw
まあ、先輩たちが例えばジャンプテーブルかswitch文かでこんな論争をいつまでも続けていたら、
そりゃあ辞めたくもなるよと教えてくれているのでは。
仮に、ジャンプヲタかswitchオタが社長で、おれが逆の立場だった場合、
「オレと同じ発想ができないお前は鼻クソ」、
「つべこべ言わずにオレの真似だけしてればいいんだ」、
「理屈っぽいんだよ、ムカツクんだよ」
などと言われた場合は辞めたくなるわな
オレの場合、言われました
辞めました
生`
switchとテーブルか! 白熱しておりますな。
すばらしい! なんて参考になる議論なんだ!
・・・別スレ立ててそっちでやれ。
プログラマって負けず嫌いが多そうだよね・・・自分を顧みても
負けず嫌いというか、自信過剰なやつが多いな。
言うまでもなく漏れもそうなわけだが。
>283
おまいテーブル廚だろ、とつまんない指摘はさておき、
べつに>282はswitchサイコーとは言ってないじゃん。
あくまで「テーブルは見づらい」「switchを避ける理由はない」と述べてるだけ。
それと テーブル派 vs switch派 とか寝言言ってるヤシ、>173からもう一度読み直せ。
しばらくぶりに来たら、話題が固まってますね。。
煽ったのは漏れだろうか...
いや177、君じゃない。俺の見るところ173だ
ということは 173 の大漁節が聞こえるころでつね。
173も釣られてる罠
M$と肩を並べる某社の構築した某システム。
複数のシステム間をつなぐゲートウェイには、Windowsが使われていた。
その上で動いていたのは、共有フォルダ上にDBの内容を固定長テキストで書き出し、
あるいはその逆に共有フォルダに出力されたファイルを読み込みDBへ格納するだけの
単機能アプリが数十個。
…大体予想が着くとは思うが、仕様変更の度に大騒ぎになるわ、
1バイトのずれでエラーになったり最悪DB壊すわで、
某社のイメージとは大幅にかけ離れたブツであった。
人の命に関わるようなシステムで、こんな事やってて良いのかねぇ。
300!
ていうか住基ネットのシステムなんて(略
>>299 まさか、Fが失敗したネットワークシステムってそれなのか?
>>301 FはM$と肩を並べてないし、(その糞システムと)イメージが大幅にかけ離れてもない
Iとかじゃないの?
C99のunreachって何ですか?
かいつまんで教えてください。ポインタでもいいですよ。
まさかデバッグ用のコードを消すと動かなくなるプログラムが
本当にあるとは思わなんだ
ちゃんと原因特定したけどさ
デバッグ用のコードが、volatileの役目を果たしていたらしい
丸1日これでつぶしちゃいました(´Д⊂ツカエナイ シンジンデ ゴメンポ
>>304 1日なら使えるほうだよ。
前に職場にいた43歳の人は、それ系で3週間悩んでて
進捗ゼロだったし。
ごめんなさい。
今日の作業時間の半分はbuild.xmlの書き間違えと
Velocityの動かし方の確認に費やしてしまいますた。
……なんかもうJava(とくにJ2ME)いやぽ。
>>304 俺の今やっている仕事のソースには、あちこちに
/* テスト用機能。本番では削除すること */
/* 仮実装。納品時は無効化するのを忘れないこと!! */
とかいうコメントつきの処理が山ほどあるよ(゚∀゚)
勿論俺は引き継いだ人間な(´д`)
そして無効化したら異常終了したりDB壊れたりと最悪。
>>307 ソースは消したんだけど、コメントを消すのを忘れただけなんだよ(´ー`)
イ`
>>309 あーそれ有り得るな。
デバッグコードを消していいのかどうかは簡単に判断できるけど、
コメントは消していいのか判断つかない。
消せ。
もしくはデバッグコード部分を消さず丸ごとコメントアウト、その中にコメントの内容も入れる。
#if+#endifを使え。って、Javaクソなのか?
Javaのソースで#ifdefとか書いてて、
javacに掛ける前にcl(でもccでもgccでも何でもいいけどさ)に掛けれ、
ってソースは辞めたくなる?
携帯向けのJavaの火消しに入れられたんだが、激しくそうしたい……
何が悲しくて16個のバイナリパッケージを作るのにいちいちソースを
コメントアウトしたりコメント外したりせんならんのじゃ。ったく。
# 流石にその辺の潮騒はbuild.xmlにタスクとして書いておくけど。
>>313 それって。。。
要はコードを変更してるとゆうことなんでしょ?
テストはどうなってるんですか?ちゃんといちいちしてるの?
>>313 いまどき cppなんか使わず m4だろ
会社じゃなくて大学のJavaの授業なんだけど、
先生が作ったクラス名が
avltree6.java data4.java formatError.java wordpair.class wordpairintext.class
>314
してるらしい。つーか前のプロジェクトのコードをスケルトン代わりに
もらったんだけど、そのコードがコメント付けたり外したりで
対処していた。
テスト項目見たら、その変更がかかる箇所がちゃんと変更されてるか
どうか、で9割占めてたよ_| ̄|○
>315
最初はVelocity使う仕掛けこしらえたんだけど、
antだけならまだしもサーバサイドJavaやるんでもないのに
Velocityまで入れてくれつったら将来引き継ぐ香具師が切れそうだなと思い。
Java の命名規則を完全無視ってことだろう
Javaはテーブルジャンプができないから糞。
たいがいにしろよw
Strategyパターンとか?
PL/SQLのFUNCTIONを、Cみたいに使うの(出力パラメータと
戻り値-1とか返す)ってOKですか?
最近資格取るために勉強してたら、「FUNCTIONは値をひとつ
戻すために使います。出力パラメータを使う場合はPROCEDURE
を使います。」とかあって。
今のシステムのソースがぜんぜんそんなこと気にしてないんだけど、
別にいいのかなぁ・・・。
(FUNCTIONで戻り値を返そうとか統一されているわけではまったく無し。)
PL/SQLの機能的にはFUNCTIONで返り値とPUTパラメーター双方返しても何も問題ない。
ただFUNCTIONとPROCEDUREを使い分ける基準が無いなら、分かりやすさという点じゃマイナスだな。
>325
レスサンクス。
戻り値返すのとかは、あんまり気にしなくていいってことですね。
使い分ける基準とかは、全然ないです。
引き継いだとこがPROCEDURE使ってたから、機能追加もPROCDURE〜とか、
たぶんそんなレベル・・・
ときどきごちゃまぜになって、FUNCTIONなのに出力パラメータにも戻り値の
変数があるのとかは、勘弁してほしい・・・(´Д⊂
細かいことなんで辞めようと思うほどじゃないし、それ以前にとっくに辞める気なんだが、
CVSの履歴を見たら「リファクタリング」と称してシングルトンインスタンスを
取得している部分を全部クラス変数に直されていた。
public void xxx() {
Class1.getInstance().method1();
}
↓
static Class1 CLASS1 = Class1.getInstance();
public void xxx() {
CLASS1.method1();
}
これって
static PrintStream out = System.out;
public void xxx() {
out.println();
}
みたいで気持ち悪いと思うのは俺だけ?
というか、一番問題なのはライフサイクルが変わるかも知れないことじゃ……。
遅延初期化を狙ってるならそのメリットが消えるし。
そこまでシビアな状況なのかどうかは知らんけど。
>>328に一票。
つか、
>>327が気持ち悪いって言ってるコードは全然気持ち悪くない。
それどころか、場合によってはよいコードだろ。
330 :
仕様書無しさん:04/06/07 22:29
ライフサイクルの問題はその通りだけど、一応発生しえないんで
考えから外してた。
遅延初期化については考えてなかったんで、けなす理由が一つ増えてサンクス。
下のコードは、少なくとも無駄にスコープを広くしてるんで
俺にはやっぱり気持ち悪い。
せめてローカル変数にしてくれればまだ納得したけど。
それよりも一番許せないのは、こんなところチマチマ弄くって
仕事した気になってる連中。
他に潰さなきゃいけない大穴が爆撃の跡みたいに空いてるってのに
コードの改悪して給料もらってるんじゃやってられねっての。
>>330 俺も早くそうしたいね。
俺は以前、作成したクラスのフィールドが、
知らないうちに全部staticに変更されてた。
何かの拍子にstaticメソッドを作成してしまったらしく、
コンパイルエラーが出たから、出ないようにしたようだ。
まともに動くわけねーだろ…
333 :
仕様書無しさん:04/06/07 23:03
>>327 言動に視野の狭さを感じるのは俺だけか?
最強なのは正にこの板の名無し状態のシステムですよ。
VBのシステムを無理やりASPに移行したんだけど、
主要なメソッドが1つのクラスの集中してて7万行とかあるんですよ。
それを何人かで直さなきゃいけないわけですよ。順番待ち。
で、仕様書は一切なし。それに順ずる資料も一切なし。
最 強 !
そういうのを聞くたび、
プログラマから足を洗って本当に正解だったと思うよ。
さすがにそこまでいくとネタすぎないですか?
ネタくさいことが普通にあるのがこの世界
事実はネタよりもネタ臭い
339 :
仕様書無しさん:04/06/08 01:02
酷いソースを掴まされたときどうしてますか?
リファクタリングしますか?
超巨大クラスのなかに超巨大メソッドが一つ。
メンバ変数が大量(700以上)。
'Option strict ON
>>332 マルチスレッド化するためにスレッドの制御関数をstaticで追加して
(thisポインタがあるとリンク出来ないので)、メンバ変数も全部staticにして、
この変数がいつのまにか変わるんですよといってた奴なら知ってるw。
thisポインタを引数で渡せばいいのに根
strSQL = ""
strSQL = strSQL & "文字列"
strSQL = strSQL & "文字列"
strSQL = strSQL & "文字列"
strSQL = strSQL & "文字列"
strSQL = strSQL & "文字列"
strSQL = strSQL & "文字列"
:
:
>>343 そこにif文やswitch文分岐だのforループだのが激しく混ざると上級
糞コードですよ。
しかも俺82じゃないしな。
すまん。
int fd=/*ソケットディスクリプタ*/;
char ch;
while(終了条件){
int ch = read(fd,&ch,sizeof(char));
//省略
}
1byte毎かよ…
グローバル変数でcnt定義
For cnt = 0 to 50
なんか色々処理
Method()
なんか色々処理
Nect cnt
Sub Method()
For cnt = 0 to 50
なんか色々処理
Next
End Sub
「なんか色々処理」のなかでもcntの値をいじってて、
それで全体としては正しく動く。
もう、嫌がらせとしか思えんかったよ
念のため、もちろん実稼動してたまじめなプログラムだよ。
For i = 1 To 100
flag = 0
For j = 1 To 100
If j = i Then flag = 1
If flag = 1 Then
なんか色々処理
End If
If j = i Then flag = 0
Next
Next
実際はもっともっと分けのわからん複雑なループのしかたしてたけど、
ニュアンスはこんな感じ。あ、こんなのが3重だったかな…
もう、何がしたいねん。
>>344 ごめん、そういうとき、ホントはどうすればいい?
File file = //;
String fstr = file.getAbsolutePath();
//fstrをぐちゃぐちゃ加工する処理
File target = new File(fstr);
なんでもかんでも一度Stringにしたがる奴が多いのはなんでだ?
抽象化のメリットを1から勉強しなおせオマエラ。とおもった。
先輩、プログラムを限界まで高速化しました!!
register int i;
for (i = 0; i < hoge; i++) {
Xlib(だっけ)のグラフィックス関連メソッド呼び出し。
}
まて、ちょっとまて。
>>350 SQLGenerator gen = new SQLGenerator();
gen.setSelectCriteria(scollection);
gen.setWhereCriteria(wcollection);
//...
String sql = gen.generate();
正しいかはしらんけど、オイラなら例えばこんなクラスを要件に
応じて適当に作るだろうなあ。直接SQL文字列の組み立てをいろ
んなところでやることは避けたいな、と。
VBでINIファイルの読み込み、APIなんざ使わずにテキストで読み込み。
If Left(buf, 8) = "HogeHoge" Then value = Mid(buf, 10)
If Left(buf, 6) = "Hogeyo" Then value = Mid(buf, 8)
延々と…
冗談だろ…
355 :
仕様書無しさん:04/06/08 04:56
>>351 日時型と文字列型を
激しく相互変換しまくってるコードに遭遇しました。
テーブルに日付を文字列にして格納している奴は見たことあるな。
んで、集計するのにWHERE句で苦労したらしく、整数値型の列をAlterしてあった。
年、月、日と、みっつね。んで、それに全部インデックスかけてあるから、
年次処理でテーブルを掃除するのが遅いのなんのってw
>>331 >それよりも一番許せないのは、こんなところチマチマ弄くって
>仕事した気になってる連中。
>他に潰さなきゃいけない大穴が爆撃の跡みたいに空いてるってのに
>コードの改悪して給料もらってるんじゃやってられねっての。
俺は、他に潰さなきゃいけない大穴が爆撃の跡みたいに空いてるってのに
そんなチマチマした修正を 2ch であげつらって、悦にいっている奴の方が
許せないが・・・
>>357 度を越して頭悪いと、揚げ足取りも寒いだけだね。
360 :
仕様書無しさん:04/06/08 09:20
>>343-344 俺それやるが。どうすればいいんだ?
4テーブルリンク、リンクキー合計5つ(2,2、1)
その他画面入力に応じた条件5つぐらいで頼む
>>353 VBの話だが、なにかいい案があればヨロシク
361 :
仕様書無しさん:04/06/08 09:50
テーブル、カラム、検索条件式をそれぞれクラスにすると扱いやすいよ。 オブジェクト指向の手軽な例題になる。 つーかね、動的なSQL構築を単純な文字列処理でやるのは激しくうざい。
>>353 問い合わせ文を直接ごにょごにょするのではなく、
適切にオブジェクトに分割しましょうよ、ということですね?
了解です。
>>361 見ないで発言しちゃった。 orz
java や .NET (VB.NET, C#) ではよくやるんですけれど、
VB6 だとクラスが増えて、それはそれでうざいので、どうしたものかな、と。
VBは一括だからなのか
クラスが増えるとコンパイル時間かかりすぎ
さっき自分の書いたコードを眺めてたら、
switchが三つネストしていた。
ワラタ
VBなら実行コードでどうなるかしらんけど
VBScriptだったらせめて
strSQL = ""
strSQL = "文字列" & _
"文字列" & _
"文字列" & _
"文字列" & _
:
にした方が良さげ。
>>353 サブクエリとかUNIONとかJOINとか使いたいときはどんなになる?
SQLべたに書くと予期せぬSQLエラーになったりするけど、
かといってSQLのメリット使えないのはもったいないと思うんだが。
さっさとオブジェクト指向データベースが流行すればいいのに、
といってみるテスト。
ムリがあるか…
>>367 たぶん、実行速度の観点から言っているのだろうけれど、
今は可読性を問題にしているのではないかと…
>>368 俺も
>>353 でサブクエリまで扱えるのか
疑問だった。そこまで含めて簡単・正確に
生成できるなら検討の余地あるけれど。
俺はVBでSQLベタ書き派でつ。
さすがに
>>367の形式にはしますがね。
まあ、VBにはクラスなんてないから関係ないやね。(w
あんまりこみ入ったことをやる必要はないんじゃない?
Criteria オブジェクトみたいなのは単純な表へのSELECT に特化させといて、
表のほうをUNIONやJOINを使ったビューにしておけばいいじゃん
>>372が前提かな。あるいは、単純なクエリの場合だけ、とか。
本格的にやろうとすると、コンパイラ書くようなもんだからなあ…
サブクエリくらいならコンポジットパターンで適当かませば、そん
なに面倒かけずに出来そう、かな?
>371
VBで367の形式って面倒くさくない?
うちは変更するときは元の行をコメントアウトして履歴を残さなきゃいけないから、
ほとんどの人が343の形式でベタ書きしてる。
まぁ、規約が厳密に決まってないのをいいことに、367形式で直したとこだけ
上に抜き出してコメントアウトしたりもしてるけど・・・
テーブル5, 6個結合、検索条件20個とか当たり前で、もう悪夢のよう・・・
>>374 あーそう、VBのアホ仕様では
>>367の途中一行をコメントに出来ないんだよね
うちはSourceSafeで履歴管理させてて変更をコメントで残すような規約は特に無いからいいけど。
SQLクエリは業務ロジックの要素の中でも一際濃い部分だからなぁ
そこそこ神経使わないとパフォーマンスの低下にも直結するし。
生成アルゴリズムをまともにカプセル化出来るとは思えない…。
業務系ではパフォーマンスよりも
メンテの判りやすさ、デグレの原因追求などが優先される
"strSQL" って変数名はどこでも同じなんだね。
strQuery とかのほうが合ってる気もするが。
378 :
仕様書無しさん:04/06/09 14:24
何の迷いも無く「strSQL」とする漏れも377と同じ職場。間違いない。
マジか
おまいら仕事しろ。
うちは cSQL でつ。
c は character の c らしい。
public boolean equals(Object obj) {
if ((obj instanceof StringChain) == false)
return false;
if (chain.equals(((StringChain) obj).getChain()))
return true;
else
return false;
}
キタ──────(゚∀゚)──────!!
>>384 ごく普通のequalsメソッドの実装に見えるけど?
それとも、hashCodeメソッドが実装されてないとか?
if(){
}
になってないのが気に食わないとか
>>373 結局そこのインピーダンスミスマッチを解消しようとすると、
開発の負荷が上がるから単純にしておくのがいいと思うんだよね。
RDBMSって安くないし、機能豊富だし、変に技術持ったおっさん多いし。
って、スレ違いだ。すまん。
>>384-386 return chain.equals(((StringChain) obj).getChain());
じゃないのが、嫌なんじゃない?
public boolean equals(Object obj) {
return (obj instanceof StringChain) && chain.equals(((StringChain) obj).getChain());
}
ありそうなレスが予想通りにあると嬉しいもんダナ
ソースの行数で進捗を把握した気になってるアホな
上司向けに冗長に書いていると思ってみた
ことさら叩くようなソースでもなかろうに
実はchainフィールドがnullになる可能性があって
それでNullPointerExceptionが発生したとか?
つーか、Jakarta Commons LangのObjectUtils.equals(Object, Object)
か、それと同等のものを自作して使うのが普通だと思うが。
月並みだが、ウチの会社は
if taeko < yoshiko then
go to kimie
end if
というソースが現役…
妙子より良子の方がいいと思うのになぜ君江の所に行くか、
と冷静に突っ込んでみたりしたが…空しい…もうだめぽ
俺はそれをバイクの車種でやったよ。CB250とかSL350とか・・・
if(Honda.nsr < Suzuki.Gag){
なんてコードがあったらバグと思うかもなぁ。。。
同じプロジェクト内に、同じ意味を持つ変数が最低4つ、最高12個あった
ソースを見た時は辞めたいとゆーか、思うより早く整理してしまった。
hoge1.c
strcpy( path, fullpath );
hoge2.c
strcpy( datapath, fullpath );
hoge3.c
strcpy( filepath, datapath );
hoge4.c
strcpy( filename, fullpath );
hoge5.c
strcpy( userfile, path );
>>397 それらの変数名がその関数内の文脈において適切であるなら、何種類あっても問題ない。
たとえ実体が一つであってもだ。
名称の統一を行おうとするのは「変数名管理」といってCOBOL文化において良くみられるものだけど。
それが全部グローバルなら、悲しくなるかもな。
ローカルなら、あんまり気にしない。
>>399 COBOL文によく見られる変数名管理は、どちらかというと
「妙なプリフィックス+ID」という管理手法であって、
変数名を統一する目的ではないような…
>>401 うん。その種のいわゆるインテリジェントコードと呼ばれる、一意化命名規則を使っているところは多い
ただ「意味が全然わからなくてあんまりだ」という理由で、意味のある名前を付与し管理しているところもある。
変数名をキーにしてデータベース化している。
データベースの参照はツールを使って誰でも出来るが、更新は管理者のみが更新可能。
サブシステム内のみならず全システム内で同一の変数名が使われる。
先輩が書いたソースにあった、メッセージ文字列
書式を変更するときの確認→ "Format Change ?"
保存するときの確認→ "Save OK ?"
読み込むときの確認→ "Load OK ?"
削除するときの確認→ "Are You Delete ?"
海外向けなのにカタコトかよー。最後のなんかハァ???だし。
しかも、もう出荷しちゃってるし orz
恥ずかしー
>Are You Delete?
ワラタ
Save OK?
Load OK?
なら
Delete OK?
でいいのにな・・・
呼んだ?
deleteは形容詞だったのか!!!
「あなたはDelete氏ですか?」と聞いているのかもしれん。
>>398-400 全部グローバル変数で、それぞれ512バイトずつ確保していたよ(;´д⊂)
仕様上ファイル名はフルパスで64文字になっているのに・・・
Are you deleted?
>>412 携帯電話の英語設定も大抵そんなのだよ
全部修正したろと思って英語表記が仕様上未決定の時に
キレイな英語にしておいたら、企画屋さんから
「わかりづらい英語にしないで仕様通りにしてください」
とクレームがきた。
Delete Files All, OK?
のどこがわかりやすいのか・・・
Remove all files?
がフツーだろ。
新人にVBの課題させたらグローバル変数使いまくり
こういうのがいい(?)コボラーになるんだろうなと思った。
>>413 携帯の英語モードの需要は
かっこつけたつもりになりたいアホDQNに対してで
正しい文法は通じない…とか推測してみる
つまり英語モードじゃなくてDQNモードだって事か
>>413 直すなら事前に話しとけば良かったのにな
企画屋なんて自分らがやってることが正しいと信じて疑わない連中なんだから、
勝手に変えられていたら怒るよ
正しい、正しくないは(連中にとっては)また別の問題
理不尽だけど、俺にも経験があるから
そうそう。企画ってのは別名「思いつき仕様提案チーム」だからな。
思いついた操作方法を仕様書としてあげ、操作設計書を漏れらが書いて提出したら、
それでもってようやく全体が見え、そこからまた思いつき修正依頼を出す。
開発に入り動くものが出てきたら、そこでようやく現実的に見ることができ、
そこから思いつき大幅仕様変更を息をするかのように提案する。
そんなことばっかやっているのに、売れると企画の人間がニュースページに
顔を出すんだよなあ。やってられねーよ
そうそう、だからお前らも
いつまでもプログラマーなんかやってないで
ステップアップしなきゃダメよ
ということで、明日から営業にステップアッぷします
それはアップか?
いや、技術知識を活かしつつかつ営業の才能もあるならアップか。
ドカタから抜け出せるという意味ではアップだろ
土方 -> 詐欺師
ひじかたさんは詐欺師なんかじゃねぇ!(;´д⊂)
鬼の副長だもんな。
いや漫画家だ。
艦長だよ
428 :
仕様書無しさん:04/06/14 11:59
「トシちゃん25歳!」
429 :
仕様書無しさん:04/06/14 20:46
なるほど。
ソースコードに「トシちゃん25歳!」って書いてあったんだな。
そして、
>>428はそれをみて会社を辞めようと思った訳だ。
public class HogeHoge {
/**
* コンストラクタ
*/
}
ミスった。再度。今日見かけたコード
public class HogeHoge {
/**
* コンストラクタ
*/
void HogeHoge() {
}
}
>431
……それでコンパイル通っちゃうんだもんなぁ。
コンストラクタで大したことしてなければ特に影響もないし……
とはいえ見ると鬱だ。
voidかな?
>433
431のコードにこう追加してみよう。
private int val;
で、HogeHoge()の中で
val = 10;
としてみる。
ついでにvalのgetterも書いておこう。
HogeHogeのインスタンスを生成してvalの値を取ると、あら不思議!!
昔、C++に移植しる!! と言われて渡されたObjective-Cのソース
result = [ uge withHoge :
[[ hoge :[[
[[[
[ huga withHoge:[ hage moge ]] mage]
chige] choge :[ hyoge withPypge:[uge getPypge]
]]]] : [
[
[[ ・・・・・・・
中括弧の数を数えるのが限界だった
>>433 戻り値の型を書いたらそれはコンストラクタではなくメソッドだよ。ということ。
で、ご丁寧にJavaDocコメントで「コンストラクタ」と書いてあるのがさらに鬱
(char*)hoge, &data[0];
(char*)moe, &file[0];
何だこりゃ、と思ったら担当者が何故か = と , を間違えたらしい。
コンパイルとおるなよ・・・(;´д⊂)
>>436 括弧の数なんか数えるなよ。インデント見ればわかる。
そんなんじゃLispなんかやってられないぞ。
>436
それ以前に "[]" は中括弧じゃないな。
>>431 前それでバグってたソースがあった。
修正した形跡があるんだが、
「何故かコンストラクタが呼ばれないため手動で初期化」
と初期化用メソッドと、使う側にその呼び出しが追加されてた。
>>438 コンパイルは当然のように出来るさ(w
cの言語仕様は「プログラマは間違えない」という前提で設計されているからな(w
>>442 警告は出てもいいような。
効果のない式がうんぬん、てやつ。
#include "Windows.h"
>>445 lint かけれ。
つーかそのレベルを出させると
(void)printf(...);
な行ばっかりになって鬱。
>>447 lintクリーンなコードを書いていますが何か?
int foo(int *a){
a++;
return *a;
}
こんな感じのソースを書いてたら(途中大分省略)、先輩に
「あー、なにやってるんだよ、馬鹿
引き数書き換えるんじゃねーよ、元の値までかわるじゃねーか」
この会社辞めてもいいですか?
辞めてもいいが、何で引数の元の値をそのまま返すのん?
え?
その先輩がまぁ分かってないのは確かだとしても
まぁ全体見ないと判断できないが
>>450のソースはそれそのままでは俺もあんまり好きな雰囲気はしない…
ついうっかりバッファオーバーランとかしそう。
>>450 今の職場にいる43歳のダメぽ野郎よりマシだ
作業結果みたら、簡単な処理なのに関数が40個もあるっちゅーから驚いて見てみたら、
int data_plus( int a )
{
int b;
b = a + 1;
return( b );
}
みたいな関数が山ほど。
>>453 STLのイテレータだってほっとけばバッファオーバーランするぞ
>>456 えええ、例外投げるんじゃなかったっけ?
>>450 漏れがヘタレで良くわからないんだが、それは何をする関数なの?
//メモリ領域をアロックする
LPBYTE buffer;
buffer = (LPBYTE)malloc(sizeof(BYTE) * dwDataSize);
…(略)…
//アロック済みメモリをガーベッジコレクションする
buffer = NULL;
…コレクションできていないようだが?(C++)
客に対して
「Windowsのバグでメモリが解放されないので、メモリが足りなくなったら再起動を」
とか言ってた気がするが、そういうレベルの問題では…('A`)
>>459 _| ̄|●
そんなコードを書くから、Java厨とか言われちゃうんだよなぁ…
ポインタの破壊がGCかよ
そーいう「何もわかってないヤツ」にコード書かせる
ことにこそスキル管理不在という最大の問題が存在すると思うが
>>459 ツッコミどころが多くて迷うが、とりあえず
>「Windowsのバグでメモリが解放されないので、メモリが足りなくなったら再起動を」
こんな事を信じてくれる客先がいる事がうらやましい・・・
>>459 ウギャ ━━('A`)━━ !!!!!
どっちかと言うと藻前が辞めるんでなくそれ書いた奴を違う業界に追い出してくれ…。
ちなみにうちの会社でもDBをCOBOL式にアクセスしてるクソwebアプリがあって、
プログラマがトランザクション知らなかったのか
複数人で使うと挿入する主キーが被って落ちる。
客への説明は「サーバへの過負荷」。
300人程度の社員が使う、おそらく同時利用はあっても3人程度のシステムで
どうやってXeonデュアルのサーバを過負荷にさせられんだか… ('A`)
>>461 >「何もわかってないヤツ」にコード書かせる
>ことにこそスキル管理不在という最大の問題が存在すると思うが
超同意。
最近文系で会社入ってから見よう見まねでプログラム書くようになったっていう程度の
サラリーマンエンジニアが増えて来てる気がする。
職人気質の無い奴等に売り物としてのシステムを作らせるのは詐欺。
LPBYTEという名前のクラスがあって、
operator = にNULLを渡すと自動的に
free() するとか。
いや、なんでもない。
>>464 そういう場合はnew使って欲しいなぁ〜
そういう問題でもないか
>>463 Java厨=文系だと思っていないか
文学部卒でC++屋の俺にとってこれ以上の屈辱はない
馬鹿な奴が"デフォルトの値"として選んだ文系とそれ以外の文系は、
本当は分けて考えるべきなんだけどね。
後者を「論理が苦手」とする理由は無いし。
でも分ける手段が無いからなぁ。
>>467 文系に2通りあるなら、そもそも文系を出した時点で差別だ。
ためしに
>>463の「文系」を「黒人」でも「女」でも「えた」にでも、
置き換えてみればわかりやすいだろう。
×文系は馬鹿
○馬鹿は文系
糞コード読解力養成本って出版したら売れるかな
もちろん付属CD-ROMの中身は大量のサンプルコード
>470-471
Cプログラミング診断室、ですな。
tp://www.pro.or.jp/~fuji/mybooks/cdiag/index.html
糞コードのオンパレードです。
「何をしたらいけないかを知りたい」とか「自虐的な精神修養をしたい」
という人にのみ推薦
いまさらCで綺麗なソースがかけてもね。
Java版とかC++版なら欲しいが。
みなさんにOSを供給してくれている米国の某巨大ソフトウェア会社は
手違いで綺麗なCのソースコードのサンプルを提供してくださいました。
476 :
仕様書無しさん:04/06/19 09:05
>>474 綺麗なソースの書き方と言語は関係ないだろ
言語やプラットフォームやツールが変わるたびに、一から丸暗記しなおすタイプか?
さらにいえば、JavaもC++もCの系列山車
478 :
仕様書無しさん:04/06/19 11:03
>>476 関係あるんじゃない? 特にCは・・・・。
酷いポインタの使い方とか、無意味なマクロ連打とか。
479 :
仕様書無しさん:04/06/19 11:11
今新たなプロジェクトに入って他人のコード修正してるが
グローバル変数使いまくりで、しかもある関数呼ぶときに
引数であるグローバル変数渡してるくせして、
その関数の中でさらに別のグローバル変数使ってたり書き換えたり・・・
同じ意味の変数が複数あったり、同じ意味で同じ値の定数が複数あったり・・・
もうイヤだ!
>>479 もしお前が俺の隣の席のヤツなら、月曜日小さな声で「ぬるぽ」と言ってくれ。
「がっ」という声が返ってきたら、そのプログラム作ったのは俺だ。
ほんとスマン。
スマンで済む問題か?
>>481 たぶんおまいじゃないな
だって今休日出勤中で隣も居る
月曜日じゃなくて今言おうか
>>483 さりげなく、「あ〜、このままだとぬるぽになっちゃうな〜」
とか言うのが吉
485 :
仕様書無しさん:04/06/19 18:00
先輩から引き継いだCのコード、何かあるとすぐフラグ立てになっていて
処理がフラグ判定の嵐、グローバル変数が鬼のようにある
5〜6行を超える繰り返し系の処理は全て関数。(引数も戻り値もなし)
その結果
int main( void )
{
flag_clean();
data_chg();
if( data > 8 ) datamanuflag = ON;
data_swap();
if( dataswapflag == ON ) dataswap_ok_flag = ON;
data_copy();
if( datacopyflag == ON ) datacopy_ok_flag = ON;
if( datacopy_ok_flag == OFF && data_break_flag == OFF ) data_check();
if( datachkflag == ON ) data_set();
}
こんなんばっかし。
>>485 >5〜6行を超える繰り返し系の処理は全て関数。(引数も戻り値もなし)
C++では正しいかもしれない。
for_eachに関数オブジェクトを渡して処理するのが推奨されてる。
487 :
仕様書無しさん:04/06/20 01:11
>>458 たぶんこんな感じ。
int foo(int *a){
a++;
return *a;
}
void hoge(){
int len, ret;
int hairetu[] = {1,2,3,4,5};
len = sizeof(hairetu)/sizeof(int);
for(int k=0;k<len;k++){
ret = foo(&hairetu[k]);
printf("count='%d'\n", ret);
}
}
結果
count=2
count=3
count=4
count=5
ドッカーン
488 :
仕様書無しさん:04/06/20 01:12
パート1から>>ALL
ちっちぇえ悩みだな〜
/*
|
|
|
∧|∧
( / ⌒ヽ | ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |
∪ / ノ . |
ノ ノ ノ */
main (
)
{
}
正しいCのコード
>>489 a.c:1: error: stray '\241' in program
...
a.c:15: error: stray '\311' in program
a.c:15: error: 構文解析エラー at end of input
全角スペースでなく半角スペースに直さないといけないな。
スペースは で表現汁
>>489 はその程度のコードさけ書けないぬるぽPGとして、今すぐコメントを実現しる。
さけ?
えっスピリタスだってどこどこええっどこ??
JavaでopCompみたいなクラス名をつける香具師って頭おかしいんじゃなかろうか
いやクラスなんだから、動詞が名称になっているってこと自体が変だ
と言いたいのでは
動作を表すクラスだったらいいんじゃね?
>>498 具体的な例を書いてみてくれないか?
OOPなんだからクラスはオブジェクトだよな。
おれはOOは半可通だって自覚してるからエロい人に指摘してもらいたいんだ。
1.クラス名に略名をつけるな(長くていいからわかりやすくしろ)
2.クラス名の最初の文字は大文字にしろ
ということだろう。
この規則守らないとキモい(少なくともJavaではね)。
>>500 いつも思うが、2番は言語仕様にすればよかったのに。
>>499 498ではないが、自分の場合、C++だと通常のクラス名は名詞で統一して
ファンクタだけ、動詞って感じにしている。(この例ではPrintクラス)
しかし、Javaでクラス名が動詞になる例は、今まで見たことないな・・・・・・。
// 例) 配列の値を出力する、オブジェクト指向の欠片も見当たらないサンプル。
#include <iostream>
#include <algorithm>
class Print {
public:
void operator()(int value) const {
std::cout << value << std::endl;
}
};
int main()
{
int data[] = {0, 1, 2, 3};
std::for_each(data, data + sizeof(data)/sizeof(data[0]), Print());
return 0;
}
え、言語に依存するの?
C++だと
getDate()みたいなメソッド名よりGetDate()ってメソッド名が普通だよね。
Javaだと逆だけど。
pf_date_GETDATE_20040623()
職業プログラマはほんとにこんな関数名つけるんですか
職業PGにありがちで、思わず首を傾げてしまうのは
#define VALUE_ZERO (0)
#define VALUE_ONE (1)
#define VALUE_TWO (2)
:
だね。
#define SYSTEM_ERROR (-1)
なんてのも見たことあるし。んで、
if(open(...) == SYSTEM_ERROR) エラー処理;
if(pthread_create(...) == SYSTEM_ERROR) エラー処理;
みたいに使うのな。前者はともかく、後者は間違ってるし。
職業プログラマにありがちであるのは確かだが、
職業プログラマであるからではない、単なるアホであるからだ
509 :
仕様書無しさん:04/06/23 21:26
いきなり
return -1;
とかやられるよりマシだべ。
510 :
仕様書無しさん:04/06/23 22:16
511 :
仕様書無しさん:04/06/23 22:23
>>509 いきなりreturn -1;でいいじゃん。
#define SYSTEM_ERROR (-1)
return SYSTEM_ERROR;
なんて目がちかちかするよ。
>>507 >#define VALUE_ZERO (0)
>#define VALUE_ONE (1)
>#define VALUE_TWO (2)
ソレと似たようなのを現実に見たときはすこし気が遠くなった
513 :
仕様書無しさん:04/06/23 23:15
>>507 >#define VALUE_ZERO (0)
>#define VALUE_ONE (1)
>#define VALUE_TWO (2)
これの意図、何となく分かったぞ。
多分、本当は下に書いた感じの意味があるんだよ。
#define XXSYSTEM_COMPLETE (0)
#define XXSYSTEM_CONNECTION_ERROR (1)
#define XXSYSTEM_OPEN_ERROR (2)
でも、作ってる時は名前思いつかなかったから、
とりあえずZERO,ONE,TWOにした。
こうしとけばあとからgrepかけて一括置換できる。
pthread_createは0以外だからね。
WinのAPIでも実は0と0以外なんだが、殆どTRUE(1)を返すから
==TRUEとしているコードを時々見るな。
515 :
仕様書無しさん:04/06/24 00:18
>>65 さんへ
要するに、
処理A
|
処理B
|
処理C
|
処理D
の様な処理で、途中でNGになった時は後の処理をさせないような制御を
どう実現するかだと思うんだけど。
Cの場合、goto か do{ break }while(0) しか方法がないと思う。
(ループしないので、while(1){ break } より do{ break }while(0) ね)
で、自分は、do{ break }while(0) の方が良いと思う。
理由は、break した時は、do{ }while(0) の次に処理が進むのがぱっと見で分かる。
do{ }while(0) 内はインデントするだろうし、直感で分かるんですよね。
gotoだとそうはいかない、処理A〜処理Dはインデントされないだろうし、
gotoのラベルが全部同じラベルかどうか、gotoの飛び先がどの辺に書かれているかを
目で追わないといけないし。
>>68 さんの場合は、その制御を関数を使って実現していますが、
それだけの為に関数を作るのもどうかと思います。
人によっては大した差じゃないと思うかもしれませんが、自分は糞ソースを沢山
保守してきて、凄く苦しめられてきたので、パット見で、視覚的に処理の流れが
分かるっていうのは凄く重要だと思っています。
setjmp/longjmpで例外送出もどき、ってやってる人いる?
ret=処理A
if(ret==OK) ret=処理B
if(ret==OK) ret=処理C
if(ret==OK) ret=処理D
ではいかんのか?
>>517 >それだけの為に関数を作るのもどうかと思います。
return (処理A&&処理B&&処理C&&処理D) ? 1:0;
とか書いてまうけど。
>>518 関数切るのが重大事な馬鹿開発には付き合えんな。
それ自己満足の世界だな
>>513 隊長!DATE_1 = 0, DATE_2 = 1, ... DATE_30 = 29, というのを発見しました!
何故そうしたのかを聞いたらDBから読み出す日付データが0基準なのでずれるからだそうです。
マジで氏ねよと思いますた。
>>515 Stateパターンで実装かなあ…Cなら関数ポインタ使えば簡単さ。
>>517 ありですね^^;
ただし、各処理がある程度の規模なら。2,3行で終わる処理だと...
>>519 途中でNGになった時は後の処理をさせない...
>>526 false && printf("hello\n"
途中で送信されちゃった。
トリッキーだけどNGになったら後の処理は実行されないよ。
>>526 >途中でNGになった時は後の処理をさせない...
普通の言語なら、FALSE挟まったら以降は処理されないでしょ。
まあ、脳梗塞馬鹿が管理やっていると、関数一個追加するのにいちいち
お伺い立てて許可モラウ羽目になったりするからな。
小さい関数1個作るのにテスト仕様書3枚書かないといけなかったりな。
ハハハハ
>>515 do{}while()のくせにループしないのは異常。
ぱっと見でだまされる。あり得ない。
gotoの方がよい。まともなソースならgotoの使い方なんか限られてる。
糞ソースを前提にするなら、そもそも俺はそういうレベルの糞ソースは書かないし、
俺が今後どう書こうが、現存する糞ソースに影響を及ぼさないから語るだけ無駄。
#inlucde<stdio.h>void main(){printf("なぜかコソパイルできない");}
>>533 こういうのを見たことがある。
for(i = 0; i < MAXIMUM_HOGE; i++){
if(i == 0){
:
:
break;
}
:
:
}
最初ピンとこなかったんだけど、最初はHOGEの個数だけ処理する
必要があったのを、仕様変更で1つしか処理する必要が無くなり、
こういうことをしたみたいだった。
みなさん、そこでlongjmpの出番ですよ。
537 :
仕様書無しさん:04/06/24 01:09
…引数30個の関数を見た時…orz
400以上前のレスへの遅レス返すような池沼あいてになに
マジになってますか?
フラグのtrue/false評価を行うif文でネストが7重、1000行超えの
関数を見たとき。
はっはっは、ソースが幾何学模様のようだ!
インデントが画面を往復しているコードも見たことあるなぁ。(80桁)
藤原さんのCプログラミング診断室を昔笑いながら読んだ覚えがあるんだけど、
こんどのメンテ対象のソース、アレに載ってたヤツだ…orz
542 :
仕様書無しさん:04/06/24 01:19
543 :
仕様書無しさん:04/06/24 01:52
今度金融系のシステムやるんだけど
random_price()って関数作ってみるよ。
動作に問題なくてもこの関数名に何人が気づきそして俺を止めるのか・・。
>>515 自分は、
>do{}while()のくせにループしないのは異常。
>ぱっと見でだまされる。あり得ない。
そうですか?、自分はこの、do{ break }while(0) のテクニックを
保守していて知ったのですが、最初はおやっ?と思ったけど、すぐ
理解でましたよ。しかも結構使われているので定石だと思っていました。
なので、これを否定している人がいたので意外でした。
gotoを使っている人のソースは糞が多かったし、gotoを使うのが恥ずかしい
ってのもあるので、自分はこれからも、do{ break }while(0) を使いますね。
>俺が今後どう書こうが、現存する糞ソースに影響を及ぼさないから語るだけ無駄。
これはちょっと意味が分かりません。
システム共通
#define TRUE 1
#define FALSE 0
ある画面
#define GM_DATALIST_TRUE TRUE
#define GM_DATA_LIST_FALSE FALSE
ある画面
#define DERRCHK_OK FALSE
#define DERRCHK_ERR TRUE
ある画面
#define CHK_0 TRUE
#define CHK_1 FALSE
#define CHK_2 FALSE
ある画面
#define TRUE2 TRUE
#define FALSE2 FALSE
やめろ、やめてくれぇーーーツ!!!!!!
すげー昔FALSE/TRUEを使うのが面倒くさくて
0/1で比較してた時期があった。
そういや
enum {
loop_counter_1 = 1,
loop_counter_2,
loop_counter_3,
loop_counter_4,
loop_counter_5,
.
.
.
loop_counter_200
};
というソースを見たことあったっけな。
で、ソース作ったやつになんでこんなのやったか聞くと
「そうしないとループが何回回るかわかりにくいじゃないか」
for( i = 0; i < loop_counter_152+1; i++ ) {
じゃあ、なんでここ+1しているんだ?loop_counter_153でいいじゃないか
と聞いたら、
「いやあ、なんかそのソースバグってて150以降、1回少なく回るんだ。おかしいんだよ、なぜか」
loop_counter_146
loop_counter_147,,
loop_counter_148,
loop_counter_149,
loop_counter_151,
loop_counter_152,
loop_counter_153,
.
.
.
,
笑い死にさせるきですか(笑)
バカやろう、吹いたじゃねえかw
>>537 Javaのメソッドで引数130個を見たことある
>>544 >gotoを使っている人のソースは糞が多かったし、gotoを使うのが恥ずかしい
技術者なんだからもう少しマシな理由をつけてくれ。
gotoに関してはそれについて述べてる奴が置かれてる環境によって
随分意見が分かれてるような気がする。
要するに使い方次第で毒にも薬にもなるってことなんでしょうな。
当たり前すぎてゴメン。
アッ!使い方次第で毒になっちゃうようなものは使わないにこした
ことはないか・・・
>>513 話の流れが変わった後で申し訳ないのだが、
かのソースは
for(i = VALUE_ZERO; i < ARRAY_MAX; i = i + VALUE_ONE){ ... }
とか、
memset(buf, VALUE_FF, sizeof(buf));
なんだよ。
書いた本人に聞いてみると、
「コーディング規約にマジックナンバー使うなってあったから。」
と、おおよそ予定通りの回答。
0にZEROなんて定義名付けたって「マジック」のままで何も解決して無いじゃんと
諭してみるけど、効果なし。
ついでにループカウンタ回すのはインクリメント演算子使った方が
わかり易くないか?と問うたところ、
「前置と後置で作用の違いを考えるのがめんどくさいから。」
とのたまう。まあ、こっちは許容範囲かなぁと思うけど。
職業プログラマってそんなんでもやってけるんですか
>>557 残念ながら。
職業人としての判断は、
「このようなコードが存在するのは、コード記述者のスキルの問題もさることながら、
スキル管理および品質管理の不在という組織体制の不備に起因する」だ。
だから「この会社辞めよう(ry」というスレタイが正しいわけだよ。わかったかな(w
「フラグ変数の使いまわしによるバグが多発していたため、
変数名の先頭に業務名を示すフラグをつけることで
使用フラグの衝突を防止します」
int LGN_IFlg0001;
int LGN_IFlg0002;
int GSG_IFlg0001;
char GSG_CFlg0002;
...
惜しいな、「各業務画面はマルチスレッドで複数動作する」
という仕様がなければうまくいったかも知れない(藁
>>556 >0にZEROなんて定義名付けたって「マジック」のままで何も解決して無いじゃん
これには同意するが
>「前置と後置で作用の違いを考えるのがめんどくさいから。」
>とのたまう。まあ、こっちは許容範囲かなぁと思うけど。
こっちは同意できない。
このケースの場合、どう考えても作用の違いが影響しないし。
>こっちは許容範囲かなぁと思うけど
こんな
>>556を世間は許容できません
俺はgoto使って糞になっているソースを見てみたい…
いや、作れといわれれば簡単に作れるけどさ
現実にそんな奴がいるとは思えな…
いや、事実は消毒よりキアリー
>>563 構造化構文が存在しない昔の言語だと全然珍しくないのだが
565 :
仕様書無しさん:04/06/24 14:09
なんでもかんでも
グローバル変数
N-BASICなら普通ですけど?
いまN88BASICのシステムのメンテやれって言われたら
そりゃ辞めようと思うわな(w
追記
tmp_hogehoge
って変数がわんさかありました
>>515(528)
525です
遅レス申し訳ない。
自分はたいてい>519 氏と同じように、&&で連結して書いてる。
処理のボリュームによっては関数化もする。
自分が>521氏に同意したのは、まぁ単純に
>Cの場合、goto か do{ break }while(0) しか方法がないと思う。
と・・・『しか方法がないと思う』といきなり断定しちゃう姿勢が気
に入らなかったからだ。
経歴長いくせに糞ソース書き散らかす奴ってのは、自分のコーデ
ィングスタイルに根拠のない自信をもち、より一般的なわかりや
すいコーディングスタイルというものを探求する気持ちを失って
しまった奴だ。あなたにはそういう奴の匂いを感じた。
(ぱっと見ってか直感でね)
とりあえずそういう奴とは一緒に仕事したくないし、そういう奴
の書いたソースには関わりたくない。まぁそんな理由だ。
他にもいろいろ書こうと思ったけど、
>526
>
>>519 > 途中でNGになった時は後の処理をさせない...
とか書いてあるのをみた時点であほらしくなった。まず、言語仕
様をよく勉強してください。社内の糞ソースだけを頼りに勉強す
るのはやめたほうがいいですよ。
>>544 最初はおやっと思ったんなら、ぱっと見で騙されたって事だろ。
gotoだって
>>515のような使い方ならすぐに理解できるはずだ。
べつにdo{}whie(0)がよい記述法だから理解できたわけではない。
単にロジックが単純だから理解できたんだよ。
そもそもdo{}while(0)と、そこら中に飛びまくるgotoを比較することが間違い。
後者の方がロジックが複雑なんだから理解しがたいのは当たり前。
だいたいdo{}while(0)が定石だと思っているのもおかしい。
入門書でそんな書き方を見た事あるか?
たしかに571みたいな未だ入門書のレベルに居る奴には定石ではないかもな。
なーんて言ってみたりして☆
574 :
仕様書無しさん:04/06/24 20:38
おいおい、do{}while(0) ずいぶんとバカにしてるけど。
PHPのマニュアルにも載ってるぞ、しかも
「優れたCプログラマは、コードブロック中での実行中止が可能な
do..whileループの別の使用法について熟知している かもしれません」
だってよ!
http://jp.php.net/manual/ja/control-structures.do.while.php まあ、俺もgotoは嫌いだな。gotoを使ったソースを新人が保守してみろ、
なんだぁgoto使ってもいいんじゃんって、安易にgoto使う奴が増えそうで。
return (処理A&&処理B&&処理C&&処理D) ? 1:0;
は可読性わるいよ。
? 1:0;って必要なのか?
int hoge()
{
...
if (あんな) {
goto ERR_ANNA;
}
...
if (こんな) {
goto ERR_KONNA;
}
...
return nomal_stat;
ERR_ANNA:
後処理;
return err_anna;
ERR_KONNA:
後処理;
return err_konna;
}
こんなのは良くやるけどなぁ
>>576 int hoge()
{
...
if (あんな) {
後処理;
return err_anna;
}
...
if (こんな) {
後処理;
return err_konna;
}
...
return nomal_stat;
}
ではイケナイ理由は?
>>577 スクロルマンドイ…というのは半分ウソで、上から読んでいったときにエラー処理の
コードを読んで、メイン処理の思考を中断するのがうざいから
>>578 goto文みた時点で思考がぶてぃきれる漏れは甘い?
>>575 論理演算の結果が真のとき値が1になるのなら不要だな
>>579 ある意味、そのためのgoto
上から読んで行って
>if (あんな) {
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
>goto ERR_ANNA;
>}
('A`)
こういう気分にするため。
Select ... From ...
Where DATEPART(year, DATE_E ) Between :intYearF And :intYearT
And DATEPART(month, DATE_E ) Between :intMonthF And :intMonthT
And DATEPART(day, DATE_E ) Between :intDayF And :intMonthT
こんなプログラムが現役です。Σ(゚ρ゚;)
わざわざ、日付を年、月、日に分解してまで何の範囲で抽出したいのでしょう?
入力する日付の範囲は特に制約ありません。月がまたいだら、ボロボロな結果になります。
多分、作った人は、
Where DATE_E Between :datDateF And :datDateT
にすると、datDateTの時刻部分が0:00:00以外だと、選択から外れるから
わざわざDATEPARTにしたんだと思う。
でも完全に使い方間違ってるよ。
4行目の :intMonthT は単純に :intDayT の間違いね。
584 :
仕様書無しさん:04/06/25 01:45
ここだけの話ですが
先月、株式会社○○システムソリューションに納品した
経営戦略システムですが・・・
単体テストはまったくやってません。
というかコンパイル時の警告も全部取り除いていません。
おぼえがきとかのコメントが残ったままです。
間に合わないんでいきなりシステムテストやりました。
ごめんね。
安心しる。
納品*後*に客先で単体テストなんかザラだ。
ていうか納品後に要件変更とはこれいかに。
おまえら凄いな
ねえここまでソフトウェア業界がぐだぐだなのって、
日本だけなの? どこでも似たようなもんなの?
設計は新卒SEが、実装は派遣PGが、という腐ったシステムはたぶん日本くらいだろう。
>>587 設計はおろか、要件定義まで丸投げしているのは日本ぐらいという話は聞いた事がある。
アメリカあたりだとエンドの情報システム部がきちんと設計までするそうな。
そのためにある程度の企業になると、設計の出来るSEを漁ってた時期があったとか。
>>574 というか、GNUなソースを見るとマクロ定義の中には大量にあった。
そっち系では一般的なのか。
ところで、do{ ... }while(0);駄目って言ってるのは、ループの構文を
ループに使わないのがいかんのだよね。
前に途中でreturnで脱出するのも嫌ってる意見があったが。
C に
・複文に名前を付けられる
・break で脱出するブロックを指定できるようにする
という機能があればいいんだよね。
>>592 goto程度にひどいことになりそうな希ガス
>>593 Adaにある構文だからいいんじゃね?
break(2); よりよっぽどマシ
595 :
仕様書無しさん:04/06/25 14:37
>>553 ま、まぢっすかキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
引数だけでインデントが必要なのか…
>>595 Javaって構造体が無いから(w
クラスがあるけどね
関数アドレスのテーブルでいいじゃん。
>>594 可読性が。入れ子の中が外にいきなり飛び出したり、手前のbreakより入れ子のbreakのが
より外に飛び出すのとかって・・・。
だいたい3重以上の多重ループを使ってるやつはそれだけで問題だ。
>>598 なぜ3重以上だと問題なんだ?そんなものはケースバイケースだろうが。
まぁ Stackちっくに、
ちゃんと順番に抜ける方がわかりやすいよな。
可読性が、という話になったらbreak自体が相当性質が悪い
まず、どこに飛ぶかわからない
インデントが最初に低くなった場所と思ってたら
ifによるインデントは無視するから、結構はなれてたりする
結局、breakがどこに飛ぶかをみるには、
ソースの前に戻ってfor, while等を探す
そしてそれに対応する括弧を探すと2ステップ必要になる
さらに、breakを見逃しててループ追加するとバグの温床になる
breakが優れているのは可読性じゃなく筆記性
ラベルつけなくていいからねぇ
結局、そのためのコメントを書いたり。
603 :
仕様書無しさん:04/06/25 16:09
動けばいい・・・最近つくづくそう思うようになってきた。
頼むから動いてくれ・・・毎日お祈りしてます。
>>599 誰にも見せないプログラムというケースならどう書いても動けばいいが。
他人がみなきゃならんから問題なのだよ。
breakの可読性とか、3重ループごときが問題とか、
なんでバカにあわせて、コードを書かなきゃならんのだ?
>>601 break の使い方を理解していないのか?それとも釣りか?
職業としてプログラムを書くのなら、読める人間の比率を最大にするように書くべし
>>607 バカにあわせないとトラブルが起きるから。
コーディング規約がなんで生まれたかも理解できないような環境にいるとわからんだろうが。
>>609 プログラムを知らない奴には読めません、どう書いたって。
今まさに目の前に
while (TRUE) {
switch (〜) {
case 1:
for (〜) {
if (〜) {
break;
}
}
if (〜) {
continue;
}
break;
case 2:
:
: (for と continue と break のつづれ織りが10回ほど)
:
}
}
こんなのがあるんだが
1. break が switch/while/for のどれに対応するのか判り辛く
2. そのくせ continue は switch を飛び越して while に戻る
ここまで汚いコードが書けるなんて、C もまだまだ深いな…
くそ汚い部屋に住み続けてると普通に汚い程度じゃ何も感じなくなるってことか
>>612 2番目の項目は分からないこともないが、
> 1. break が switch/while/for のどれに対応するのか判り辛く
そんなの分からないのお前だけだ。
616 :
仕様書無しさん:04/06/25 18:31
ここは、コードの読解力のないバカどもが、
傷を舐め合うスレですか?
へへん。
>>612程度のソースなんて簡単ジャン。
こんな程度を「汚い」って言う奴は馬鹿にしてやろう。
・・・という心の声が聞こえる気がしたぞ
「複雑さを理解出来る度合い」には個人差があることを知れ
そしてPGが相手にするべき困難さの筆頭に「複雑さ」があることも
618 :
仕様書無しさん:04/06/25 20:04
>>611 だから一切の努力を放棄するわけですか?
言い訳が下手糞すぎますね :-P
タブ2とかタブ4の奴が書きそうなコード
>>591 複数の文をマクロに入れるときの定石。ここで話されている途中breakとは関係ない。
#define a do { x; y; z; } while(0)
if (flag)
a;
みたいに書いても問題がない。
3重のループに関しては漏れも同意する。
そういうのは関数(もしくはメソッド)に切り分けるべき。
3次元の座標を扱ってループさせるみたいな処理は別だけど。
関数指向ってのは別に共通の処理を一箇所にまとめるだけじゃない。
...
i++;
array[i-1][0] = 0;
array[i-1][1] = 0;
...
なぜそこでi++する?
本物のプログラマは第一作目のハーマイオニーが一番好きだ
プログラマーなら
できるだけきれいなコードのみ書くよう努力して
できるだけ汚いコードも読めるよう努力するべきだろ?
俺には無理だが
まあ、汚さが次元を超越しているコードというのも
確かに存在する。
穴埋めの課題として出されたプログラム、
for(){
for(){
if(){
if(){
if(){
}else{
if(){
if();
if(){;}
if(){;}
}
......この後、最初のfor()が終わるまでにif,elseがまだ続く
助けて('A`)
課題として適してないだろ・・・
>628
きっと「このようなプログラムは書いてはいけません」が正解なんだよ…orz
>>628 課題として適してない職場であることを祈ろう
634 :
仕様書無しさん:04/06/26 19:29
>穴埋めの課題として出されたプログラム
実はリファクタリングの例題なのさ
元の動作を壊さずに、理解しやすい形になるまで分解すればよい
世の中、リファクタリングの例題だらけだよ・・・。
>>628は、forがシンプルな2段で、中身は条件分岐だけじゃん。
これ以上、リファクタリングで何か良くなるとは思えないが。
別関数にわけても、見た目はシンプルになるが、動作は追いにくく
なるだけじゃないの。
やろうとしていることが複雑なら、コードはその複雑さより簡単に
なるわけないし、そういうコードを追えないようでは使い物にならない。
>別関数にわけても、見た目はシンプルになるが、動作は追いにくく
>なるだけじゃないの
あふぉでつか
>>638 >やろうとしていることが複雑なら、コードはその複雑さより簡単になるわけない
へぇ
Aが1でBが4,6,12,22
Aが1でBが5でCが2,3,19かDが9
Aが1でBが6か30でDが7より大きい
場合は1を、・・・なら2を・・なら3
て仕様が1000項目も並ぶのがバッチ系
だが、VBで5000行はねえだろ前の前の担当よ
>>638 >>別関数にわけても、見た目はシンプルになるが、動作は追いにくく
>>なるだけじゃないの。
>>やろうとしていることが複雑なら、コードはその複雑さより簡単に
>>なるわけないし、そういうコードを追えないようでは使い物にならない。
処理手順を整理し、段階区切って意味を考え、インタフェースを決めて関数化すれば
動作を追う場合に突き止めたい事に関係ない部分までなめなくても済む。
ひょっとしてCOBOLerの方?
全てグローバル変数渡しのサブルーチンだったら確かに言うとおりだねw
関数化したほうがコールスタックで流れを追いやすいかもね。
>>638 「動作を追う」?違う。
論理構造とデータ構造を把握せずに「動作を追う」のは
木を見て森をみないのと同様だ
相変わらず関数化もままならないコボちゃんがいるスレ
>>601 Javaのbreakはラベルをつけられるんだよね。
方向性としては、これは便利だと思う。
一方でローカルのStatic変数を無くしたのは
もったいないと思うが。
gotoのように無闇に飛び先を設定できない
(具体的には後ろにしか抜けない)から
gotoのようなスパゲティコードになる可能性が低い。
>gotoのようなスパゲティコードになる可能性が低い
なんとかの一つ憶え
スパゲティコード==goto
可能性が低いのは事実ですが何か?
お前こそ脊髄反射レスしてんじゃねーよ。
俺はgccの独自拡張の関数内関数を入れてくれたほうが嬉しいかなぁ…
breakの変わりに関数作ってreturn使えば割と解決する場合が多いんだよね
かといって、クラスとして新たに関数追加するのも面倒…
あと、前に戻るgotoはここ5年ほど使う場面に出くわしたことがない
大概、do〜while構文で間に合うことが多い
てか、gotoのデメリットとしてよく言われるスパゲティコードだが、
breakでスパゲティ作られている方が圧倒的に多いと思う
おまえら子どもみたいな煽りあいして楽しいですか
>>651 >てか、gotoのデメリットとしてよく言われるスパゲティコードだが、
>breakでスパゲティ作られている方が圧倒的に多いと思う
それは「gotoを使うな!」といい続けた結果gotoの量が少なくなっただけ。
「breakやcontinueも使うな!」といい続ければbreakの量も減ってスパゲティも減るだろう。
少年の心を忘れない大人が集うスレはここですか。
楽しいなぁ
「スパゲティを作るな!」
普通の人が書くソース
for(int i=0;i<10;i++){
if(a[i]==0) break;
a[i] = i;
}
>>653が書いたソース
for(int i=0;i<10;i++){
if(a[i]==0){i=10;}
else{a[i] = i;}
}
「日本人なら米を食え!」
>657
for(int i=0;i<10;i++){
if(a[i]==0){
ループの次にやりたい処理
:
}
else{a[i] = i;}
}
ループの次にやりたい処理
:
660 :
仕様書無しさん:04/06/27 01:51
>>657 ループ中にループ抜ける条件が変わるなら
do while使えばいい
「釣ったら食え!」
>>657 知障?
>>653の意味すら汲み取れないなんてマジで心配なんだけど。
gotoの害はさんざん言われてるから変なgotoは比較的少ない。
breakやcontinueの害はあまり言われてないから変なbreakやcontinueはまだまだあるところにはある。
無闇に使うなと全く使うなの区別もつかないなんて。
>662 心配性な方でつね素敵(はぁと)
∩___∩
| ノ ヽ-'''''';、 いろいろ餌がでてくるけどさ、
,,.....-| ● ● | ) 正直クマもおなかいっぱいなのよ…。
”” ; | ( _●_) ミ §
;; 彡、 |∪| 、`\__===・
; / __ ヽノ /´ ――┴;;
; (___) | ―――'"
 ̄ ̄ ̄ ̄ ̄) ,,..-'''⌒;, /
 ̄ ̄ ̄ ̄ / ,,..-.';;-' |
( ,,...-''";;., ";,..-'"
|"”” _,.-|; ;|
|_,,...--''" "'-''"
―――――'"
>>662 マジで言ってるんだったら、他人に迷惑かける前に
(もうかけまくってるんだろうが)プログラマという職業を
辞めてくれ。
チームに馬鹿がいると、邪魔なの。
goto=スパゲティなんて言ってる奴は
80年代からタイムスリップしてきたとしか思えないんだが
これだから最近の本を読んでないとしよりは嫌だよなぁ〜
現役のコボちゃんかしら?
また「gotoの害」かよ。そして「breakやcontinueの害」まで出てきたか。
そんなもん無い。そういう害があるように見えるだけだ。
元凶は「関数がでかすぎるという害」だろ。
>668
>元凶は「関数がでかすぎるという害」
元凶は「設計できてない」だな
>>669 そう。
関数がでかすぎるという害 : 観察結果
設計できてない : 観察結果から導き出される、問題の表明
といったところ
>>667 は、はちじゅうねんだい? お前も10年ほど遅れとるぞ。
672 :
仕様書無しさん:04/06/27 02:42
>>667 ぷぷぷっ80年台なんてCすらできないっつーのww
>672
C言語:1972年頃にDennis M. Ritchieが開発した
です。
goto=スパゲティって話も80年代の話と違うが(w
675 :
仕様書無しさん:04/06/27 03:08
>>674 会社で、C言語が1972年頃できたって話題なったから
「俺といっしょじゃん俺1972年生まれだよ」って言ったら
UNIXヲタの童貞くんに露骨に嫌な顔されたよ。そんでそいつに
そんなことはたいしたこと無いって必死に否定されたよ・・・
アホらしい事思い出した・・・
>>674 ぐぐってみたら、あの"Go To Statement Considered Harmful"って
1968年なのね…。
タイトルコメントにKANEBOと書かれていた。
不審に思い、仕様書を見たら「鐘紡」とかかれていた。
先輩に聞いたところ、あのカネボウで間違いないらしい。
しかもΣ(・A ・ ) ソースキタナイ!!
で、おまいらいつまで「スパゲティソース」なんて
オッサン言葉使っているんでつか?
今の若者は、そんなこと言いませんよ。
今の若者は、
↓
パスタソース
ボンゴレ
スバグェッティ
TK-80が1976年だよなぁ
I/O創刊が78年だっけ?
10年前からGoToの弊害だけは指摘されてたの?
BASIC自体はその10年前からあったと思う。
goto が実装されていたかどうかは知らないけど
n88basicはgotoやgosubだけで、関数という概念が無かった気がする。
だからgotoはあらゆる部分に飛べるから、使いまくると確かにスパゲッティコードになってた。
Cとか関数内しかgoto先にならないような言語では、スパゲッティが出来ても
所詮その関数内だけなんだよね。
だから、Cでgoto使うのは対した問題ではないと思ってる。
main関数に全ての処理を書く、とかされたら泣いちゃうけど。
>>687 n88basicにも deffn がありますよ。1行の数式をユーザー関数化するものなので、あんまり使い物にならないですけど。
Cでのgotoが関数内限定といっても、
構造化プログラミングの要素である「分岐」・「反復」の範疇に入るgotoは許せるけど、
ifやforなどのブロック内に飛び込むといったのは許せないなぁ。
for ループの中に飛び込む switch なんて論外…。
個人的には、脱出のための goto だけは通してる。元々、break、return といった構文があるわけで、その延長上って感じで。
FILE *fp = NULL;
int *ptr = NULL;
if ((fp = fopen(ほげほげ)) == NULL) goto err;
if ((ptr = malloc(ほげ)) == NULL) goto err;
(通常処理)
:err
free(ptr);
if (fp) fclose(fp);
return
みたいな感じ。
こういうのをまじめに if で囲っていくと、どんどん深くなってよけい見にくいと思う。
gosub使えば関数とほとんど一緒じゃん
N88 のレベルになると GOSUB *FOO とかラベル使えるしね。
でもグローバル変数の呪いから逃れられない
グローバル変数しかない、とか
変数とかに好き勝手な名前が使えない、とか
昔の言語ではいわゆるプログラム設計が重要だった
だからといって今時の言語で同じように設計するな!ヤメテクレ!
なんだよ 変数 XXXX0099 って...
692 :
仕様書無しさん:04/06/27 15:15
メソッドの戻り値を文字列で返すプログラムを渡された。
全部のメソッドがそうなっている。
char *getTitleName()
{
if (this->titleName)
return this->titleName;
return "未設定";
}
80年代初頭もスパゲッティプログラムという言葉はあったし、
それはBASICやアセンブラで無茶苦茶なgoto(jump)しまくるコードの
ことを言ってたような気がする。
あの頃はgoto, gosub(jmp/call)をわかりやすく組むのがマナーとされていて、
禁止というわけじゃなかったな。つか、禁止されたら何も出来んw
PCの世界でgoto禁止と言い出したのは、LatticeCやTurboPascalが普及してきた
80年代後半じゃないかな。
694 :
仕様書無しさん:04/06/27 15:24
>>692 ケータイ開発だと、グローバル変数(staticではない)を
返す関数が山のようにあるのが常識ですが、何か?
つーか、static変数ならともかくグローバル変数なのに
値の取り出し、参照が全部関数化されているこのケータイって・・・
>>692 MFCだとCStringの返り値で関数を書くことが結構多いけど、それって問題かな?
MFCだとCStringの返り値で関数を書く、とは一体どゆこと?
test
MFCだとCStringの返り地で関数を書く、ということじゃないかと思われる。
MFCだとCStringの返り地、ってどういう意味?
返り値じゃないのか?
関数を返り値ってどういう意味???
CStringの返り値で関数を書く?
返り値がCStringの関数を書くってこと?
日本語おかしくない?おかしいのは俺?
MFCだとCStringの返りに、血で感数を書くことが結構で、
多い日も安心という意味であろう、おそらくたぶんきっと必ず。
と思う。
それよりもwin開発でしか通用しない、CStringとやらを説明してクレ
推測は容易だが、推測前提でレスできんし
てか、スパゲティの根本ってBASICの実行速度が遅いってのもあったね
そのお陰で、速くて難解なプログラムが尊重されていた時代でもあったし
なんだか貶されてるな…
706 :
仕様書無しさん:04/06/27 19:07
「CStringの返り値」って言語があるんじゃない?
CStringの返り血で書く、とかだったら呪いの呪術っぽくてよいね
呪いの呪術って何だよいったい。
CStringの返り血が血文字で呪いのサバトかよ。意味わかんねぇよ。
「呪いの呪術」って「腹が腹痛」みたいな感じだな
まじないの呪術とか。
スパゲッティソースって言い方はやめゆお
キミの部屋の電気コード風味ソース
でいいじゃないか
ここ、哲学スレかなんか?
void hoge(void)
{
}
な関数使ってる場合、全てグローバル変数・構造体で処理が書いてあって・・・
('A`)
グローバル変数がどう動いてるか分かる術はありまつか('A`)?
無いぞ(w
デバッガによっては特定の変数が変更されたときブレークするものもあるけど
>713
グローバル変数を直接読み書きせず、げったーせったー経由汁!
血で血を洗うソースコード
CString ≒ std::string
>716
>全てグローバル変数・構造体で処理が書いてあって・・・
>グローバル変数がどう動いてるか分かる術はありまつか
って質問だろ?
721 :
仕様書無しさん:04/06/28 02:11
goto 文を使わなくても、
最後に他の関数を呼び出す関数を大量に作成することで
goto文に負けないくらいの可読性を実現できることを最近知り、
目から鱗でした。ある意味、感動しました。
>>720 だから外側から何とかできないと意味ないだろってこと。
そのグローバル変数をトレース出力するマクロを、全コードに一行おきに挿入。
>717
血で皿を洗うソースコード
に見えた徹夜明け
もう、グローバル変数が使える言語は時代遅れだと思うがどうよ
globalというクラスのpublic staticな変数に移行するだけと思われ
727 :
仕様書無しさん:04/06/28 12:37
因みに、ネパール語でウンコの事を、「ゴーバル」という。
>726
変数だけ集めた「グローバル変数クラス」なるものを作って、
ほかのクラスで変数を使うときには必ずそこのを利用するってこと?
class GlobalVal {
public:
static int nFlag0001;
static int nFlag0002;
};
こんなのやだよーw
でも作る奴はいるんだろうな。
こうやってバカは綿々と受け継がれていくんだな……
全メンバがstaticなクラス1つだけで構成されたプログラムとか作りそうな勢いだな。
全てのメンバがpublic staticのDataDivisionクラスとかProcedureDivisionクラスとか
あったりして。
亀レスだがすごいことを発見。
>>459 そのソース見たことある_| ̄|........
>730
バッドノウハウ...
>>730 なんだか、コボちゃんが好きそうな気配が…
>>692 戻り値がchar*自体は問題なし。C言語の標準関にだってある。
ただ、titleNameはおそらくprivateだと思うが、戻り値にconst付けないと意味無し。
>>696 全く問題なし。CString::Left の戻り値だってCStringだから。
738 :
仕様書無しさん:04/06/28 22:34
COBOLerってそんなにクズなの?
ていうかCOBOLってどんな言語?
740 :
仕様書無しさん:04/06/28 22:40
っていうか、COBOLerと同じ給料は納得いかねえ!
オープン系手当つけろや。
新人に COBOL 教える俺。
言葉を発する度に新人の未来をもぎ取っていくような罪悪感を覚える俺。
ババババババ
バイオーハザードバイオーハザード
バッバッバババッバババババババ
バイオーハザードバイオーハザード
バッババババババッバババッバババ
バイオーハザードバイオーハザード
744 :
仕様書無しさん:04/06/28 23:02
>>742 心配するな
反面教師としてお前は満点だ
「ああはなりたくない」という強い意欲をみんな感じてるだろう
745 :
仕様書無しさん:04/06/28 23:31
if (cond1) {
foo();
}
else {
if (cond2) {
bar();
}
else {
if (cond3) {
baz();
}
}
}
else if って知ってるか?
else ifは駄目ってコーディング規約があるところはある。
理由はよく覚えてないけど、インデントがずれる(?)とか言う話。
頭おかしいね
>>745 もしかしてそのコードはelse ifを使ってないと思ってたりして。
もしくは、else ifって構文があると思ってたりして。
でもあえてelse if にしたくないときってない?
条件判断の意味というか系列が違うというか。
if (a > b) { // a と b の比較
・・・
}
else if (a == b) { // a と b の比較
・・・
}
else { // a と b の比較
if (c % 2 == 0) { // c の判定
・・・
}
else { // c の判定
・・・
}
}
みたいな。アマチュア考えですか?
おっと、if,elseの使い方だけな。
そのコメントは異常。
753 :
仕様書無しさん:04/06/29 00:39
俺ならこうコメントする。
if (a > b) {
・・・
}
else if (a == b) {
・・・
}
else {
// a < b
if (c % 2 == 0) {
・・・
}
else {
・・・
}
}
・else if ウゼー
if (a > b) {
・・・
}
if (a == b) {
・・・
}
if(a < b){
if (c % 2 == 0) {
・・・
}else {
・・・
}
}
>>754 else自体をなくそうってのも一理あるんだよな。
実行する条件を見極めるのが非常に容易になるから。
でも実用言語でelse無しだったら、叩かれるだろうね。
if (cond1) {
foo();
}
if(!cond1 && cond2) {
bar();
}
if(!cond1 && !cond2 && cond3) {
baz();
}
>>754 aとかbの値を書き換える可能性は?
現在はなくても、ひょっとして書き換えることがあるかもしれない。
そういうときの保守性のためにもelseは使った方がいいと思う。
>そういうときの保守性のためにも
そういうときが来た時に対応するだけでよいだろ
(aとかbを書き換えるなら目くそ鼻くそ)
>>757-758 まあ上記の
>>753や
>>754の「・・・」の部分でaとbの変更の有無の判断が即座に可能かどうかに依存することだな。
現時点で「即座に判断できる」という状態であっても、将来的にはどうなるか判らんし。
if ( a > b ) foo( ・・・ );
if ( a == b ) bar( ・・・ );
if ( a < b ) baz( c, ・・・ );
とか
if ( a > b ) foo( ・・・ );
else if ( a == b ) bar( ・・・ );
else baz( c, ・・・ );
にすれば「即座に判断できる」という状況は確保出来るぞ(w
どうよ
Select Case Sgn(a - b)
Case -1
なんとか
Case 0
かんとか
Case 1
うんとか
End Select
Cには「else if」と言う構文はない。
if() 文1 else 文2
の「文2」に if 文を書いているに過ぎない。
だから、それが嫌だといってるんじゃん
それはあなたがそう言っているに過ぎない。
>>732 ソレに近いモノの仕様書を見たことはある
それぞれに100前後のメソッドが定義された「業務コントローラ」と呼ばれるクラス群だった
自分が実装担当にならなかったことを神に感謝した
>>759 ここのソースばかり見ていると、aもbもグローバル変数で・・・
ということが想像できるんだが。
グローバル変数好きな奴って多いんだな。
>>766 グローバル変数の仕様を社長に強要されました
「変数を一箇所で宣言しておけばソースが読みやすいだろう」だって
ちなみに社長はコボラー兼マカー
('A`)コボラーキター
確かに再帰で書くときは便利だが、解読性が極度に低下する。
ツケが回ってくるぞ。引数を省略する誘惑に負けるな。
マカーだがグローバル変数はむしろ嫌いだ
σ(^_^ もマカーだが、グローバル変数が嫌いなわけだが。
マカーはグローバル変数よりも糞だから気にするな。
工作員乙。
776 :
仕様書無しさん:04/07/02 03:01
>>730 参照が無くなってクラスがアンロードされて、
次に使うときは初期化されていた
なんてことは無いのかしら
777 :
仕様書無しさん:04/07/02 06:06
はは・・・。
776はこの会社辞めたいと思った上司の一言
C++の処理系は知らないんだが、Javaだとクラス自体がGCの対象になることがある。
その場合staticな変数の領域も削除されてしまう。
C++にも、そんな処理系ある?
C++にはGC自体ないんだが…
そういやそのとおりでした…
>>746 阿呆な話だ、と思ったが
if {
:
}
と常に括弧を書けってゆー規約だったら、else 以降も勿論
else {
:
}
になる筈で、まあ筋は通ってるかも試練。
>>755 if (! cond)
goto cond_else;
:
// cond 時の処理
:
goto cond_next;
cond_else:
:
// !cond 時の処理
:
cond_next:
アセンブラっぽい C。
グローバル変数で質問。
ghInstanceとかghWndとか作るのは普通でもよくあること?
それともそれぞれ引数に付けたり、関数のほうで取得したりする?
異常だけどよくあること。
d
よく使うモジュールにまでghInstanceとかexternしてたから感覚が麻痺しそうになってたよ。
>>783 switch(cond){
case true:
...
break;
default:
...
break;
}
>>784 何事でもそうだが、融通の利かない奴、あるいは物ってのは、
実際には何の役にも立たない。
一方、融通の利きすぎるってのも、これまた何の役にも立たない。
そこらへんの塩梅ってのが、人生の醍醐味じゃあないですかね?
>>784 プロセス起動から終了まで存在してて
しかも値が変わらないようなのは
グローバルでも全然OKじゃないかと思うが。
>>789 プロセスのヒープハンドルをグローバルに置くことは良くやるね。
>>789 値が変わらない事を保証する仕掛けをうっておくべきだと思う。
public class Global {
public static final int HOGE = 256;
public static final int HAGE = 22360679;
・・・
}
一度ハゲちまったら死ぬまでハゲ……
>>784 俺は起動時の初期処理で設定されてそれ以後の処理で変更されない
変数はグローバル変数にする派。
そんな俺から言わせてもらうと、その変数名はいただけない。
>>770 再帰でグローバルって使うと便利な物なの?
スタック使えない場合はグローバルで実装汁
でもあえてグローバルにする必要はあんまりないんじゃないの?
そのようなソースを量産することにより、
俺はここまで派遣期間を伸ばしてきたんだ。
あながち悪いもんじゃないさ。
だ・か・ら、グローバル使わないとできない場合だって
複数関数にわたるような再帰でグローバル使うと便利な場合なんて
あんまりない事ないか?
>>800 誰もそんなこといってない気がするけど言ってるの?
C++ だったねスマソ
Java だとシングルトンが回収されちゃったりするんで
>>803 良く知らないんだけど、
>Java だとシングルトンが回収されちゃったりするんで
ってどういうこと?勝手にクラスがアンロード?されちゃうわけ?
>>804 ちょっと調べてみたら、1.2以降(?)は
ブートストラップローダでロードされたクラスは
アンロードされないのね
首吊ってきま
ところで、終わった話を蒸し返すようでなんなんだが、
このスレ的には
switch(1){
default:
:
処理1;
:
if(なんちゃら)break;
:
処理2;
:
if(なんちゃら)break;
:
処理3;
:
if(なんちゃら)break;
:
:
:
}
なコードってどんなもんだろうか?
>>806 敢えて
do {} while(0)
を使う事を避ける意味は何?
>808
意味は書いたやつに聞いてくれ。
結構よくあるコードなのか、正真正銘の糞なのか知りたかっただけだ。
>>807 ブロックの先頭で異彩を放ってるだけdo{}while(0)よりましか。
>>809 どちらも糞コードだ。
んなことは人に聞かずに、自分で気が付け
>>807 continueでも抜けれるので、do{} while(0)のがまし
switch(n){
case 1:
;
if(...)break;
;
if(...)break;
;
break;
case 2:
;
if(...)break;
;
break;
default:
;
if(...)break;
;
break;
}
ってのなら見たことあるな
どのみち見にくいことには変わりないが
>>812 continueで抜けられると何かうれしいのか。
>>813 そういうパターンでジャンプテーブル使わないのはナンデでしょうか?
関数に切り出してあったほうが読みやすいと思うんだけど…
>>816 ケースバイケースだって何度も言ってるじゃん。
単にジャンプテーブルを否定しただけじゃないの?
ジャンプテーブルはいろんな意味で使いにくいしなー
一行で済む処理、しかも他では使われない処理を
関数に切り出すような愚行はやめてくれよな
ケースバイケースって言って、自分で想像できない奴は糞だ
プ
リ
マ
[ハド]
・・・ム?
プリマドム?
……白鳥の湖をおどる黒い三連星?
>>820 関数に切り出すことの真の意味を分かってないね。
関数名の付け方が重要なんだ。
#define Hoge
#define hoge
/* ... いろんな関数があって */
int
func(Hoge hoge)
{
return 1;
}
>816,817
(1)C++ではないC言語で、コールスタックの消費を抑えたい時。
(2)関数のシグネチャを統一出来ない時。(この場合は統一しないで切り分け、switchで呼べば良いが)
個人的には>813程度なら1画面に収まるし、インデントも浅いから切り分けなんて必要ないと思うが。
試しに>813をジャンプテーブルで実装してみた。改行制限に引っかかるのでやや見にくく書いたがそれは勘弁。
void one( void )
{
;
if(...)return;
;
if(...)return;
;
}
void two( void )
{
;
if(...)return;
;
}
void other( void )
{
;
if(...)return;
;
}
void sample( int n )
{
void (*func_tbl[])(void) = { one, two };
if( sizeof(func_tbl)/func_tbl[0] > n )?
func_tbl[n]();
else
other();
}
連続カキコですまんが訂正…。
誤 : if( sizeof(func_tbl)/func_tbl[0] > n )?
正 : if( n < sizeof(func_tbl)/sizeof(func_tbl[0]) )
sizeofで比較文を書くとwarning が出るんだよなぁ〜
#define SIZE(a) を作っておけばいいんだが…
このサイズを求めるdefineが統一されてなくて4人が4人とも好きな名前で出来てた
みんなで書き加える共通ソースがそれはもう凄いことに…
sizeofで警告が出るか?その警告の意味は分かって回避してるんだろうな?
>>834 signedとunsignedの比較かな?
でも、そうだとすると、
> #define SIZE(a) を作っておけばいいんだが…
ここの意味がわからない。
Cを離れて久しいが、sizeof が返すのは size_t じゃなかったっけ?
警告の件については、下手な小細工使った上にVCなんぞで検証した私の不備です。すんません。
それよか>813と>830-831 を比較した上での、ジャンプテーブルを使わずswitchで書く事の
是非をお聞きしたい。
>>838 ふうん。関数ポインタの配列をジャンプテーブルって呼ぶんだ。知らなかったYo。
どっちでもイイという回答では満足しなそうだな。
この例に限って言えば当然、関数ポインタの配列を使う方が良いさ。
関数参照のオーバーヘッドが無視できるような実行環境ならね。
理由は「シンプルだから」だよ。
#この種の話題の総論は回答しない。あくまで「この例」に限った話だよ
シンプル・・・?
実際のプログラム上では、引数もあるだろうし条件も変わってきて、
各関数内の処理がよほど長くない限りシンプルになるとは思えん
>>838 switch文の中で関数を呼び出す
っていう選択肢はないのか?
まあ、使いたい年頃なんだよ。
いろいろと理由を考えてさ。
もうすぐ、気が付くと思うよ。
ま、よくある話だが、今日引き継いだソースにあったコメント。
if(条件)
{
a=0; //aを1にする。
…
}
else
{
a=1; //aを2にする。
…
}
( ゚д゚) ……?
(つд⊂)ゴシゴシ
(;゚д゚)
(つд⊂)ゴシゴシ
_, ._
(;゚ Д゚) …?!
aは配列の添え字か何かではないだろうか。
ここは定期的にジャンプテーブル厨が沸くインターネットですね。
つーか
switch信奉廚もいいかげんウザイ
別のスレで議論してくれ
どっちもウザイ
ま、よくある話だが、今日引き継いだソースにあったコメント。
if(条件)
{
// "条件"が成立した場合
…
}
else
{
// "条件"が成立しなかった場合
…
}
// delFlgではないが
String[] delFlg = new String[list.size()];
じゃあなんなんだよ、、、、
>841,842
アナタたち、仕様書とかよく読まずに、いきなりコーディングするタイプでっしゃろ。
>845
いや、"a"はどういう画面を表示するか決める結構重要なフラグだったりします。
このソース書いたのは素人で、どうしようもなくなったということで引き継いだんですが、
他にも
g.setColor(Graphics.getColorOfName(Graphics.RED)); //文字列色 黒の指定
とか、
g.drawImage(image11,0,160); //イメージの描画 タイトルブルー
(このimage11ってのは灰色のグラデーションパターンで、タイトルとは関係ないとこで使う)
とか、
ワザととしか思えない罠があちこちに仕掛けられてあります。
(void)printf(...)
(void)strcpy(...)
って書いてるの見たのだが、これって何を意図してるんだろう。
激しくみにくくて鬱。
>>843 ワラタ
>>854 それは「lintにエラーを出させないための処置」。
printfやstrcpyは返り値を持つ。(void)をつけないと
「返り値が無視されている」というエラーがでる。
とある有名なunixカーネルは全てその様な
「lintクリーンなコード」で記述されているのだそうな
お前ら、仕様的にありえないパターンのデータが来たときの
処理ってどうしますか?
例外に飛んで異常終了するようにすれば、
「なんかこの処理が落ちるんで、明日出て緊急で調査して!
(誰だこの糞データ作ったのは!)」とか言われ、
データが悪くてもそれなりに動くようにすると、
「商用環境に不正データが登録されたため、日曜みんなで修正!」
とか言われるしまつ・・・
どっちの方がマシなんですか
それは、「ウンコとカレーの命題」ってやつだ
>>856 そんなデータは捨てる。捨てたことをログに残しておいて、客の(゚Д゚)ゴルァ!!に備える。
「こんな糞データが来たので捨てましたよ、仕様変えるの?」ってな感じで。
>>860 確かにその手が一番効くよな…
前にホスト系糞プロパーと大喧嘩した時に役に立ったよ
(結局政治力の差で屈したが…(涙))
>>858 カレーも喰っちまえばいずれうんこになる、ってことだよね
>860
うちはユーザが画面(他会社作)から操作するアプリなんで、
捨てられないしログもはけなくて、画面にエラーメッセージ
出すしかできないんだよ・・・
しかも、サーバで異常終了したときのエラーメッセージは
「サーバ処理でエラーが発生しました。」←これは仕様で決まってる。
確実に問い合わせが・・・_| ̄|○
>859
ボーナスもらったら決行します。
>863
ログが吐けない,という状況がちょっとわからないんだけど。
そのアプリがローカルなファイルを勝手に作ってはいけないということなら
Winならイベントログ、Unix系ならsyslogに吐いて見るというはどう?
ところでどちらの方法を取っても客のゴルァ電から逃れられないというのを
前提にするなら、より被害の少ない「例外で異常終了」の方がまだましと
消去法で考えるしかないのでは?
DBにありえない糞データが登録されてしまったのを修正するコストの方が
圧倒的に高くつくと思うんだが。
856がボーナスもらうまで耐えれば糞データが登録されても構わないかもな
>>856 辞表出すのは勝手だが、うちは低スキルお断りだからうちにくるなよ
>863
ユーザが他社のアプリで手入力→他社アプリから863のアプリへデータが送信される
っていう構造なの?
だったらまずは他社アプリを吊るし上げるべきなんでは……?
つか、アプリ間でデータの入力許容範囲が異なってるんだよな、それ?
>>863 サーバ側でデータのチェックとかできないのか
不正なデータはサーバ側ではじいてログに吐けばいいと思うのだが、ダメなのか
自動車関係の子会社の会社説明会に行ったときに何か言ってたな。
自動車の部品の仕様書が上のほうからとめどなく流れてくるが、
連絡なしに仕様が変更されるおかげさまで入力インタフェースやらその他もろもろ書き換えるのが面倒だとかなんだとか。
正直、その程度で根を上げてくれると困る。
ま、元々なかったシステム部門を社内の理系社員だけ寄せ集めて作ったらそうなるのも仕方ないか。
>>869 連絡なしに仕様変更する時点で大問題だと思うが。
連絡もせずに仕様変更する事は大問題だが、
連絡したはずなんだけど、なぜか伝わってなかった
ってのは許されてしまうんだよな、
っていうか、ちゃんと伝えろ。
×××データ仕様
そのときの気分で以下の仕様の内いずれか一つが選ばれる。
また、人事異動に際しデータ仕様が変更されるので対応可能にすること。
つまらん
ま、ここでの反応はそんなものか
876 :
仕様書無しさん:04/07/09 22:05
hogehoge.co.jp っていいな。そのメアド欲しい。
>864
そうですローカルに吐けないんです。
そういう時はそこら辺に吐けばいいのか・・・参考にします。
やっぱ例外で異常終了のほうがまだマシでいいか〜
>867
一応メインは
画面でいろいろ選択&入力→サーバーで加工して登録
→作ったデータを別の画面で組み合わせる→サーバー
→・・・
って感じ。なお、サーバーも最初はいろんな会社が作ってたらしい。
うちは下請け(下請けな事は他所には秘密)だから力関係
最下位で、あんまり他社と戦えないのです・・・
>868
できるけどこのパターンの時はあり、このパターンは無しとかだから、
とてもチェックしきれない・・・。
稼動4年目なのでDBの中身が既におかしいことも多数。
昨年他のシステムのDBも吸収して、テーブル数は300超(汗
マツダ自動車
いすゞ自動車
トヨタ自動車
ホンダ自動車
スズキ自動車
>>880 >できるけどこのパターンの時はあり、このパターンは無しとかだから
そ れ を チェックするのが 役 目 だ ろ
>>880 要するに、システムが腐ってるということですね
DBに糞データフラグを作る。これで消すのも楽。
>882
いいえ、「異常データはあるのがおかしい」ので、それをチェックする
予算は下りてないので、役目ではないのです。
そもそも、まず状態遷移ごとの正しいデータパターンを提示してください。
現在のところ、間違ってるか判断する方法が、難解な仕様書と
にらめっこする(たいてい書いてない)か、慣れた人が見る以外に
ないのです。
っていうか、仕様で決まってるチェック項目だけで、毎開発ごとに
デスマーチ・・・
エラーメッセージの文言まで決めてるようなクソ内部規約など便所に流しちまえ
>>863がコーダならご愁傷様。
だがちゃんと働いているなら、現状としかるべき仕様にした場合との比較をして、仕様変更を提示するべきだな。
予算を確保しなくちゃならん。
前者と後者でコストは雲泥の差になるはず。
スーツは予算や経費には敏感な人間が多いから、かならず数字で示せ
>>889 >だがちゃんと働いているなら、現状としかるべき仕様にした場合との比較をして、仕様変更を提示するべきだな。
し か る べ き 仕 様
便利な言葉だ・・・・・
とりあえずサーバーエラーになったときは
次からは弾くようにしてるんでしょ?
ならいつかは安定するじゃん。そういうの好き
>>891 (・∀・)つ_ ザブトンドゾー
>887
つまり、自分達のプログラムは、「はなから正しいデータしか来ない前提」なんだよね。
もしおかしなデータが来たら、それはエラーとして潰すしかない。スルーすることはでき
ない、ってことでしょ。
だとしたら、問題はこっちへデータを渡してくる部分にあるわけだから、そのことはきち
んと伝えなきゃ駄目じゃん。下請けだのなんだのってのは関係ないよ。どうしても他社に言
えないなら直接の元請けにまず伝えて、そっから連携他社にゴルァしてもらえ。
で……もし元請けがやらんようだったら、そんときは抜けること考えた方がいい(会社と
して)。絶対無駄なマンパワー食ってる。
>>894 俺は
>>887じゃないが、下請け(俺んとこは曾々々孫請け)だから
お上には逆らえんのよ。。。
>>895 よくある話だから上のほうの人たちとは仲良くなっておかないとね
>887
>現在のところ、間違ってるか判断する方法が、難解な仕様書と
>にらめっこする(たいてい書いてない)か、慣れた人が見る以外に
>ないのです。
なら、ノーチェックでええやん。後で問題になっても「うちのせいじゃない」
>>897 ここまでの話の流れから察するに>856の置かれてる状況は「ご愁傷様」で
「うちのせいじゃない」が通用しないんだろうけどね・・・。
>なら、ノーチェックでええやん。
学生じゃないんだからさ。
>895
その場合、とりあえず直接の取引先(曽々々孫なら、曽々孫)には言うでしょ。
そこから順繰りに上げてってもらうしかあるまいて。
途中で潰されるのが多いのは確かだけどな。
>899
>例外に飛んで異常終了する
:
>データが悪くてもそれなりに動く
:
異常終了させない & それなりに動かないよーにする
>なら、ノーチェックでええやん。
いや、子供じゃないからこそ責任の所在は明らかにして
しかるべき対処を促すべきだと思うがね。
…現実問題としてそれが可能かどうかはおいておくとして。
要するに、文句いわれたときに、言い返せるだけの準備はしておけと。
905 :
仕様書無しさん:04/07/14 19:52
過去ログ全部読んだわけではないので重複してたらごめんなさい。
でもこんな「オッペケペー」はいないと思います。
main(){
.
whila(1)
.
for(xx;xx;xx)//xxは適当に考えてね!
while(xx){
for(xx;xx;xx){
//この先for, whileのループが15段
}
}
}
}
(既存のすべてをブラックボックスにしてEngineを積んで
イベントでたたいて事なきを得ましたが、、、)
906 :
while(1):04/07/14 20:06
文字化けと、スペースが省略されるみたいで「お見苦しい」カキコをしました。
その2:
#define EMERGENCY 0xFE;
#define EMERGENCY_MASK 0xFE
if((Event && 0xFE)==0xFE){
}
数百箇所の条件分岐がすべて直値で、、、、
>>906 つっこむところは沢山あるが、コードよりも
>数百箇所の条件分岐がすべて直値で、、、、
これが一番謎。
つっこみどころはここじゃないだろうと小一j
909 :
仕様書無しさん:04/07/14 22:23
>>906 論理積だと条件が成立し得ないわけだが…
論理積はビット演算の間違いでしょ。
それくらいは許してやろうよ。
ちなみに
& だろーが && だろーが呼び名は「論理積」で合ってると思います!
あ゙ぅ〜
イライラして眠れません。
うちの部門の環境は、
設計書なし、テスト仕様書なし、プロセスフローなしです。
それでもISOとやらとってますよ。(詐欺みたいなもん)
それから、バグ持ちのプログラムを平気でコピーして利用するので
ウィルスのようにバグが増えてます。
その度にSQLエラーなどなど。
SQLエラーが出るとユーザーに「ここの入力忘れたのがいけなかったんですね」
なんて謝られる始末。
プログラムが悪いんだよぅ。
あと、先輩社員に「あれの仕様変更まだ出来てないの?」 (ちょっと小バカにした言い方)
もうアホかと。仕様変更のテストしているうち、まったく関係ないところの
バグが見つかるんだよ。
>912
TDD汁!
TDD = テスト駆動開発?
ググったら出てきたけど、初めて聞いたなぁ。
915 :
while(1):04/07/15 03:43
経験豊かなエンジニアの皆様に大変失礼いたしました!
if((Event & 0xFE)==0xFE)
と書けばOKでしょうか?問題はHeader-Fileの定義がコードに全く使われていない
のを実機無しのリバースしたもんだから、、、
あるまじめな方は担当部分の直値(上の例では0xFEが該当いたします)をすべて
定義に従って書き換えて動作検証に3ヶ月かけましたが、#defineで三重に名前の変わる
定数、0xAA-> KUSOTTARE -> UNKO_TABERA -> UNCHIを45のソースで各々違う同数の
#include XXXX.H, YYYY.INCに注意しながら書き換えて自律神経の薬を飲んでいる
方を尻目に見ながらそんな時間も与えられず、、、、
まあ皆様のような専門家ならばCD-ROM眼いっぱいの直値コードや17段のループの
ネストにも敢然と立ち向かうでしょうから、このスレにはもう出てきませんので、、、
オブジェクト指向ツールは氾濫してても、「茹で立てのソーメンのザル入り」型ソフトしか存在しない
「技術立国」が知らぬうちに周辺国のCN, NK, SK, TW, VN, に制覇さてしまったのは見ていられません
が、また明るい明日もあるでしょう、、きっと、、、多分、、、、願わくば、、、、、
だって専門家の方々は「新しいC++の文法」に詳しく、見た目に「他人に分からぬコード」を書くのが
「最新流行」のようですから、、、
何が言いたいのかよくわらない。
よくわらない
よくわらない
よくわらない
>>915 こういうのを見ると、いっつも思うんだけど...
「母国語もマトモに使えない香具師に、第二言語は無理」
>>915 >if((Event & 0xFE)==0xFE)
>と書けばOKでしょうか?
普通に
if(Event & 0xFE)
だけでいいんじゃないか?
>#defineで三重に名前の変わる定数
状況がわからないからコメントしにくいけど、#defineで同じ値を別変数として
名前を変えて切ったりするのはそんなに特異なことじゃないよ。
ビット演算に使用する値なんかはよくそういうことをやる。
ただ引き継いだ人間のスキルが低すぎると迷宮入りするけどね。
つうかオブジェクト指向ツールの批判する前にgrepやsedぐらい使えよ。
>>920 1)if((Event & 0xFE)==0xFE)
2)if(Event & 0xFE)
1と2だと動作が違ってしまうが。
>>921 ごめん。
たしかに動作かわっちゃうね。
>>906に#define EMERGENCY_MASK 0xFE って行があったから、
条件を満たしている状態毎にif文きってるのかと勘違いしてたよ。
923 :
仕様書無しさん:04/07/15 10:10
/******************************************
この会社・・・ってわけじゃないけど
倒産した会社のソースメンテナンス頼まれたが、
コメントがニュー速っぽいAAでいっぱいだった。
ミミ彡彡゙゙゙゙゙""""""""ヾ彡彡彡
ミミ彡゙ ミミ彡彡
ミミ彡゙ _ _ ミミミ彡
ミミ彡 '´ ̄ヽ '´ ̄` ,|ミミ彡
ミミ彡 -=・‐' 〈‐=・=- .|ミミ彡
彡| / | |ミ彡 /
彡| ´-し`) /|ミ|ミ |
ゞ| 、,! |ソ <そりゃつぶれるだろ
ヽ '´ ̄ ̄ ̄`ノ / |
,.|\、 ' /|、
 ̄ ̄| `\.`──'´/ | ̄ ̄\
\ ~\,,/~ / \
*****************************************/
条件を満たしているじゃなくて、条件の一部をだな・・・
徹夜明けで頭が朦朧としてて文章になってないな。
駄目駄目じゃん漏れ・・・とりあえず逝ってきます
925 :
仕様書無しさん:04/07/15 19:31
>>911 お前の設計書は怖くて外注に出せない。一生PG汁。
926 :
仕様書無しさん:04/07/15 19:48
ヘ_ヘ
ミ・・ ミ ということにしたいのですね?
( ° )〜
この会社辞めようと思ったのはソースコードせいじゃなくて、
本当の理由は、自分が日本語不自由で周りとうまくコミュニケーション取れなくて
会社に居づらいからなんじゃないのかな?
>914
>初めて
早く始めろ!
DDT汁!
懐かしいったらありゃしない<DDT
占領軍が消毒に使ってたやつだっけ? >>DDT
プロレス技じゃなかったけ?>>DDT
>>936 Google先生によると、技ではなく、プロレス団体そのもののようですね。
>>938 >デンジャラスドライバーテンリュウの略でDDT
それは天竜が言ってるだけ。
もしくは、天竜の使うDDTのみを「デンジャラスドライバーテンリュウ」という。
おいらはシンボル使いたかったのでZSIDでした
磁気テープのことか?
こちらはSIDです…
UFOの…進入を…キャッチしました。
速度は…ソル 1.
ぬるぽ
ガッ
939は橋本ファン
コメントと、関数名と、実際に書かれている処理すべてが合っていないorz
>947
がんがれ。正しいのは唯一、実際に書かれている処理だけ……のはずだ。
/*
* 与えられた2つの Integer の差の絶対値を返す。
*/
public Integer multiple(Integer a, Integer b) {
return a.add(b);
}
>>948 「コメントと処理が合っていないときは、多分両方とも間違っているだろう」
って言うのが通説でして.......
それどころかメソッド名まで
"2つの Integer"ってとこがあってるだけマシじゃないか。。。
ぬる
ぽガッ
957 :
仕様書無しさん:04/07/25 21:30
DBに生パスワードのカラムが!
ソースというよりDB設計です。
世間一般に公開しているシステムなんですが
DBに生パスワードのカラムがあります。
しかも実データのテーブルのバックアップが
/tmp やら / に aaa.csv などの名前であっちこっちに残っています。
下っ端の俺でも、誰でも、見れてしまいます。
えーっと会員数20万人なんですが。。。
ヤバイなこれ。と思いつつも他の大小の問題がたーくさんあって改善できないままでいる。
こういうのってどこでも一緒なのかな?
バックアップが散乱してるのは好ましくないが
DBに生パスを入れるのは場合によるだろ
webメールを実装しようとしたらPOP3の生パスは
どこかに置いておかなきゃならんわけだし
いや、そこは生じゃなくて暗号化しておけよ
DBから取り出す時に複合化して送信されたパスワードとチェックすればいいだろ
DBに入れるレベルなんてポリシーによりけり。
ま、望ましくはないけどね。
DBは普通誰でも見られる状態にはないはずだから
それを誰でも見られるよーってところに問題があるんだと思うよ
バックアップcsvは問題外だけど
安全性から言えば暗号状態で保存しておいて、入力されたパスワー
ドを同じ関数で暗号化した結果と比べるくらいは普通だわな。当然
暗号化には逆演算ができないかきわめて困難なものを。
パスワードを何らかの方法で教えてくれるWebサービスってのは
どっかに生パスワードが保存されてるわけで、かなり不安になる。
>>964 でも、秘密の質問+答え形式のパスワード称号なら
その答えをキーにして暗号化してしまえばいいんじゃないか?
チェックサムみたいなものをつけてれば、一応、でたらめな答えは防げると
966 :
仕様書無しさん:04/07/27 22:11
>>964 >パスワードを何らかの方法で教えてくれるWebサービスってのは
>どっかに生パスワードが保存されてるわけで、かなり不安になる。
なぜそういう結論になるのか教えてくれ。
>>965 普通はパスワード忘れたときのリマインダの話だと思うが(質問と答え)…
>>964 通信路での安全性を考えたら、その方法は使えない場合が多い。
たとえば、APOPのチャレンジレスポンスとか。
これは生パスワードに復元できていないと認証できない。
968 :
仕様書無しさん:04/07/28 00:02
別にチャレンジ&レスポンスでも、
生パスワードを復元できないとならない理由は無いと思うが…
クライアントサイドで2重に暗号化(ハッシュ化)してくれるなら、復元できなくてもかまわないが
APOPだとクライアントは不特定だからそうもいかないだろ
…そうなるか?
ただのハッシュならそういう仕様にしとけば問題ないと思うが?