Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Полиморфизм / 20 сообщений из 20, страница 1 из 1
27.06.2014, 18:14
    #38682212
IEEE
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
Добрый день. Есть такая структура классов:
Код: java
1.
2.
3.
4.
public class Doc {}
public class Doc1 extends Doc {}
public class Doc2 extends Doc {}
// и т.д. много-много классов



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class Service {
    public void action(Doc doc) {
        System.out.println("0");
    }

    public void action(Doc1 doc1) {
        System.out.println("1");
    }

    public void action(Doc2 doc2) {
        System.out.println("2");
    }

    public void realAction(Doc doc) {
        action(doc);
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class PSVM {
    public static void main(String[] args) {
        Service service = new Service();

        // Приходит неизвестный Doc
        Doc doc = new Doc2();

        service.realAction(doc);
    }
}



При вызове service.realAction(doc); соответственно выводится "0". А хочется, чтобы выводилось "2". Как можно поменять код, чтобы в realAction(Doc doc) дергался метод action(Doc2 doc2), а не action(Doc doc). Желательно красиво, без instance of.
...
Рейтинг: 0 / 0
27.06.2014, 18:21
    #38682220
IEEE
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
Классы Doc и наследники крайне желательно не менять.
...
Рейтинг: 0 / 0
27.06.2014, 18:26
    #38682229
Zukora
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
service.realAction((Doc2) doc); не?
...
Рейтинг: 0 / 0
27.06.2014, 18:29
    #38682233
IEEE
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
new Doc2() чисто для примера. Сам объект приходит из вне и неизвестно какого он конкретно типа.
...
Рейтинг: 0 / 0
27.06.2014, 19:50
    #38682315
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
PSVM.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class PSVM {

    public static void main(String[] a) {
        Service service = new Service();
        Doc doc = new Doc2();
        service.realAction(doc);
    }
}

Service.java
Код: java
1.
2.
3.
4.
5.
6.
public class Service {

    public void realAction(Doc doc) {
        doc.polymorphicAction();
    }
}

Doc.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Doc {

    public void polymorphicAction() {
        println("0");
    }
    
    public static void println(String text) {
        System.out.println(text);
    }
}

Doc1.java
Код: java
1.
2.
3.
4.
5.
6.
public class Doc1 extends Doc {

    @Override public void polymorphicAction() {
        println("1");
    }
}

Doc2.java
Код: java
1.
2.
3.
4.
5.
6.
public class Doc2 extends Doc {

    @Override public void polymorphicAction() {
        println("2");
    }
}

...
Рейтинг: 0 / 0
27.06.2014, 19:56
    #38682318
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
PSVM.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class PSVM {

    public static void main(String[] a) {
        Service service = new Service();
        Doc doc = new Doc2();
        service.realAction(doc);
    }
}

Service.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
import java.util.HashMap;

public class Service {

    private static final Action<Doc> DEFAULT_ACTION = doc -> println("0 " + doc);

    private static final HashMap<Class<? extends Doc>, Action<Doc>> ACTIONS = createActionsMap();

    private static HashMap<Class<? extends Doc>, Action<Doc>> createActionsMap() {
        HashMap<Class<? extends Doc>, Action<Doc>> map = new HashMap<>();
        map.put(Doc.class,  DEFAULT_ACTION);

        //<editor-fold defaultstate="collapsed" desc="8">
        map.put(Doc1.class, doc -> println("1 " + doc));
        map.put(Doc2.class, doc -> println("2 " + doc));
        //</editor-fold>

        //<editor-fold defaultstate="collapsed" desc="7">
//        map.put(Doc1.class, new Action<Doc>() {
//            @Override public void make(Doc doc) {
//                println("1 " + doc);
//            }
//        });
//        map.put(Doc2.class, new Action<Doc>() {
//            @Override public void make(Doc doc) {
//                println("2 " + doc);
//            }
//        });
        //</editor-fold>

        return map;
    }

    public void realAction(Doc doc) {
        Action<Doc> action = ACTIONS.get(doc.getClass());
        (action != null ? action : DEFAULT_ACTION).make(doc);
    }

    public static void println(String text) {
        System.out.println(text);
    }
}


Action.java, Doc.java, Doc1.java, Doc2.java
Код: java
1.
2.
3.
public interface Action<S> {
    void make(S on);
}


Код: java
1.
public class Doc {}


Код: java
1.
public class Doc1 extends Doc {}


Код: java
1.
public class Doc2 extends Doc {}

...
Рейтинг: 0 / 0
27.06.2014, 20:11
    #38682328
wst
wst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
Можно visitor вкорячить. В приложении из полутора классов даже будет интересно смотреться.
...
Рейтинг: 0 / 0
27.06.2014, 21:21
    #38682352
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
IEEE,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public void realAction(Doc doc) throws Exception {
    for (Method m: Service.class.getMethods()) {
        if (m.getName().equalsIgnoreCase("action")) {
            if (m.getParameterTypes()[0].getName().equals(doc.getClass().getName())) {
                m.invoke(this, doc);
                return;
            }
        }
    }
}
...
Рейтинг: 0 / 0
27.06.2014, 21:22
    #38682353
IEEE
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
Doc-и - это хибернейтовские сущности(и их много), неохото в них логику пихать. Эх, скорее всего придется instance of-ами или хэшмапом, хотя и не по фэншую это все.
...
Рейтинг: 0 / 0
27.06.2014, 21:25
    #38682357
IEEE
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
Usman,

Тоже вариант)
Когда писал вопрос, думал есть какой-то красивый через полиморфизм какой-нибудь. Остальные варианты будут работать, но на душе не спокойно от них.
...
Рейтинг: 0 / 0
01.07.2014, 16:17
    #38684926
For All
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
IEEEдумал есть какой-то красивый через полиморфизм какой-нибудь.Чтобы был полиморфизм прийдётся менять код классов Doc.
Но, как вы сами сказали,
IEEEDoc-и - это хибернейтовские сущности(и их много), неохото в них логику пихать.Так что, только instanceof и остаётся.
...
Рейтинг: 0 / 0
01.07.2014, 16:25
    #38684942
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
IEEEDoc-и - это хибернейтовские сущности(и их много), неохото в них логику пихать. Эх, скорее всего придется instance of-ами или хэшмапом, хотя и не по фэншую это все.
У вас это выльется во все прелести Anemic Domain Model. В чем проблема логики в сущностях?
...
Рейтинг: 0 / 0
01.07.2014, 16:33
    #38684957
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
For AllНо, как вы сами сказали,
IEEEDoc-и - это хибернейтовские сущности(и их много), неохото в них логику пихать.Так что, только instanceof и остаётся.
Ну, можно завести реестр класса на Action. Эдакую свою таблицу виртуальных методов. Но, при всех прочих, полиморфизм самое простое решение.

Другое дело, если Action у нас сложная бизнес транзакция. Тогда проще реализовать что-то вроде
doc.getAction().perform();
Чтобы не добавлять в сущность связей с разными сервисами.
...
Рейтинг: 0 / 0
02.07.2014, 01:53
    #38685289
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
BlazkowiczУ вас это выльется во все прелести Anemic Domain Model. В чем проблема логики в сущностях?Может это не так уж и плохо ?..
...
Рейтинг: 0 / 0
02.07.2014, 09:24
    #38685408
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
WGAМожет это не так уж и плохо ?..
Я тоже пока не разобрался был такого же мнения. Если код проще всего держать в сущности. Если код при этом не добавляет в сущности жестких новых зависимостей. То код должен быть в этой сущности. Самый простой критерий - метод сущности должен оперировать только полями и свойствами сущности.
Если вынос кода в Service приходит к необходимости исполь instanceof. Если код усложняется только потому что он находится не в сущности, а в Service, то это явные признаки болезни Anemic Model.

Во-первых это не так просто разбивать методы на код Service и код сущности. Особенно если в этом пока нет необходимости, то и делать никто не будет. Пишешь себе колбасу в Service и не думаешь о том что можно же часть алгоритма в сущность перенести. Тогда код будет проще переиспользовать. Круто, если его переиспользовать не придется. А вот когда придется, тогда мозги и встанут на место. Если только лень и копипаст своё не возьмут.

Во-вторых проблема лишних зависимостей легко решается введением нового абстрактного слоя. Например, какак я предлагал выше - Action.
...
Рейтинг: 0 / 0
03.07.2014, 00:46
    #38686316
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
BlazkowiczЯ тоже пока не разобрался был такого же мнения... Я пока не разобрался окончательного, поэтому мнения нет...

Косвенно в пользу anemic model говорит то, что в основных платформах (JEE, Spring) не было реализован DI в сущности. Хотя в JEE7, вроде, появилось, но все же... Как бы все указывает, на то, какая роль отводится для Entity.

Ни в коем случае не хочу разводить холивар. )
Просто прочитал тот блог буквально минут за 15 до прочтения sql.ru. Подумал, возможно будет интересно...
...
Рейтинг: 0 / 0
03.07.2014, 09:30
    #38686426
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
WGAКосвенно в пользу anemic model говорит то, что в основных платформах (JEE, Spring) не было реализован DI в сущности.
Вскрывается полное непонимание. Следи за руками. То что Entity не имеет смысла использовать в DI, так как у них относительно короткий жизненый цикл, ещё не значит, что иметь какую-либо логику в Entity это "плохо", как утверждается выше.
...
Рейтинг: 0 / 0
03.07.2014, 11:24
    #38686585
