2012-06-16 2 views
2

вот мой вопрос:Java - Является ли делегирование хорошим решением в этом случае?

У меня огромный класс (HugeClass), и я хотел разбить его на несколько небольших классов (LittleClass1, LittleClass2, ...). Я слышал о делегации. Звучит неплохо, но я думаю, что это не может работать в моем случае. Действительно, мои маленькие классы нужны некоторые из атрибутов HugeClass:

public class HugeClass 
{ 
    // Attributes 
    private Object object1; 
    private Object object2; 
    private Object object3; 
    ... 
    private Object objectN; 

    // Delegation 1 
    private LittleClass1 little1 = new LittleClass1(); 

    // Function delegated in the LittleClass1 
    public void delegated1() 
    { 
     little1.delegated1(); 
    } 

} 

Вот пример класса Делегирование:

public class LittleClass1 
{ 
    public LittleClass1() 
    { 

    } 

    public void delegated1() 
    { 
     // Here, I need object1, object3, and more to work ! 
    } 

} 

Количество атрибутов, необходимых для функции delegated1 может быть большим. Поэтому я считаю, что использование конструктора LittleClass1 не очень удобно.

И поскольку LittleClass1 переопределяет только один метод HugeClass, я не думаю, что LittleClass1 должен расширять HugeClass.

У вас есть идеи по решению? Использование другого шаблона?

Спасибо!

Update

делегированные функции может понадобиться не только переменные экземпляра, но и функции экземпляра:

public class LittleClass2 
{ 
    public LittleClass2() 
    { 

    } 

    public void delegated2() 
    { 
     // I need object2 and delegated1 to work ! 
    } 

} 

Давать HugeClass конструктору может решить эту проблему. Но это хорошее решение?

+5

Было бы неплохо иметь больше знаний о 'HugeClass' и его обязанностей. – dantuch

+3

Вы очень верны в заявлении «Я не думаю, что LittleClass1 должен расширять HugeClass». Мало того, что это будет неправильное использование наследования, но оно также не сработает. Что касается решения, дьявол находится в деталях. Поэтому, пожалуйста, предоставьте их. –

+0

HugeClass содержит все методы взаимодействия с API веб-сайта. В этом случае атрибутами являются, например, переменные API, такие как токен, некоторый заголовок, некоторые заглушки и некоторые особенности программы. – bill0ute

ответ

7

Разрушение огромного класса на более мелкие классы, как правило, полезно для улучшения ремонтопригодности, тестируемости и общего качества кода. Меньшие куски должны быть легче рассуждать изолированно. Вы хотите искать семантически различные функции огромного класса и разделить их на части, сначала на извлечение методов, а затем на извлечение классов. Вы не обязательно ищете шаблон, столько, сколько ищете методы рефакторинга, как в книгах Рефакторинг и Working Effectively with Legacy Code.

Теперь, если ваши маленькие классы, по-видимому, разделяют слишком много переменных экземпляра огромного класса, возможно, вам следует сделать шаг назад и начать с некоторых плотных подвешивающих плодов, таких как код, который не зависит от слишком большого числа переменных ; или попытайтесь найти группировку этих переменных, которые семантически имеют смысл для инкапсулирования в новый объект, что уменьшит количество этих свободных переменных и повысит качество дизайна, так как поиск скрытых концепций в дизайне делает код более явный и понятный.

ОБНОВЛЕНИЕ: Кстати, наследование действительно не очень хорошая идея. Вы хотите отделить проблемы, а наследование - еще один более тонкий способ общения.

+1

Это гораздо лучший ответ, чем другие. 1+ по голосу. –

+0

Мне бы хотелось избежать создания новых классов, которые будут содержать переменные экземпляра, но я думаю, что это лучшее решение. Спасибо, что Жордан! – bill0ute

+0

О, я забыл упомянуть что-то важное: функции, делегированной1, может понадобиться функция делегированная2 (в LittleClass2). Делегированным функциям нужны не только переменные экземпляра, но и функции экземпляра. Решением может быть включение HugeClass в параметр конструктора каждого LittleClass. Но это не кажется прекрасным. Вы видите другое решение? – bill0ute

0

Похоже, вам просто нужно LittleClass1 подкласс HugeClass и его поля protected:

public abstract class HugeClass { 
    // Attributes - now protected instead of private 
    protected Object object1; 
    protected Object object2; 
    protected Object object3; 
    ... 
    protected Object objectN; 

    -- Note: No delegation, no reference to LittleClass1 here  

    public abstract void delegated() 

} 

public class LittleClass1 extends HugeClass { 

    public void delegated() { 
     // Here, you have access to object1, object2 etc 
    } 
} 
+0

Я уверен, что делегирование не работает таким образом, что защищенные поля от родителя будут совершенно разными экземплярами, чем те, которые хранятся в текущем активном экземпляре HugeClass. Извините, но ваше решение кажется неправильным использованием наследования. Подумайте об этом, а затем удалите этот ответ. -1 проголосовать. –

+0

На самом деле, я попробовал эту опцию. Когда вы создаете объект HugeClass, он инициирует объект LittleClass1 для делегирования. LittleClass1 расширяет HugeClass, поэтому вы снова инициируете родительский класс, который снова стимулирует класс делегаций LittleClass1 и т. Д. Я не уверен, что я понятен. Но это не работает. – bill0ute

+0

@ bill0ute: и я не удивлен. Вы выбрали правильный ответ. –

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