Рефакторинг кода в Java

207
23 октября 2017, 23:50

Здравствуйте, пишу игру тетрис, и возникла такая проблема, что получаются очень захламленные условия, хотелось бы узнать возможно ли это как упростить более простым способом. К примеру функция, которая обрабатывает нажатие на левую кнопку(передвижение фигуры влево), в ней проверяется выход за границы поля и не было ли пересечения с другими фигурами путем прохождения циклом по всему списку фигур кроме последней фигуры(которой я управляю), если все в порядке то происходит перемещение влево на 50, вот собственно код, и таких функция у меня уже 4-6(Вопрос очень актуальный для меня)

private void handleLeftKeyPressed(LinkedList<Figure> listFigure){
    if(keyInputListener.isLeftPressed()){
        boolean tmp = false;
        if(listFigure.getLast().getPositionX() >= beginX) {
            for (int i = 0; i < listFigure.size() - 1; i++){
                if((listFigure.get(i).getPositionX() + listFigure.get(i).getWidth() == listFigure.getLast().getPositionX()) &&
                        ((listFigure.getLast().getPositionY() + listFigure.getLast().getHeight() + 50 >= listFigure.get(i).getPositionY() + listFigure.get(i).getHeight() / 2) && (listFigure.getLast().getPositionY() <= listFigure.get(i).getPositionY() + listFigure.get(i).getHeight()))){
                    tmp = true;
                    break;
                }
            }
            if(!tmp){
                listFigure.getLast().move(-50, 0);
            }
        }
    }
}
Answer 1
private void handleLeftKeyPressed(LinkedList<Figure> listFigure){
    Figure last = listFigure.getLast();
    if(!keyInputListener.isLeftPressed() || last.getPositionX() < beginX) return;
    for (int i = 0; i < listFigure.size() - 1; i++){
        Figure current = listFigure.get(i);
        if(current.getPositionX() + current.getWidth() == last.getPositionX() 
           && last.getPositionY() + last.getHeight() + 50 >= current.getPositionY() + current.getHeight() / 2 
           && last.getPositionY() <= current.getPositionY() + current.getHeight()
           ){
            return;
        }
    }
    last.move(-50, 0);
}

Переименуйте методы getPositionX в getX (и про y тоже) - станет сильно читабельней.

В Figure добавьте методы getRightBount и getBottomBound возвращающие x + width и y + height

Условие станет таким:

if(current.getRightBound() == last.getX() 
   && last.getBottomBound() + 50 >= current.getY() + current.getHeight() / 2 
   && last.getY() <= current.getBottomBound()
           ) { return; }

Теперь его хотя бы можно анализировать не боясь сломать глаза. Подозреваю, что у вас там вместо первого && должно быть ||. Проверьте.

READ ALSO
Вызов метода в иерархии класса

Вызов метода в иерархии класса

есть интерфейс Animal который имеет метод getSpeed()

236
Создать папку во внутренней памяти. В корне

Создать папку во внутренней памяти. В корне

Необходимо создать папку именно в корнечтобы она была общедоступна

191
Ввод данных в браузере для компилятора

Ввод данных в браузере для компилятора

Мне нужно создать простое Rest-приложение, в котором у меня есть бд пользователейПроект пишется на Spring

125
Перезапуск Activity при нажатии на кнопку

Перезапуск Activity при нажатии на кнопку

У меня есть Activity в котором вопросы с вариантами, когда заканчиваются вопросы то появляется AlertDialog в котором находится только одна кнопка

152