2015-05-12 46 views
1

我有一個函數,從數據庫中加載一個事物列表,並將它們放入選擇列表中。該函數如下: (僞碼)這是太多行和嵌套塊太多嗎?

protected function Foo() 
{ 
    try { 

     get pdo instance 
     prepare statement 

     if (pdo query executes) 
     { 

      while (row = fetched rows) 
      { 
       do stuff with row 
      } 
     } 
    } 
    catch (PDOException $ex) 
    { 
     do error stuff here 
    }   
} 

NetBeans的給出了一個代碼提示,是太多行和太多的嵌套塊。我個人覺得這個功能應該可以接受。我也覺得把邏輯分解成更小的函數有點麻煩,但爲什麼netbeans會騙我:)?

所以我的問題如下:

這是不好的邏輯還是我好繼續前進? 我很樂意就如何重新設計符合NetBean約束的函數提供任何建議。

編輯:

我不會回答我的問題,但在這種情況下,是不是需要一個嵌套塊。從具有try/catch塊的單例類中檢索pdo。我不需要在這個函數中再次重複它,因爲這個例外已經被捕獲了。

編輯2:

卸下try catch塊簡直就像拆了東牆補西牆。因此,如果在創建pdo實例時拋出異常,它不會停止執行。因此,我們嘗試在未正確初始化的PDO對象上調用prepare語句。這迫使我們在準備調用之前進行另一個測試,因此只返回原始函數的返工。

根據我的經驗,這意味着沿着這條線我的邏輯地板的某處。如果我有什麼值得說的話,我會回顧我的設計和霍拉。

再次感謝所有

+0

真相被告知,它是4行,實際執行5級深度代碼的行動,但不應該太糟糕。只要嘗試寫更多的代碼行,它應該消失(或禁用Netbeans中的功能)。 –

+0

邏輯看起來不錯。通常作爲一種模式,您可能想要使用自己的try/catch/error報告體系結構將PDO實例的設置抽象到它自己的類中。然後,您可以只抓取生成的PDO實例的類級指針,並假設其餘代碼中不需要將所有內容都包含在try/catch中,而只需檢查查詢是否執行。遍歷行很好,雖然(不知道什麼語言)可能有一個fetchAll類型的函數,它會將它轉儲爲一個整潔的小數組。 – joshstrike

+0

謝謝你們,我想了很多!我在單例類和try catch塊中都有PDO實例。爲什麼我進入數組的時間是每個結果被放入另一個對象,例如 - myObject-> InsertChild(row);如果你得到我的漂移。感謝Erik和Josh的指導 – Shibby

回答

3

你的代碼很好。 NetBeans建議的不一定是您應該遵循的規則,如果您使用了其他編輯器(如PHPStorm),您甚至不會擔心(在PHPStorm中,您可以將編碼風格設置爲遵循PSR 1/2)。

你至少可以通過使用一種叫做guard clause弄死一個嵌套:

protected function Foo() 
{ 
    try { 
     get pdo instance 
     prepare statement 

     if (! pdo query executes) return; 

     while (row = fetched rows) 
     { 
      do stuff with row 
     } 

    } 
    catch (PDOException $ex) 
    { 
     do error stuff here 
    }   
} 

我已經看到有不同喜好的人,因爲沒有硬性的規定。例如安東尼費拉拉personally thinks他不應超越四個嵌套關卡,我個人認爲四個關卡太多。

點是你應儘可能地儘量減少嵌套和行數。當你的方法太大(有時稱爲上帝的方法),這意味着你做錯了。

您可能也想看看關於這個問題的這個好文章,由威廉·杜蘭德在那裏他討論他的書由傑夫灣建議一些(實際上9)建議ThoughtWorks Anthology

Object Calisthenics

而且PHP Coding Standards Fixer是你的朋友。

所以:

  • 您當前的代碼是完全正常
  • 創建您的個人喜好,並在那裏possible淡化細紋的嵌套和數量。
+0

謝謝你。我會看看這些文章,並按照你的建議。我儘量保持所有的課程和功能儘可能小,但完整。再次感謝,一切順利 – Shibby

+0

@Shibby:不客氣 – Sarfraz

0

你可以扭轉if語句,如果條件不爲真,以消除一級嵌套退出功能。雖然邏輯看起來也可以。

+0

感謝您的評論。我剛剛刪除了多餘的try/catch塊,因爲當我創建POD對象的實例時,我已經有了一個try catch塊。所有最好的 – Shibby

+0

嗨,謝謝你的幫助。我在下面標記了答案,僅僅是因爲它涵蓋了更多的一般理論,但是與您所說的相同的編碼解決方案。再次感謝 – Shibby