kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

リファクタリング(というか書き直しに近い)をやる

最近、自分が書いたクソなコードを修正してる。
javaを初めて書いたころのソースなんだけど、そりゃぁもうひでぇひでぃ。
どうやったらここまでひどくなるんだ?と自分に問いたい。

リファクタリングって言っても
おそらく時間はないからjsp内の修正までは手が回らないだろう。どうしよ。
せめてjavaコードに対してテコ入れする。
ここ1年で覚えた&勉強したことを現行のソースに加えていこうと思う。
最大限やるつもり。(あくまでつもり)

環境は、以下の通り

WEBコンテナ tomcat5.0
JDK java-j2sdk1.4.2
Eclipse 3.1のWTP1.0(All-In-One-Eclipse210で開発してた)

TomcatJDKのバージョンは変更しない。

eclipse 3.4のpleiades提供のものを使う。

先取りが好きなんで、Ganymedeを使う

リファクタリング以前に、現状の問題と対応を整理していくと

  • MVCモデルとか、viewとかコントローラーとか、Actionとか、Daoとか、J2EEパターンとか何も意識してないからコードに一貫性がない。
    • 保守性は最低最悪。ソースを追っかけて追っかけて追いかけて疲れる。(追いかけた自分が迷子になるくらいってのは言い過ぎだけど、それに近いものがある)
    • Servletで直にDaoを呼び出し、例外のSQLExceptionなどをstackTraceだけしている。
    • メソッドの引数がパラメータ(引数が10個とか越えてる)になってる。DTOやEntityを渡すべき。
  • オブジェクト指向デザインパターンがなってない。
    • newしてインスタンスを生成してる意味がようわからん。
    • クラスを使うためならばnewとしか考えてなかったってことかな。
    • Factoryとかが存在せずnewばかり。newしないと思ったらutilじゃないのにstaticだよ(ぼけ)。
  • パッケージ構成(とか)が機能ごとに分かれているのだけれど、機能ごとのパッケージ配下の構成がむちゃくちゃ。
    • beanとかServletとかパッケージ分けされずに、機能のルートパッケージになっていたりする。
      • パッケージ構成を一貫性のあるものに換えよう。
  • ソースを追うことはできるが、function(関数、メソッド)の嵐になっている。
    • オブジェクト指向でいうところの再利用性がない(再利用ってことが意識されていないから、コードの全面書き換えが必要)。
    • クラス名が好ましくない。Xxxx機能名.javaとなってて、それがLogic(Service)なのかDaoなのか不明。
  • Daoクラスなのにstaticなメソッドばかり。
    • DBに対して、insert、updateするのに普通はstaticにする必要性なんてまったくない。
  • 中途半端にstrutsを使ってる
    • 一部の機能でstrutsを使い、それ以外はまったくもって使っていない。
    • servletをつかってる。抽象クラスのServletは用意しているが何もしていない。ただ継承しているだけのAbstractServletになっている。せめて共通処理とかやれよ。
    • jsp内でstrutsのタグ(htmlとか)、jstlとかほとんど使ってない。XSS対策の脆弱性がある。
    • strutsを使ってる部分では、Filterクラス(SetCharacterEncodingFilter)でUTF-8エンコードしているが、strutsを使っていないものはMS932(Wjindows-31J)となっていたり、エンコードしていない場合もあったり、1つのアプリでエンコードがばらばら。JSPのpageEncoding、contentTypeもUTF-8とMS932が混在しまくり。もちろん、それにともなってJSファイルのエンコードもばらばら。
  • Filter
    • フィルタで何してるんだ?ってくらい処理している内容が不明。
    • セッションチェックでFilterを使ってるんだけど、チェック除外URLなどの指定がむちゃくちゃ。パラメータ名で分けたりしてる。
      • 初期化パラメータをweb.xmlに定義するように変更する。
      • もちろん、MapやSet(HashSet)に除外URLをセットしておいてチェック対象URLかどうか判定するようにする。


ここまでくると、よくこんなソース書いたよなーと思える。オマエ(俺)はアホか。失格だ。

最後に、

  • strutsに変更できる箇所は、ServletstrutsのActionに変更する
  • Action,Logic,Dao,Entityなど責務を明確にし、後からみてわかるように分ける。
  • Daoパターンを適用できる箇所は、Entityを引数にしたりするように変更する
  • このリファクタリングで学ぶべきものは何か考える。
  • クソなソースを書いてたから、まともに近いソースがかけるようになった。