2017-03-31 109 views
1

我從這本書(從新手到專業的Python入門)讀到:「通常認爲重複代碼是一件壞事」(我不是母語,所以我不是確保它是如何開始寫),並說:究竟是什麼'代碼重複'

#===11-7=== 
file = open(PATH) 
while True: 
    char = file.read(1) 
    if not char: 
     break 
    print('Processing:', char) 
file.close() 

優於:

#===11-6=== 
file = open(PATH) 
char = file.read(1) 
    while char: 
     print('Processing:', char) 
     char = file.read(1) 
file.close() 

因爲11-7避免重複的代碼。所以我在這裏問:什麼是代碼重複?而且它很糟糕?

僅僅判斷表格11-6我沒有看到某種...的缺點,說實話,如果我沒有看這本書,我會選擇11-6這樣的代碼。謝謝〜

+1

基本上,沒有理由多次寫*相同的代碼行*,如果你不必。 –

+1

如果您決定讀取* 2 *個字節而不是一個,並且只在兩個'.read()'調用之一中進行更改,則可以巧妙地引入錯誤。在練習中一直都會發生。 – deceze

+1

這個答案總結了IMO的一個關鍵點:「應該使用DRY來避免兩個代碼在概念上做一些相同的工作,所以無論何時在一個地方更改代碼,都必須更改其他代碼如果相同的邏輯在兩個不同的地方,那麼你必須始終記住在兩個地方都改變邏輯,這可能是相當容易出錯的。「http://stackoverflow.com/a/17790368/6260170 –

回答

3

第二個例子在兩個地方做了讀操作。因此 -

想象一下,您編寫了這段代碼,並且在將來某個時候,您會改變您讀取數據的方式;也許現在你想通過網絡而不是文件讀取它,或者你想使用不同的函數來讀取文件。在第一個示例中,您只需在一個地方更改「file.read(1)」,而在第二個示例中,您必須在兩個地方執行此操作,並且您可能會錯過其中一個地方,或者發生錯誤等。

同樣,您可能會發現代碼中的錯誤,並且意外地只在兩個地方之一中修復它。

現在,這顯然是一個簡化的例子,它並不重要,但在現實世界中,這樣的錯誤很容易實現:想象它不是一行代碼,而是50行重複代碼,有人在一個副本中修復了一個錯誤,但沒有在另一箇中修復。您現在有一個可能非常難以調試的問題!

+1

明白了,謝謝〜 –