7.クラスによるタイプコードの置き換え

こんにちは管理人(@vip___p)です。

今回はリファクタリング/タイプコードの置き換えについて触れていこうと思います。

そもそもタイプコードとはご存じでしょうか。

種別の値を数値として表すことです。

結構使用されています。

このタイプコード、デメリットもあります、

詳しく紹介したいと思うので興味がある方や

下記のような方は是非参考にしてください。

  • Java初学者
  • Java初学者
  • リファクタリングについて興味がある方
  • リファクタリングについて興味がある方

リファクタリングについては下記の記事で簡単にまとめているので是非参考にしてください。

下記のような方は是非参考にしてください。

  • Java初学者
  • Java初学者
  • リファクタリングについて興味がある方
  • リファクタリングについて興味がある方

書籍:[Java言語で学ぶリファクタリング入門]
ヌルオブジェクトについて触れていきます。

クラスによるタイプコードの置き換え

冒頭でも簡単に触れましたが

オブジェクトの種別を数値として表したものです。

簡単なコードを確認しましょう。

public static final int name = 1:
public static final int skill = 2:
public static final int drink = 3:

“1”と”2″と”3″の値がタイプコードになります。

コードを見るとあーこれかと思う方も多いのではないでしょうか。

以前紹介しましたがマジックナンバー

(static final)シンボリック定数に置き換えています。

詳細は下記の記事を参考にしてください。

1.定数によるマジックナンバーの置き換え

デメリット

このタイプコードを使用するデメリットは大きく2つです。

  • 範囲外の値が使用される
  • 他のタイプコードと間違える

等があげられます。

範囲外の値を使用される

サンプルコードのnameint型です。

int型だったら想定外の数値(nameなら1以外の値。5や10)を与えても実行時に気づくしかありません。

他のタイプコードと間違える

今回のサンプルコードだったら複数のタイプコードを使用しています。

名前・スキル・飲み物

今回は3つしかありませんが、

倍以上のタイプコードがある時等こんがらがって

コーディングミスなど招いてしまうかもしれません。

当然int型ならば数値以外はコンパイル時にエラーとして認識しないので

先ほど同様修正箇所は実行時に気づくことになります。

このような誤りをコンパイル時に気づくことができるのが

クラスによるタイプコードの置き換えです。

修正前コード

Itemクラス

public class Item {
  public static final int NAME= 1:
  public static final int SKILL = 2:
  public static final int DRINK = 3:

 private final int typecode;
 private final String title;

 public Item(int typecode,String title)
 this.typecode = typecode;
 this.title = title;
 // getter

 publlic String toString() {
  return getCode() + "/" getTitle(); 
 }
}

mainクラス

public class Main {
 public static void main(String[] args) {
  Item book = new Item(Item.NAME,"世界史");
  Item human = new Item(Item.SKILL,"技術力");
  System.out.println(book.toString());
  System.out.println(human.toString());
 }
}

出力結果

0世界史
1技術力

修正後

ItemType

// NAME SKILL DRINK タイプコードの代わり
public class ItemType{
public static final Type NAME = new ItemType (1);
public static final Type SKILL = new ItemType (2);

private final int type;

private Type(int type) {
 this.type = type;
}
public int getType(){
return type;
}
}

main

public class main {
   public static void main(String[] args) { 
     Item book = new Item(Item.NAME,"世界史"); 
     Item human = new Item(Item.SKILL,"技術力"); 
     System.out.println(book.toString()); 
     System.out.println(human.toString()); }
}

Itemクラス

public class Item{
private final ItemType _itemtype;
private final String name;
private final int price;
public Item(ItemType itemtype,String name,String skill){
_itemtype = itemtype;
this.name=name;
this.skill=skill;
}
//getter
public String toString() {
return _itemtype.getType()+getCode() + "/" getTitle(); 
}
}

タイプコードを表すクラスが増え他のタイプコードと混同することがなくなりました。

まとめ

まとめ

今回のまとめです。

タイプコードの置き換えについてまとめました。

皆さんの参考になれば幸いです。