52
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

業務で見たクソコード・クソ設計

Last updated at Posted at 2016-02-28

業務で見た「クソコードor設計」をまとめます。

Database関係のクソ設計/クソコード

テーブルに主キー制約がない

たとえばこんなテーブル。

CREATE TABLE user (
  id bigint NOT NULL,
  subid bigint NOT NULL,
  name character varying(50)
);

idsubidの複合主キーのように見えますが、主キー制約(PRIMARY KEY)がないので、主キーは分かりません。
主キーを調べるには、テーブルの中身を確認する必要があります。

1つの列に複数の情報を格納している

たとえばこんなテーブル

CREATE TABLE CAR (
  id bigint NOT NULL,
  type character(6) NOT NULL, /* [分類Aのコード][分類Bのコード]*/
  CONSTRAINT car_pkey PRIMARY KEY (id)
);
/** 分類1コード: A00, 分類2コード: B00 */

「分類AがXXX AND 分類BがYYY」の条件で絞り込むには、下記のWHERE句を使います。
WHERE type = XXXYYY`

分類Aと分類Bをパラメータで受け取る場合は、下記のWHERE句を使います(#~#が変数)。
WHERE type = #type1Code# || #type2Code#

このテーブルでの問題点は、以下の通りです。

  • 分類1コードのみでLIKE文を使いたいとき、文字列処理が必要。
  • 「分類1コードは昇順、分類2コードは降順」でのソートがめんどくさい。

はい、不便ですね。
なんでこのDB設計にしたのだろう。。。

Javaのクソ設計/クソコード(システムB)

クラス名がA001など、分かりやすい名前でなくコード値

クラス名からは何の機能かさっぱり分かりません。
じゃあどやって探すのかというと、クラス名の一覧が書かれたExcelファイルがあるので、そこから探していきます。

SQLで簡単に実現できることをJavaで書いている

SELECT文では単純に絞り込むだけで、Javaの方でループしていろいろ処理しています。
「ある分類ごとに合計値や比率を出す」みたいなちょっと複雑な処理になると、Javaで書いてしまっている。
partion by/OVER句やwindow関数を使えば、全部SQLで書けるのに...

CSSのクソ設計/クソコード

ヘッダなど共通コンポーネントなどのスタイルが、各画面専用のCSSに定義してある

こんな感じで、1つのHTMLに対して1つのCSSを作っています。

register.html
<link rel="stylesheet" href="register.css">

で、register.cssにヘッダやフッター、ナビゲーションバーなどのスタイルが定義してある状態。
で、こんなCSSが200個ほどある状態。。。

ヘッダのスタイルを変えたいとき、100個のファイルを修正する必要がある。。。

例外の握り潰し

あえて言うまでもないでしょう。せめてログにエラーの内容を出力してくれればよかったのに。。。

HTML関係

「〇」などの全角記号を画像で表示

英語化対応のためだそうですが。。。
HTMLの文字コードはShift_JIS。UTF-8にする、もしくはHTML参照文字を使えばよかったのでは。。。

Servlet/JSP関係

requestスコープを使わずに、sessionスコープにたくさんの情報を設定する

たぶんrequestスコープを知らなかったんでしょうね。
そして厄介なのは、設定する情報は別物なのに、同じキーを使っていること。
全然関係ない機能の副作用で、(cast)getAttribute(key)したときに、「キャストできない」というエラーが発生してしまいます。

せめてキーを変えるか、使い終わった後にremoveattributeしてくれればよかったんですが。

まとめ

書いてみて思ったこと。
私の思うクソ設計/クソコードは、
「言語の基礎を理解していないような、設計/コード」
です。

「1つの列に複数の情報を格納する」の話も、データベースの基礎を知っていれば、上記のような設計/コードにはならないと思います。
というわけで、基礎を学びましょう。

参考図書

SQLアンチパターン Bill Karwin著 オライリージャパン

52
47
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?