2013-11-20 44 views
0

現在在我的應用程序有用於測量海軍基於物理的體能測試你的分數一類。輸入是年齡,俯臥撐,仰臥起坐,跑步運動員和跑步秒數。尋找一個更steamilned的方式來輸入比較靜態整數

的代碼比較得分是......

if (age >= 20 && <= 24){ 
    if (pushups >= 20 && <= 30){ 
}} 

...等等爲所有年齡組和練習。有沒有辦法簡化這個?因此,我的代碼不是半英里長,並且在更新分數閾值時不會永遠改變?引用電子表格或其他一種以更易讀的方式保存數據的方法?

回答

0

有簡化這個邏輯沒有明確的辦法,畢竟這個過程是它是什麼,除非你切換到SQLite的SQL方法(見我的答案的後半部分)。如果有很多代碼,只要易於閱讀和理解,並不重要。我會用它自己的方法或類來保持它的整潔。

在您的代碼的主體中使用文字值(如20,24,& 30)絕不是一個好主意,它有可能在未來某個時間點發生變化。當你需要改變它們時,很難找到它們,並且很容易錯過某些東西,最終得到一個很難找到的錯誤。如果這些值很少發生變化,最簡單的方法是將所有這些常量值定義爲static final,無論是在您使用它們的類的頂部,還是在另一個靜態類中。例如:

private static final int AGE_THRESHOLD_1_MIN = 20; 
private static final int AGE_THRESHOLD_1_MAX = 24; 
private static final int PUSHUPS_THRESHOLD_1_MIN = 20; 
private static final int PUSHUPS_THRESHOLD_1_MAX = 30; 

... 

if (age >= AGE_THRESHOLD_1_MIN && age <= AGE_THRESHOLD_1_MAX){ 
    if pushups >= PUSHUPS_THRESHOLD_1_MIN && pushup <= PUSHUPS_THRESHOLD_1_MAX){ 
}} 

然後,當你需要改變這些值,你已經得到了他們於一身,很容易找到,地點。另一種方法是將它們存儲在您在運行時讀入的XML文件中(例如添加到資產)。這兩種方法當然都需要在數值發生變化時進行新的構建。

如果你想要更多的靈活性(和避免重建應用程序的需要),就可以將它們存儲在共享偏好(如果值存儲在共享偏好設置使用,否則使用靜態最終)。然後,您可以在應用中選擇一個選項來調整要保存到Shared Prefs的閾值,這將在會話之間保持不變。

這也可以在SQLite數據庫配置。例如一個年齡表來保存每個年齡範圍:

Table Age (age_id INT, minimum INT, maximum INT) 
1 | 20 | 24 
2 | 25 | 29 
3 | 30 | 34 

然後,俯臥撐表,其得分俯臥撐給定的範圍內,對於特定的年齡範圍。請注意,age_id列是回到Age表的外鍵。

Table PushUps (pushup_id INT, age_id INT, minimum INT, maximum INT, score INT) 
1 | 1 | 20 | 30 | 100 
2 | 1 | 31 | 40 | 200 
3 | 2 | 20 | 25 | 120 
4 | 2 | 26 | 34 | 240 

然後,您可以使用此查詢來獲取分數的人年齡在22歲誰做俯臥撐35,這將返回200

SELECT score 
FROM PushUps p 
INNER JOIN Age a 
    ON a.age_id = p.age_id 
WHERE 22 >= a.minimum AND 22 <= a.maximum 
    AND 35 >= p.minimum and 35 <= p.maximum 

我覺得這是最好的解決方法。如果您的應用程序中尚未使用SQLite數據庫,則由您決定是否值得配置一個SQLite數據庫。像SQLite這樣的關係數據庫是一個強大的工具,值得研究,如果你以前沒有這樣做。

+0

因此,沒有辦法使用類似數據庫的東西來保存信息並在本地引用它? – JDSlimz

+1

毫無疑問,請參閱我的編輯。我之前沒有提到它,因爲建立它需要更多的工作,但這樣做可能是一項有價值的投資。 – NigelK

相關問題