2013-07-30 64 views
1

我有一個項目混合了實體類和業務類。實體bean是業務的一部分,全部用於整個項目。混合實體和業務類 - 需要重構幫助

我該如何最好地重構這些類來分離這些圖層。我也想盡可能減少實施者的變化。最好不要更改,否則需要更新數百個參考文獻。 我應該如何重命名類並通過這個工作?的混合碼

實施例:

// Mixed business-entity class 
public final class Language { 
    private final Long id; 
    private final String code; 
    private final String description; 

    //Constructor 
    public Language() { 
    } 

    //getters and setters 
    public String getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    ... 

    //Business is a part of this class 
    public static Language findByUser(User user) { 
     Language language; 
     ...implementation to find user language... 
     return language; 
    } 

    .... 
} 

// Implementing class 
public class Messenger { 
    public Messenger() { 
    } 

    public static void sendEmail() { 
     ... 
     Language emailLanguage = Language.findByUser(user): 
     ... 
    } 
} 

欲separte那些層中:

// Entity Class 
public final class Language { 
    private final Long id; 
    private final String code; 
    private final String description; 

    //Constructor 
    public Language() { 
    } 

    //getters and setters 
    public String getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 
    ... 
} 

//商務艙

public final class LanguageImpl { 
    public LanguageImpl() { 
    } 
    public static Language findByUser(User user) { 
     Language language; 
     ...implementation to find user language... 
     return language; 
    } 
    .... 
} 

提供最小的變化實現類,優選沒有變化。否則,由於遍及代碼庫的引用,很多工作將會到來。

// Implementing class 
public class Messenger { 

    public Messenger() { 
    } 

    public static void sendEmail() { 
     ... 
     Language emailLanguage = Language.findByUser(user); 
     ... 
    } 
} 

我該如何解決這個重構問題? 我應該如何重命名我的課程?

任何想法都會非常有幫助!謝謝!

+0

對於findByUser,你傳入一個用戶,這將是有道理的,像「user.currentLanguage」或「user.getCurrentLanguage()」會出現在「用戶」實體,這使得該功能是不必要的。 –

回答

0

這是我的解決方案。請檢查並接受,如果它看起來不錯。謝謝!

混合的業務實體類被重新用作包裝類。這使得可以在不需要進行任何更改的所有實現類中重新使用它。

public final class Language Extends LanguageImpl{ 
    private final LanguageEntity languageEntity; 
    //Constructor 
    public Language(LanguageEntity le) { 
     languageEntity = le; 
    } 

    //Wrapper method 
    public static Language findByUser(User user) { 
     LanguageEntity le = findEntityByUser(user); 
     Language language = new Language(le); 
     return language; 
    } 
    .... 
} 

新包中創建了一個新的實體類(LanguageEntity)。這避免了與原始混合類(語言)的包和命名衝突。混合類中的所有實體字段和方法都將移至此處。

package com.test.entity; 
public final class LanguageEntity { 
    private final Long id; 
    private final String code; 
    private final String description; 
    //Constructor 
    public LanguageEntity() { } 
    //getters and setters 
    public String getId() { return this.id; } 
    public void setId(Long id) { this.id = id; } 
    ... 
} 

新包中創建了一個新的業務類(LanguageImpl)。所有業務方法均移至此處。原來的混合課程將擴展這個新的商務課程。

package com.test.impl 
public final class LanguageImpl { 
    //Constructor 
    public LanguageImpl() {  } 
    //Business is a part of this class 
    public static LanguageEntity findEntityByUser(User user) { 
     LanguageEntity language; 
     ...implementation to find user language... 
     return language; 
    } 
    .... 
} 

這是一個不需要改變的實現類。數百個實施地點保持不變,節省了大量工作。歡呼!

public class Messenger { 
    public Messenger() { } 
    public static void sendEmail() { 
     ... 
     Language emailLanguage = Language.findByUser(user): 
     ... 
    } 
} 

並且爲了將來的發展,將使用新的LanguageEntity和LanguageImpl組合。原始語言將被棄用。

請對此解決方案留下意見。其他解決方案更受歡迎!