это хорошая практика программирования, чтобы поместить выражения кода в фигурные скобки? - PullRequest
2 голосов
/ 15 декабря 2009

Я никогда не видел, чтобы это делалось где-либо во всем исходном коде, который я прочитал в своей жизни. Если это считается плохой практикой программирования, должна быть причина, которую я не понимаю. Кроме того, я думаю, что это иногда улучшает читабельность, а не ухудшает ее. Вот несколько мест, где я сделал это в своем коде 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 ]

9 голосов
/ 15 декабря 2009

Всегда хорошая идея стремиться к простоте, где это возможно, и с этой целью лучше изложить вещи простым и понятным образом. Подобные объявления затрудняют определение источника переменных, так как они довольно тщательно встроены в оператор.

Объявление переменных в квадратных скобках обычно считается допустимым:

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 голосов
/ 15 декабря 2009

Я думаю, что это довольно сложно читать. Я бы предпочел это немного более многословно, но более четко

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 голосов
/ 15 декабря 2009

Код со слишком большим количеством логических утверждений, втиснутых в 1 строку, трудно читать, потому что читатель, по сути, должен раскрутить его в своем мозгу в утверждение, подобное ответу troelskn.

Другие причины, по которым он менее читабелен:

  • Это заставляет длину строки проходить за границы большинства окон текстового редактора.
  • Это затеняет отдельные шаги, которые могут вам понадобитьсясмотрите при отладке.
2 голосов
/ 15 декабря 2009

Я думаю, ты имеешь в виду паренов?

Брейс: {

Парен: (

Ваш первый пример становится немного более читабельным, если вы используете фигурные скобки вместо do / end - обычно вы используете фигурные скобки, если блок находится в одной строке, с do / end для многострочных блоков.


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

Второй пример, который я часто видел в 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)

Но у вас нет ссылки на объект после его запуска.

...