Как сделать рефакторинг кода в котором меняются только цифры?

Написал приложение на JavaFX, но мои условия выглядят очень большими. Там есть повторение кода.Используются одни и те же свойства, но с разными цифрами. Например очень часто повторяется метод setScaleX(), в скобках меняется только значение.

Как можно сократить код, и чтобы это было все понятно?

//get Screen Resolution
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    screenSize.getHeight();
    screenSize.getWidth();

    int screenHeight = screenSize.height;
    int screenWidth = screenSize.width;

    //assign video size to screen size
    media.setFitWidth(screenWidth);
    media.setFitHeight(screenHeight);

    if (screenWidth <= 1700) {
      media.setTranslateY(50);
      media.setScaleX(1.1);
      media.setScaleY(1.1);

    }  if (screenWidth <= 1600 && screenHeight <= 900) {
      media.setScaleX(1.0);
      media.setScaleY(1.0);
      media.setTranslateY(-3);

    } if (screenWidth == 1600 && screenHeight == 1024) {
      media.setScaleX(1.1);
      media.setScaleY(1.1);
      media.setTranslateY(60);

    } if (screenWidth <= 1370) {
      media.setTranslateY(0);
      btnPalette.setPrefWidth(40);
      btnFont.setPrefWidth(40);
      btnQuestCards.setPrefWidth(40);
      btnNonQuestCards.setPrefWidth(40);

    }  if (screenWidth <= 1300) {
      media.setScaleX(1.4);
      media.setScaleY(1.4);
      media.setTranslateY(150);
    }  if (screenWidth == 1280 && screenHeight == 800 || screenWidth == 1280 && screenHeight == 768) {
      media.setScaleX(1.1);
      media.setScaleY(1.1);
      media.setTranslateY(50);
    } if (screenWidth == 1280 && screenHeight == 720 || screenWidth == 1176 && screenHeight == 664) {
      media.setScaleX(1.0);
      media.setScaleY(1.0);
      media.setTranslateY(0);
    }  if (screenWidth == 1152 && screenHeight == 864) {
      media.setScaleX(1.4);
      media.setScaleY(1.4);
    }  if (screenWidth == 1024 && screenHeight == 768) {
      media.setTranslateY(90.0);
    } if (screenWidth == 800 && screenHeight == 600) {
      media.setScaleX(1.3);
      media.setScaleY(1.3);
      media.setTranslateY(80.0);
    }
  • Вопрос задан
  • 216 просмотров
Решения вопроса 1
Не уверен, но всё же.
Вместо:
if (screenWidth <= 1700) {
  media.setTranslateY(50);
  media.setScaleX(1.1);
  media.setScaleY(1.1);
}
if (screenWidth <= 1600 && screenHeight <= 900) {
    media.setScaleX(1.0);
    media.setScaleY(1.0);
    media.setTranslateY(-3);
}

Я бы сделал так:
reDraw(screenWidth <= 1700, media, 1.1, 1.1, 50.0);
reDraw(screenWidth <= 1600 && screenHeight <= 900, media, 1.0, 1.0, -3.0);
        // и метод под всё это(его можно поперегружать и сделать ещё более удобным)
    private static void reDraw(Boolean condition, ImageView view, Double scaleX, Double scaleY, Double translateY) {
        if (condition) {
            if (scaleX != null)
                view.setScaleX(scaleX);
            if (scaleY != null)
                view.setScaleY(scaleY);
            if (translateY != null)
                view.setTranslateY(translateY);
        }
    }


Если эти условия будут использоваться для чего-нибудь ещё, можно сделать ещё красивее:
boolean isLargeSize = screenWidth <= 1700;
boolean isMediumSize = screenWidth <= 1600 && screenHeight <= 900;

reDraw(isLargeSize, media, 1.1, 1.1, 50.0);
reDraw(isMediumSize, media, 1.0, 1.0, -3.0);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/TS/Kotlin developer
Можно сделать EnumScreenSize, в котором написать некую логику, отдающая нужный инстенс исходя из Dimension. Первые 5 строчек уже сократятся в одну. Это же позволит вместо десятков >= <= && || делать size == EnumScreenSize.FULL_HD. Если scale величины относятся ко всем экранам в целом, и их можно вынести в энам - так тоже стоит сделать. Вместо if'ов можно использовать switch, и хоть он громаздкий, но выглядеть будет проще. Если setScale() и другие методы отдают this, то можно chain'ить их.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы