Long Parameter
public 学名 find学名(
界,
門,
亜門,
上綱,
綱
)
または、共通項を見つけて、新
規のクラスにすることも有効。
※主キー項目で一つのクラス
にまとめるのはあり。
public 学名 find学名(
種別
)
public class 種別 {
private 界 界;
private 門 門;
private 亜門 亜門;
private 上綱 上綱;
private 綱 綱;
}
Slide 17
Slide 17 text
重複コード。
ただし、判断が難しい。
DRY(繰り返しを避ける)より、
SRP(単一責任の原則)を意識し
たほうが良い。
Duplicate Code
private static int userId = 0;
private static int issueId = 0;
public static int takeUserId() {
return userId++;
}
public static int takeIssueId() {
return issueId++;
}
private static int id = 0;
public static int takeId() {
return id++;
}
// あとから、userIdはUUIDで発行したくなっちゃった…
// ※ UUID(Universally Unique Identifier)
// 例 (550e8400-e29b-41d4-a716-446655440000)
?
Slide 18
Slide 18 text
Magic Number
固定値。
単純な数字ではなく、数字に意味
を持たせて表現する。
public void addPlayerPoint(){
switch (point) {
case 0:
this.point = 15;
case 15:
this.point = 30;
case 30:
this.point = 40;
}
}
public void addPlayerPoint(){
switch (point) {
case ZERO:
this.point = ONE;
case ONE:
this.point = TWO;
case THREE:
this.point = FOUR;
}
}
Slide 19
Slide 19 text
Comments
コメントが大量に
用いられている状態。
個人的にはJavaDocに書くのはOKだ
が、JavaDoc嫌いな派閥もいる。
メソッドの責務が多すぎるときに
発生しがち。
例なし
※コメント書くなら意識したほ
うがいい。
コードには How
テストコードには What
コミットログには Why
コードコメントには Why not
Slide 20
Slide 20 text
Arrow
if が大量に使用されている状態。
早期リターン や 別メソッドに切り出
して、脳みその一時領域を解放して
あげるべき。
public void arrow(){
if (A != null){
if (B != null){
if (C != null){
if(D != null) {}
}
}
}
// ここで、AやBを使うかも…
}
public void arrow(){
if (A == null){
return;
}
if (B == null){
return;
}
・・・
}
Slide 21
Slide 21 text
★
Primitive
Obsession
プログラムが用意した型しか使って
いない状態。
プリミティブ型のint , long等
だけの話ではない。
自作型にすることで、fromXXToYY
-> toYY
だけで伝えられるようになる。
public String fromJaToEn(String ja){
return this.translate(ja);
}
public English toEn(Japanese ja){
return this.translate(ja);
}
public abstract class Language{
String 文字;
}
public class Japanese extends Language{}
public class English extends Language{}
Slide 22
Slide 22 text
★
Primitive
Obsession
List や Mapも対象。
単純なListではない限り、
同じListでも違う挙動をする可能性
があるので、別クラスにした方が良
い。
通称:FCC
(First Collection class)
public class Duel{
List deck; // 山札
List trash; // 捨て札
List banish; // 除外
}
public class Duel{
Deck deck; // 山札
Trash trash; // 捨て札
Banish banish; // 除外
}
public class Deck{
List deck;
}
…
Slide 23
Slide 23 text
★
Feature Envy
別のクラスの値を使用して、処理し
ている状態。
対象クラスの情報が流出してしまっ
ている。
流出後の処理は追いづらく、リファ
クタリングが困難になる。
public void Deck{
List deck;
public Card searchMagicCard(){
for(Card card: deck){
String type = card.getType();
if (”magic”.equals(type))
return card;
}
}
}
public void Deck{
List deck;
public Card searchMagicCard(){
for(Card card: deck){
if (card.isMagicCard())
return card;
}
}
}
Slide 24
Slide 24 text
★
Data Clumbs
本来は一か所で管理されているべき、
データが散らばっている状態。
掲載開始、終了の掲載期間や
X, Y, Zの座標等。
public class Notice{
String id;
String description;
LocalDateTime displayStart;
LocalDateTime displayEnd;
}
public class Notice{
String id;
String description;
Term displayTerm;
}
public class Term {
LocalDateTime start;
LocalDateTime end;
}
Slide 25
Slide 25 text
Code Smells の 一部抜粋
★ Large Class
★ Long Method
★ Long Parameter
★ Duplicate Code
★ Magic Number
★ Comments
★ Arrow
★ Primitive Obsession
★ Feature Envy
★ Data Clumbs
Slide 26
Slide 26 text
Code Smells の 一部抜粋
★ Large Class
★ Long Method
★ Long Parameter
★ Duplicate Code
★ Magic Number
★ Comments
★ Arrow
★ ドメイン知識不足
○ Primitive Obsession
○ Feature Envy
○ Data Clumbs