IEEE
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
BlazkowiczIEEEDoc-и - это хибернейтовские сущности(и их много), неохото в них логику пихать. Эх, скорее всего придется instance of-ами или хэшмапом, хотя и не по фэншую это все.
У вас это выльется во все прелести Anemic Domain Model. В чем проблема логики в сущностях?
В этой логике надо дергать другие спринговые сервисы.

Май бэд, наверное, плохо описал задачу. В итоге на каждый

Код: java
1.
2.
3.
public void action(Doc1 doc1) {
        System.out.println("1");
}


был создан отдельный спринговый компонент, унаследованный от generic-интерфейса. А в сервисе, который дергает service.realAction(doc); находится нужный бин и дергается у него action.
...
Рейтинг: 0 / 0
03.07.2014, 11:28
    #38686594
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
IEEEВ этой логике надо дергать другие спринговые сервисы.

Поэтому логику надо аккуратно разделить, чтобы полиморфизм остался в сущностях, а сервисы изолировались от сущностей отдельным слоём.

IEEEМай бэд, наверное, плохо описал задачу. В итоге на каждый

Не. Всё понятно. На самом деле для Java нет простого однозначного решения.
...
Рейтинг: 0 / 0
03.07.2014, 15:33
    #38686948
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм
BlazkowiczВскрывается полное непонимание. Следи за руками...Возможно и непонимание... ) Просто мне доводилось видеть проекты, основанные на разных подходах. Когда увижу образчик proper Domain Model и скажу "всегда буду делать так же" - тогда и сменю мнение. Из двух зол приходится выбирать меньшее...
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Полиморфизм / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]