2014-04-23 55 views
1

我想我使用太多的方法,因爲一個糟糕的抽象設計。這就是爲什麼我問這個問題,不同於this one和類似的問題,它只關注方法本身的數量。長長的故事,我正在做一個六足動物。我是這樣說的,因爲有一些不尋常的設計考慮因素:你不能隨時改變前進和後退;所以有一些過渡時間。此外,有空閒的時間,那就是沒有行動的時候。伺服轉換有什麼抽象層次?

我重構我的代碼,但要實現這一點,我覺得我創造了很多方法,不應該在最高級的抽象,但低於:

void loop() 
    { 
    // Potentiometer 
    String action = Controller.action(); 
    Serial.println(action); 

    // Set the spider to the forward start position 
    if (action == "toForward") 
    { 
    Spidey.toForward(); 
    } 

    // Move the spider forward 
    else if (action == "forward") 
    { 
    Spidey.forward(); 
    } 

    // Get it to standby position 
    else if (action == "fromForward") 
    { 
    Spidey.fromForward(); 
    } 

    // MANY MORE METHODS HERE 

    // Default action (stand by) 
    else 
    { 
    Spidey.idle(); 
    } 

    delay(10); 
    } 

在這個層面上,只有Spidey.forward();方法應該是可見的,而不是過渡的方法。 如何設置轉換操作的抽象級別?

我的選擇:

  1. 充分利用Controller返回另一個參數,「轉型」,將被傳遞給方法被調用。問題:這使代碼過度複雜化。

  2. 不是使控制器返回toForwardforwardfromForward的,使它只返回forward,然後進行Spidey在內部處理事情(存儲變量lastActionSpidey,而不是將其存儲insde Controller,因爲我現在做)。問題:這會創建更多的私人方法,但根據the question linked,這沒問題。

  3. 還有其他想法嗎?

回答

1

這取決於現在控制器中發生了什麼。某處需要有一個類保存當前狀態的記錄並處理轉換排序,並將「轉發」請求轉換爲轉換中間狀態的序列。也許這是控制器,或者它可能是Spidey。

對我來說,看起來錯誤的是,如果根據很多不同的魔法字符串來調用不同的函數,那麼這個大塊就可以調用。這看起來更像是一個非常頂級的表示,不處理中間狀態。內部狀態轉換邏輯使用枚舉會更舒適。然後可能會有一個成員函數toState(),它可以將狀態排序以達到該狀態。

請記住,當中間狀態完成時,該類將需要輪詢或通知,以便它可以開始下一個。如果只有Controller知道這個,那麼在那裏有那個邏輯是有意義的。不要試圖在兩個類之間複製或拆分該邏輯。

+0

控制器在這種情況下是一個電位器,但它可以是任何東西(無線電模塊,加速度計等)。 –

+0

我不會混合電位器位置解碼邏輯和狀態邏輯,所以中間狀態將完全由Spidey處理。 Spidey.setState(targetState)會將presentState與targetState進行比較,如果它們不同,則實現過渡狀態。它還將檢查過渡狀態是否已完成,如果是,則推進當前狀態。 – sj0h