Советы по стилю программирования Java - PullRequest
0 голосов
/ 21 октября 2011

Я много занимался программированием на Java, а затем бросил его и сделал кучу рубинов.Теперь я вернулся на Java и мне интересно, странен ли мой стиль программирования.

Мой код, приведенный ниже, кажется мне очень многословным, и вопрос в том, достаточно ли это идиоматическая Java?Любые предложения / улучшения, которые вы бы порекомендовали?


    final static int FORCE_RIGHT = 0;
    final static int FORCE_DOWN = 1;
    final static int FORCE_LEFT = 2;
    final static int FORCE_UP = 3;
    final static int IMP_RIGHT = 4;
    final static int IMP_DOWN = 5;
    final static int IMP_LEFT = 6;
    final static int IMP_UP = 7;


    public void applyForce(int dir) {
        counter++;
        Vector2 vect = new Vector2();
        switch (dir) {
            case FORCE_RIGHT: vect = new Vector2(3.0f, 0.0f); break;
            case IMP_RIGHT: vect = new Vector2(1.0f, 0.0f); break;
            case FORCE_LEFT: vect = new Vector2(-3.0f, 0.0f); break;
            case IMP_LEFT: vect = new Vector2(-1.0f, 0.0f); break;
            case FORCE_UP: vect = new Vector2(0.0f, -3.0f); break;
            case IMP_UP: vect = new Vector2(0.0f, -1.0f); break;
            case FORCE_DOWN: vect = new Vector2(0.0f, 3.0f); break;
            case IMP_DOWN: vect = new Vector2(0.0f, 1.0f); break;
        }
        Vector2 place = body.getWorldCenter();
        if (dir == FORCE_RIGHT || dir == FORCE_LEFT || dir == FORCE_DOWN || dir == FORCE_UP) 
            { 
            body.applyForce(vect, place);
            }
        else 
            { 
            body.applyLinearImpulse(vect, place);
            }
        Log.v("CAR", "Applied force: " + dir + "("+counter+")");
    }

Ответы [ 11 ]

9 голосов
/ 21 октября 2011

Возможно, будет лучше преобразовать все ваши статические целые числа в перечисление.

4 голосов
/ 21 октября 2011

Вы можете использовать enum, например,

public enum Force {
    FORCE_RIGHT (3.0f, 0.0f), 
    FORCE_DOWN (1.0f, 0.0f),
    // ... 
    IMP_UP (0.0f, 1.0f);

    private int f1,f2;

    private Force(float f1, float f2) {
      this.f1 = f1;
      this.f2 = f2;
    }
    public void getF1 { return f1; }
    public void getF2 { return f2; }
}
3 голосов
/ 21 октября 2011

Вот мои предложения по улучшению:

  • Перечисления умнее, так как вы также можете применять поведение, например, в своем журнале вы не только увидите число
  • вместо оператора switch вы можете применить более общий алгоритм, но он не обязательно лучше, так как тогда его сложнее понять и изменить, даже если он содержит меньше строк кода
  • нет необходимости делать новый Vector2 (), если впоследствии вы снова вызовете конструктор
  • использовать согласованное форматирование кода (например, место для {, пробелы, ...)
3 голосов
/ 21 октября 2011

Похоже, вы застряли в Java до версии 1.5 :) Прочтите о Enum , EnumSet и немного о Java Practices и ответе будет очевидным для вас.

2 голосов
/ 21 октября 2011

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

public class Physics {
    public void apply(final Body body, final Vect place, final Direction dir) {
    float magnitude = findMagnitude();
    PhenomType phenomType = findPhenom();
    phenomType.apply(body, dir.createVect(magnitude), place);
    System.out.println("CAR Applied force: " + dir);
    }

    public enum Direction {
    UP {
        @Override
        public Vect createVect(final float magnitude) {
        return new Vect(0.0f, magnitude);
        }
    },
    DOWN {
        @Override
        public Vect createVect(final float magnitude) {
        return new Vect(0.0f, -magnitude);
        }
    },
    LEFT {
        @Override
        public Vect createVect(final float magnitude) {
        return new Vect(-magnitude, 0.0f);
        }
    },
    RIGHT {
        @Override
        public Vect createVect(final float magnitude) {
        return new Vect(magnitude, 0.0f);
        }
    };

    public abstract Vect createVect(float magnitude);
    }

    public enum PhenomType {
    FORCE {
        @Override
        public void apply(final Body body, final Vect vect, final Vect place) {
        body.applyForce(vect, place);

        }
    },
    IMPULSE {
        @Override
        public void apply(final Body body, final Vect vect, final Vect place) {
        body.applyImpulse(vect, place);
        }
    };

    public abstract void apply(Body body, Vect vect, Vect place);
    }
}
2 голосов
/ 21 октября 2011

Вы должны прочитать о Enums.Это явно то, что должно быть в классе Enum.

1 голос
/ 21 октября 2011

Поместите присваивание в place перед переключателем, а затем объедините то, что в следующем операторе if, с оператором switch вместо того, чтобы проверять все дважды.

1 голос
/ 21 октября 2011

Стиль с единственной истинной скобкой легче читать (IMHO), и он более распространен в Java:

if (dir == FORCE_RIGHT || dir == FORCE_LEFT || dir == FORCE_DOWN || dir== FORCE_UP) {body.applyForce (vect, place);}

Стандартный отступ - 4 пробела.

1 голос
/ 21 октября 2011
Vector2 vect = new Vector2();

можно сделать в ветке default этого оператора switch, чтобы JVM не создала пустой Vector2, когда будет выполнено одно из других условий.

0 голосов
/ 21 октября 2011

Предложения, которые вы получите здесь, будут, как правило, предвзятыми и заканчиваются бесконечными спорами.Я бы просто установил checkstyle , PMD , findBugs и т. Д. И работал над каждым предположением, что эти инструменты дают мне

...