« フォーガットン | メイン | ケロロ軍曹と伝説巨神イデオン(その2) »

駄目なコード

あまり知られていないがソフトウェアを書くことを生業としている.

今日は普通にコードを書く作業を6時間.デバッグおよび調整作業に5時間.
今現在は半導体製造装置関連の画面プログラムを作成中なのであるが,客先要求により,新たに画面を追加することになった.その画面には,表(テーブル)を表示するのだが,まぁ,似たような画面があるのでそのコードを利用して作ることにするのが普通だ.
テーブルに表示する内容をデータベースから読み込んでの部分は「普通にコードを書く作業」で,ほぼ完了.この時点では,テーブル全体のサイズや各コラム幅や行の高さなどは適当なサイズのままだ.
データベースの内容をクリアしたり,更新したりして,表示される内容に間違いがないかどうか確認.
さて,テーブルのサイズの調整だ….こんなもの1時間もかからないで終わるだろう.と普通なら考える.
そりゃあそうだ.最悪でも見た目のサイズをハードコーディングしてしまえばできてしまう.なのに5時間もかかった.

このプログラムで使うテーブルは,この画面プログラム用に特化してあり,各行の高さやコラム幅,コラム数やコラムヘッダに表示する文字列をiniファイルから読み出して表示するようになっている,全体の大きさは,コラム幅の合計と行の高さに行数をかけたものから算出するようにできている.
全体サイズを求めるメソッドは以下のようなコードだ.

/*-------------------------------------------------------
  setTableSize
  戻り値:なし
  機能 :テーブルのサイズを決め
--------------------------------------------------------*/
void SE95Table::setTableSize()
{
  int subW = 0;
  int subH = 0;
  int w = 0;
  int h = 0;
  int i;

  for(i = 0; i < numCols(); ++i ){
    subW = subW + getIniNum(COL_WIDTH, i+1);
  }

  int rowHeight = getIniNum(HEIGHT);
  for(i = 0; i < numRows(); ++i ) {
    this->setRowHeight(i, rowHeight);
  }

  subW = subW + 4 + (getIniNum(WIDTH));
  subH = 4 + ( numRows() + aTopFlag) * getIniNum(HEIGHT);

  w = EXTENT_SIZE + subW;
  h = EXTENT_SIZE + subH;

  if (aIgnoreMaximumSize) {
    setMaximumSize(subW, subH);
    return;
  }

  if( subW > MAXFORMWIDTH ){
    if( subH > MAXFORMHEIGHT ){
      setMaximumSize(MAXFORMWIDTH, MAXFORMHEIGHT);
    }else if( subH <= MAXFORMHEIGHT && MAXFORMHEIGHT <= h ){
      setMaximumSize(MAXFORMWIDTH, MAXFORMHEIGHT);
    }else if( h < MAXFORMHEIGHT ){
      setMaximumSize(MAXFORMWIDTH, h);
    }
  }else if( subW <= MAXFORMWIDTH && MAXFORMWIDTH <= w ){
    if( subH > MAXFORMHEIGHT ){
      setMaximumSize(MAXFORMWIDTH, MAXFORMHEIGHT);
    }else if( subH <= MAXFORMHEIGHT && MAXFORMHEIGHT <= h ){
      setMaximumSize(subW, subH);
    }else if( h < MAXFORMHEIGHT ){
      setMaximumSize(subW, subH);
    }
  }else if( w < MAXFORMWIDTH ){
    if( subH > MAXFORMHEIGHT ){
      setMaximumSize(w, MAXFORMHEIGHT);
    }else if( subH <= MAXFORMHEIGHT && MAXFORMHEIGHT <= h ){
      setMaximumSize(subW, subH);
    }else if( h < MAXFORMHEIGHT ){
      setMaximumSize(subW, subH);
    }
  }
}

もう駄目だ・・・.
スクロールバーの表示有無でサイズを変えたりしようとか,画面に設定できる最大値が決まっているので,それを超えるような場合は,超えないようにしようとかしているようだが….上のコメント部に「テーブルのサイズを決め」とあるが,これは,このコードを書いた人間にとっては間違いではなく,あちこちにでてくる.同様に「getIniNum()」というメソッドはiniファイルから値を読込むものだが,そこのコメントには「iniファイルが読込み」というように,もの凄くキモチ悪い文章が書いてある.まぁ,このコードを作ったのが中国の人なので,日本語が上手くできないのは仕方ないが,それにしても,本来理路整然としているはずのコードの中に,小学生でも間違い様のないレベルの変な日本語が混ざっているのを観なければならない,この心理的苦痛は,ソフトウェアを生業としている人間にしか分かるまいといったところだ.
まぁ,それ以前に上に示したコードはとにかくキモチ悪い.

そういうキモチ悪いコードは,排除してクリーンアップすれば良いのだが・・・.これが先ほども書いたようにiniファイルの値を読んで表示を行うため,コードを変えたら,iniファイルも全部変えなきゃ駄目なんですよ.既に20個程度のテーブルを使ってるし,また仕様違いのプログラムが既に客先に何種類も出荷済みなので,それも難しいのだ.

結局,上のコードはイジらずに,設定する値で逃げたんだが(なので最終的にはデバッグにはなっていない),その値を見つけるのに5時間もトライ&エラーですよ….

ともかく,駄目なコードの影響は計り知れないのですわ.

まぁ,単なる愚痴.

トラックバック

このエントリーのトラックバックURL:
http://www.87noki.com/bin/mt-tb.cgi/90

コメント (5)

Very nice site!

Hello! cebeede interesting cebeede site!

Hello! bdgdedd interesting bdgdedd site!

んー,会社がソフト屋ではないので,コードの質をそれなりに維持(ソフトの世界では常に進化ね),また,その維持していくべくモチベーションを維持するのが,なかなかに大変.
上のコードを書いた中国の人も会社辞めちゃったし,そりゃあ,苦労はするけど,何年か一緒に作業していればコードのクセも分かってくるので,どのくらいのレベルの作業なら任せられるかとか,そういう間接的なノウハウすら育てられない,この状況.新人も入ってこないしねぇ~.
本来,管理職なのに,やってることはバリバリのプログラマレベルから.画面に表示される一文字の変更,1ドットのサイズ変更すらも,わしの手でやってますから.まぁ,プログラマ家業も悪くはないんだけど.

んーコード分かりません(笑
もうプログラマーな人にはついていけ..(笑

コメントを投稿

 RSSリーダーで購読する

カレンダー

2005年07月
Sun Mon Tue Wed Thu Fri Sat
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
Powered by
Movable Type 3.35