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)
4

4 に答える 4

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)

最も複雑なプログラムは、多くの経験を持ち、物事を単純な方法で表現する方法を知っている人々によって書かれているため、最も単純に見えることがよくあります。

興味深いことに、最も単純なプログラムのいくつかは、多くの場合、最も複雑なプログラムです。なぜなら、これらのプログラムは、見栄を張って見せびらかしている初心者によって書かれているか、深い溝に自分自身を掘り下げて、問題を修正することを期待してコードを投げ続けている初心者によって書かれているからです。

于 2009-12-15T16:04:38.753 に答える
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)
于 2009-12-15T13:09:23.443 に答える
5

あまりにも多くの論理ステートメントが 1 行に詰め込まれているコードは読みにくいです。なぜなら、読者は本質的に脳内でそれを解きほぐして、troelskn の回答に似たステートメントにする必要があるからです。

読みにくいその他の理由:

  • これにより、行の長さがほとんどのテキスト エディター ウィンドウの境界を越えて流れます。
  • デバッグ中に確認する必要がある個々のステップがわかりにくくなります。
于 2009-12-15T13:16:48.030 に答える
2

私はあなたが括弧を意味すると思いますか?

中括弧: {

パレン: (

do/end の代わりに中括弧を使用すると、最初の例が少し読みやすくなります。従来、ブロックが 1 行にある場合は中括弧を使用し、複数行のブロックの場合は do/end を使用します。


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

2 番目の例は、Java/C で多く見てきましたが、実際には Ruby でより機能的に行われているのを見てきました。

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)

ただし、オブジェクトを開始した後は、オブジェクトへの参照がありません。

于 2009-12-15T17:42:53.733 に答える