Loading...
Filkolev avatar Filkolev 4482 Точки

[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 4482 Точки

Да не би да е заради импортите, които са 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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.