2011-10-20 84 views
0

我做了很多Java編程,然後放棄它,並做了一堆紅寶石。現在我回到了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+")"); 
    } 

回答

3

這裏是我的改進建議:

  • 枚舉更聰明,因爲你也可以申請行爲,例如在你的日誌你不但可以看到許多
  • ,而不是你可以在switch語句應用更通用的算法,但它不一定更好,因爲它然後更難以理解和更改,即使它帶有較少的代碼行
  • 如果以後再次調用構造函數,則無需執行新的Vector2()
  • 使用一致的代碼f (例如)放置{,空間charachters,...)
+0

謝謝,各種好主意。 – pitosalas

9

將所有靜態整數轉換爲枚舉可能是一個更好的主意。

0

不是拘泥於一種風格與您的括號其他:

if (condition) { 

VS

if (condition) 
{ 

沒有什麼可以改進。其餘的只是個人喜好。

+0

謝謝......一些縮進等被搞砸了,試圖讓它適合堆棧溢出的UI。 – pitosalas

0

你會在這裏得到的建議通常會有偏見,並會以無盡的論據結束。我只想安裝checkstyle,PMD,findBugs等,並在每個建議,這些工具給我

+1

我不同意。建議的改進不僅僅是個人喜好的問題(如將大括號放在同一行或下一行),而是通常認可的最佳實踐,並導致代碼少的問題。 –

+0

我確實收到了很多很好的建議。最大的當然是使用Enums,我猜我聽說過,但是當我最後一次使用它時沒有使用Java,所以我沒有打擾。 – pitosalas

+0

@pitosalas你的意思是你在這個論壇上有建議,或者使用列出的工具? – Sap

2

您應該閱讀有關枚舉。這顯然是應該在Enum類中的東西。

1
Vector2 vect = new Vector2(); 

可以在switch語句的default分支來完成從創建一個空Vector2保持JVM時的其他條件之一將是滿意的。

4

您可以考慮使用一個枚舉,例如,

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; } 
} 
+0

您應該使f1和f2最終。 –

3

你好像停留在1.5之前的Java :)閱讀有關Enum的,EnumSet和一些關於Java Practices,答案將是對你來說很明顯。

+0

你是對的,那是關於什麼時候我搬到Ruby的:)在這個線程總體很好的反饋,但是,謝謝! – pitosalas

2

你可以使用枚舉和抽象方法(以及一般的良好設計)取得更好的效果。很難提供具體的指導來說明你想要做什麼。這裏是你可能會寫代碼的類型的例子:

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); 
    } 
} 
1

一真撐風格更容易閱讀(恕我直言),並多見於Java的:

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

標準縮進是4個空格。

1

在切換之前將作業賦予place,然後將switch語句中的以下if語句組合在一起,而不是全部測試兩次。