Професионална програма
Loading...
Filkolev avatar Filkolev 4486 Точки

[OOP] Exam Preparation - December 14 2015 - Empires

Здравейте колеги,

В Judge е създадено ново състезание по ООП с примерна изпитна задача в новия формат на изпита (без скелет). Състезанието може да достъпите ТУК.

Като ресурси са качени условието и решение на Java. Състезанието е отворено за C# и Java архиви, но към момента има технически проблем със събмитването на Java zip, който би трябвало да бъде разрешен близките дни. Със C# проекти не би трябвало да срещнете затруднения.

Подготовката в понеденик ще бъде на C#. Съществени разлики в дизайна на решението на C# и на Java няма, но ако някой има желание да решава изпита другата седмица на Java може да погледне решението, което е качено.

Ако имате неясноти или въпроси по задачата, питайте тук.

16
C# OOP Basics 12/12/2015 21:16:45
tilchev92 avatar tilchev92 Trainer 128 Точки

Понеже в темата ми за капитализма, никой не се заинтересува от рефлекшъна в Java, реших сам да напиша/намеря нещо. Поиграх си с решението на Фил, от тази тема и стигнах до работещ рефлекшън, който е много бавен, но пък ми се струва, че е независим от типа на файловата система и външни библиотеки. Въпреки това в джъджа не минават реалните тестове (runtime error), а нулевите гърмят за време.. oh well. Ето кода ако някой му е интересно.

В MyReflection.java съм описал метод който при подаден пакет (като стринг) връща колекция с всички класове в него.

В BuildingFactoryImpl.java и UnitFactoryImpl.java го използвам.

0
21/12/2015 20:06:25
Filkolev avatar Filkolev 4486 Точки

Да не би да е заради импортите, които са javax? Иначе на нулев тест се вижда, че хвърля NullPointerException.

Може да пробваш да сглобиш името на класа; основната трудност при рефлекшъна в Java е, че няма готов метод, който да ти върне тип по простото му име или колекция от типовете, която да филтрираш след това. Но, имайки неймспейса, където искаш да търсиш даден клас, както и името му, може директно да поискаш да ти бъде върнат този тип чрез пълното му име. Оттам нататък трябва да се провери какво се случва ако няма такъв тип, дали метода връща null или хвърля грешка.

При този подход задължаваме програмистите, които пишат приложението, да спазват структурата му стриктно, т.е. като напишат нов вид единица, да я сложат в неймспейса на единиците, което си има предимства.

1
tilchev92 avatar tilchev92 Trainer 128 Точки

Javax не би трябвало да  е проблем, но за другото съм съгласен. Направих го с този "задължаващ" подход и мина в джъджа без проблеми. Работи и доста по-бързо, защото няма цикли (поне не явни).

 

public class BuildingFactoryImpl implements BuildingFactory {
    private static final String BUILDINGS_PACKAGE_NAME = "OOPSampleExam14Dec2015Empires.models.buildings.";

    @Override
    public Building createBuilding(String buildingType, UnitFactory unitFactory, ResourceFactory resourceFactory) {

        char first = Character.toUpperCase(buildingType.charAt(0));
        buildingType = first + buildingType.substring(1);
        Building building = null;
        try {
            Class buildingClass = Class.forName(BUILDINGS_PACKAGE_NAME + buildingType);
            Constructor[] ctors = buildingClass.getConstructors();
            building = (Building) ctors[0].newInstance(unitFactory, resourceFactory);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return building;
    }
}

 

0
23/12/2015 14:30:49