2013-07-30 3 views
1

У меня есть проект, в котором классы Entity Classes и Business смешиваются. Сущности beans являются частью бизнеса, и все они используются во всем проекте.Смешанная сущность и бизнес-классы - Необходима помощь в рефакторе

Как лучше всего переформулировать эти классы для разделения этих слоев. Я также хочу, чтобы изменения в исполнителей были минимальными, насколько это возможно. Желательно никаких изменений, иначе сотни ссылок должны быть обновлены. Как мне переименовать классы и работать через это?

Пример смешанного кода:

// 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

Для пользователя, который вы передаете пользователю, было бы разумно, что в объекте «Пользователь» будет присутствовать нечто вроде «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; 
    } 
    .... 
} 

Создан новый класс Entity (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. Исходный язык будет устаревшим.

Оставить отзыв об этом решении. Другие решения более чем приветствуются!

 Смежные вопросы

  • Нет связанных вопросов^_^