Jak zrobic z tego metode parametryzowana, czy warto ?

0

Cześć,

mam taki kod w metodzie i w zaleznosci od warunku wywoluje inne metody:

	...
	 for (Field f : fieldList) {
                f.setAccessible(true);
                if (f.getName().equals(e.getKey())) {
                    try {
                        if (f.getType() == FList.class
                                && e.getKey().equals("pVal")) {
                            f.set(r, analyzepVal(r, el));
                        } else if (f.getType() == FList.class
                                && e.getKey().equals("Ver")) {
                            f.set(r, analyzeVerVal(r, el));
                        } else if (f.getType() == FList.class
                                && e.getKey().equals("APart")) {
                            f.set(r, analyzeAPartVal(r, el));
                        } else if (f.getType() == FList.class
                                && e.getKey().equals("oRel")) {
                            f.set(r, analyzeARVal(r, el));
                        } else if (f.getType() == Boolean.TYPE) {
                            f.set(r, el.getAsBoolean());
                        } else
                            f.set(r, el.getAsString());
                    ...
                }
            }
			...
		te metody sa bardzo podobne, da sie to jakos sprytnie zrobic aby z tych 4 metod zrobic jedna ogolna (bo nie widze tego)?
		
			private EOCFList<AR> analyzeARVal(T r,
            JsonElement el)
    {
        EOCFList<AR> AR = new EOCFList<AR>(
                AR.class, (AImpl) r,
                EP.A__OWNED_REL);
        JsonArray ar = el.getAsJsonArray();
        for (int i = 0; i < ar.size(); ++i) {
            String obj = ar.get(i).toString();
            ARImplDeserializer<ARImpl> vD = new ARImplDeserializer<ARImpl>();
            ARImpl ARImpl = vD.deserialize(obj,
                    ARImpl.class);
            AR.add(ARImpl);
        }
        return AR;
    }


    private EOCFList<A> analyzeAPartVal(T r,
            JsonElement el)
    {
        EOCFList<A> APart = new EOCFList<A>(
                A.class, (AImpl) r,
                EP.A__A_PART);
        JsonArray ar = el.getAsJsonArray();
        for (int i = 0; i < ar.size(); ++i) {
            String obj = ar.get(i).toString();
            AImplDeserializer<AImpl> vD = new AImplDeserializer<AImpl>();
            AImpl AImpl = vD.deserialize(obj, AImpl.class);
            APart.add(AImpl);
        }
        return APart;
    }


    private EOCFList<Ver> analyzeVerVal(T r,
            JsonElement el)
    {
        EOCFList<Ver> Ver = new EOCFList<Ver>(
                Ver.class, (AImpl) r,
                EP.A__Ver);
        JsonArray ar = el.getAsJsonArray();
        for (int i = 0; i < ar.size(); ++i) {
            String obj = ar.get(i).toString();
            VerImplDeserializer<VerImpl> vD = new VerImplDeserializer<VerImpl>();
            VerImpl VerImpl = vD.deserialize(obj, VerImpl.class);
            Ver.add(VerImpl);
        }
        return Ver;
    }


    private EOCFList<Val> analyzepVal(T r,
            JsonElement el)
    {
        EOCFList<Val> pVal = new EOCFList<Val>(
                Val.class, (AImpl) r,
                EP.A__PROPERTY_Val);
        JsonArray ar = el.getAsJsonArray();
        for (int i = 0; i < ar.size(); ++i) {
            String obj = ar.get(i).toString();
            ValImplDeserializer<ValImpl> vD = new ValImplDeserializer<ValImpl>();
            ValImpl ValImpl = vD.deserialize(obj, ValImpl.class);
            pVal.add(ValImpl);
        }
        return pVal;
    }

dzieki za wskazowki

0

Da się. Wszystkie new zamień na fabrykator (być może sparametryzowany). Zauważ, że wynikiem jest skonkretyzowana lista, więc wystarczy do metod analyzeXXX dorzucić parametr np. TYP. Wtedy nagłówek wtedy wyglądać będzie jakoś tak: private <TYP> EOCFList<TYP> analyze(T r, JsonElement el). Wszędzie gdzie się da zamień metody na statyczne bo to uprasza parametryzację, a wygląda mi na to jakby te metody nie korzystały z własności klasy. Żeby sobie ułatwić zrefaktoryzuj nazwy, żeby każda zmienna i parametr nazywał się tak jak to co reprezentuje, a nie jakieś anonimowe literki. To ułatwia robienie generyków bo trudniej się pomylić ponieważ wtedy wiadomo co jest czym.

0

ok, dzieki za wskazowki

"Wszystkie new zamień na fabrykator (być może sparametryzowany)."

ale co rozumiesz przez fabrykator ?

0

Mówisz o simple factory ?

0

Raczej metoda fabrykująca jeżeli już gdzieś używać konkretyzacji szablonu, to w jednym miejscu i na pewno nie w środku metody generycznej (która nie powinna mieć pojęcia o konkretnych typach obiektów). Jedne miejsce, gdzie widzę typy konkretne, to na początku - w tym kawałku kodu, który pokazałeś. Tyle, że ja bym tą drabinkę elif najpierw uprościł (i pewnie zmieniłbym na stringowego switcha) bo są tam powielone sprawdzenia.
Jeszcze przy okazji okroił bym to try do miejsc, czy wywołań, które w ogóle mogą wygenerować wyjątek do złapania bo miejsce rzucenia wyjątku w bloku try nie jest tak naprawdę możliwe do określenia w kodzie (to jest w istocie opakowane goto) - no, ale to już kwestia na inny temat, więc można to uznać raczej za moją prywatną opinię.

1 użytkowników online, w tym zalogowanych: 0, gości: 1