2009-12-15 34 views
2

我從來沒有在我生活中讀過的所有源代碼中的任何地方看到過這樣的事情。如果它被認爲是不好的編程實踐,那麼我不明白它的原因。另外,我認爲它有時會提高可讀性而不是使其惡化。以下是我在Ruby代碼中完成的一些地方。將代碼語句放在大括號中是不錯的編程習慣嗎?

@pushButton.connect(SIGNAL :clicked) do (@select_file ||= Qt::FileDialog.new).show end 

(tmr=Qt::Timer.new).connect SIGNAL :timeout do 
    @label.text = Qt::Application.translate("MainWindow", "The time right now is #{Time.now}", nil, Qt::Application::UnicodeUTF8) 
end 
tmr.start(1000) 

回答

9

儘可能努力追求簡單總是一個好主意,爲此,最好以直接的方式陳述事情。像這樣的聲明使得很難確定變量來自哪裏,因爲它們完全嵌入語句中。

括號內聲明作用域變量通常被認爲是可以接受的:

if (found = MyModel.find_by_pigeon_id(params[:pigeon_id])) 
    # Variable 'found' used only within this block 
end 

# Ruby variables will persist here, but in many languages they are out of scope 

一個更詳細的版本實際上已經影響:

found = MyModel.find_by_pigeon_id(params[:pigeon_id]) 
if (found) 
    # Variable 'found' can be used here 
end 

# Implies 'found' may be used here for whatever reason 

它總是很高興能夠通過程序掃描,看看,很清楚,所有的變量,因爲他們宣佈。除了挫敗人們之外,隱藏的東西沒有任何其他用途。

從許多其他語言的角度來看,Ruby可以讓你放鬆多少。有些語言會因爲複雜化而嚴厲懲罰你,因爲聲明或鑄造中的小錯誤可能會造成巨大的後果。這並不意味着你應該充分利用每一個機會。

這是我怎麼會倡導實施的第一個例子:

# Ensure that @select_file is defined 
@select_file ||= Qt::FileDialog.new 

@pushButton.connect(SIGNAL(:clicked)) do 
    # Block is split out into multiple lines for clarity 
    @select_file.show 
end 

第二:

# Simple declaration, variable name inherited from class name, not truncated 
timer = Qt::Timer.new 

timer.connect(SIGNAL(:timeout)) do 
    # Long parameter list is broken out into separate lines to make it clear 
    # what the ordering is. Useful for identifying accidentally missing parameters. 
    @label.text = Qt::Application.translate(
    "MainWindow", 
    "The time right now is #{Time.now}", 
    nil, 
    Qt::Application::UnicodeUTF8 
) 
end 

timer.start(1000) 

我發現,最複雜的程序往往看起來最簡單的,因爲他們是由具有豐富經驗的人撰寫,他們知道如何以直接的方式表達內容。

有意思的是,一些最簡單的程序往往是最複雜的,因爲它們是由新手寫的,他們要麼譁衆取寵,要麼展現自我,要麼正在深入挖掘,不斷拋出代碼來解決問題,修復它。

6

我認爲這是相當難以閱讀。我寧願它稍微詳細,但更清晰:

tmr = Qt::Timer.new 
tmr.connect SIGNAL :timeout do 
    @label.text = Qt::Application.translate("MainWindow", "The time right now is #{Time.now}", nil, Qt::Application::UnicodeUTF8) 
end 
tmr.start(1000) 
5

代碼有太多的邏輯語句塞進1號線是很難讀,因爲讀者基本上是有放鬆在他們的大腦類似troelskn的聲明回答。

其他原因它不太readabale:

  • 它使得過去,大多數文本編輯器窗口的邊界線長流。
  • 它掩蓋了您在調試時可能需要查看的單個步驟。
2

我想你的意思是parens?

底架:{

括號:(

如果使用括號代替DO /結束---通常使用括號如果塊是在一行你的第一示例略微變得更加可讀, 。與


@pushButton.connect(SIGNAL :clicked) { (@select_file ||= Qt::FileDialog.new).show } 

第二個例子多行塊DO /結束時,我已經看到了很多在Java/C,但其實我已經看到它在紅寶石做更多的功能:

Qt::Timer.new.connect SIGNAL :timeout do 
    @label.text = Qt::Application.translate("MainWindow", "The time right now is #{Time.now}", nil, Qt::Application::UnicodeUTF8) 
end.start(1000) 

但是,您在啓動它之後沒有對該對象的引用。

相關問題