Подскажите паттерн.
От: loknalori Россия  
Дата: 05.07.07 12:57
Оценка:
Ситуация выглядит так:
class A;/*класс А. Он вызывает нужный МЕТОД*/

clas B:A;/*имеет некоторый enviroment, параметры которого нужно передать в МЕТОД, но класс А,
не знает о том что есть enviroment, а класс B не должен знать что есть вызов такого МЕТОДЕ*/

clas C:A;/*Всякие разные другие классы. У них свой инвиромент, но знать о МЕТОДЕ они не должны*/
clas D:A;
......
clas Z:A;


Каким паттерном лечится?
Re: Подскажите паттерн.
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 05.07.07 13:00
Оценка:
лечится перепроектированием иерархии классов
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Подскажите паттерн.
От: ZevS  
Дата: 05.07.07 13:15
Оценка:
Здравствуйте, loknalori, Вы писали:

Абстрактной средой. Если такой нет, вопрос — действительно ли нужно эти классы наследовать от одного... Хотя по твоему описанию можно сказать ничего.
Re[2]: Подскажите паттерн.
От: loknalori Россия  
Дата: 05.07.07 13:42
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>Здравствуйте, loknalori, Вы писали:


ZS>Абстрактной средой. Если такой нет, вопрос — действительно ли нужно эти классы наследовать от одного... Хотя по твоему описанию можно сказать ничего.


"Абстрактной средой" — а что это за паттерн такой??? Гугл о нем не знает.

Проблема в том что ни чего четко и сам сказать не могу. Код не мой, монстрозный и я первый раз его вижу. Соответственно перепроектировать иерархию сейчас нельзя — дров наломаю, а совсем кривое решение делать не хочется...
Re: Подскажите паттерн.
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 05.07.07 15:34
Оценка:
Здравствуйте, loknalori, Вы писали:

L>class A;/*класс А. Он вызывает нужный МЕТОД*/

Вызывает чей-то метод или предоставляет свой? В любом случае метод (а точнее обращение к его магической и волнующей реализации) оформить интерфейсом.

public interface IA<P> {
    void method(P parameter);
}

public class A implements IA<String> {
    public void method(String parameter) {
        // implementation
    }
    
    public void _method() {
        // outside IA code
    }
}

И все обращения к методу производить не через реализацию, а интерфейс, то есть так:

IA a = new A();
//...
a.method("fire");

И ни в коем разе не так:

A a = new A();
//...
a.method("fire");
a._method("fire past by!!!");

Потому что открывается весь тип класса A, в то время как нам нужно давать клиентам только возможность вызова магического и волнующего метода, то есть интерфейс IA.

L>clas B:A;/*имеет некоторый enviroment, параметры которого нужно передать в МЕТОД, но класс А,

L>не знает о том что есть enviroment, а класс B не должен знать что есть вызов такого МЕТОДЕ*/
Попробовать наследование заменить делегированием. Это не паттерн, просто альтернативный по отношению к наследованию (полиморфизму) метод повторного использования кода.

public class B {
    private final IA<String> a;
    // по той же причине вовсе не так!
    // private final A a;
    
    private String ownParameter;
    
    public B(IA<String> _a) {
        a = _a;
    }
    
    public void fireCallMethod() {
        a.method(ownParameter);
    }
}


L>clas C:A;/*Всякие разные другие классы. У них свой инвиромент, но знать о МЕТОДЕ они не должны*/

L>clas D:A;
L>......
L>clas Z:A;
Переписать делегирование как-то так:

public abstract ADelegate<P> {
    private final IA<P> a;
    
    private P parameter;
    
    public ADelegate(IA<P> _a) {
        a = _a;
    }
    
    public abstract void fireCallMethod();
}

Классы B, C, D, ..., Z наследуют ADelegate:

public class B extends ADelegate<String> {
    public B(IA<String> a) {
        super(a);
    }
    
    @Override
    public void fireCallMethod() {
        // some magical actions on parameter
        a.method(ownParameter);
    }
}

public class C extends ADelegate<Integer> {
    public B(IA<Integer> a) {
        super(a);
    }
    
    @Override
    public void fireCallMethod() {
        // some magical actions on parameter
        a.method(ownParameter);
    }
}


L>Каким паттерном лечится?

Очень непонятно, что вы имеете в виду под "но знать о методе они не должны". Надеюсь, угадал чаяния.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.