業務で見た「クソコードor設計」をまとめます。
Database関係のクソ設計/クソコード
テーブルに主キー制約がない
たとえばこんなテーブル。
CREATE TABLE user (
id bigint NOT NULL,
subid bigint NOT NULL,
name character varying(50)
);
id
とsubid
の複合主キーのように見えますが、主キー制約(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を作っています。
<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つの列に複数の情報を格納する」の話も、データベースの基礎を知っていれば、上記のような設計/コードにはならないと思います。
というわけで、基礎を学びましょう。