Именнованные аргументы(keyword arguments ) в Ruby 2

Ruby 2.0 предоставляет поддержку именнованных аргументов в функциях:

def foo(bar: 'default')
puts bar
end
foo # => 'default'
foo(bar: 'baz') # => 'baz'

В Ruby 1.9, мы можем осуществить похожий механизм используя одиночный хэш-параметр:

def foo(options = {})
bar = options.fetch(:bar, 'default')
puts bar
end
foo # => 'default'
foo(bar: 'baz') # => 'baz'

В Ruby 2.0 блоки также могут быть определены с именнованными аргументами:

define_method(:foo) do |bar: 'default'|
puts bar
end
foo # => 'default'
foo(bar: 'baz') # => 'baz'

Опять же, чтобы добиться похожего поведения в Ruby 1.9, мы можем использовать блок с хэшем, из которого мы хотели бы извлечь значения аргументов.

Обязательные именнованные аргументы

К сожалению, Ruby 2.0 не имеет встроенной поддержки для обязательных аргументов. И к счастью, Ruby 2.1 предоставляет обязательные аргументы, которые определяются через двоеточие:

def foo(bar:)
puts bar
end
foo # => ArgumentError: missing keyword: bar
foo(bar: 'baz') # => 'baz'

Если обязательные именнованные аргументы пропушенны, то интерпретатор оповестит нас об ошибке ArgumentError , которая говорим о том, что данные параметры обязательны к заполнению.

Аргументы против хэша

С отличной функциональностью аргументов в Ruby, нам не обязательно возиться с хэшем и извлекать из него значения. Ненужный шаблон, связанный с такого рода извлечением, подвергает нас лишним ошибкам и багам.

С именнованными аргументами, которые видны в названии метода, мы можем немедленно использовать имена аргументов без необходимости изучать тело метода. Это очень удобно.

Именнованные аргументы против обычных входных аргументов

Допустим мы имеем метод с обычными входными аргументами:

def mysterious_total(subtotal, tax, discount)
subtotal + tax - discount
end
mysterious_total(100, 10, 5) # => 105

Эта функция делает свою работу, но читая название методаmysterious_total, я понятия не имею, что эти аргументы значат без реализации(тела) этого метода.

Используя именнованные аргументы, мы знаем, что они значат без тела метода:

def obvious_total(subtotal:, tax:, discount:)
subtotal + tax - discount
end
obvious_total(subtotal: 100, tax: 10, discount: 5) # => 105

Именнованные аргументы позволяют нам работать напрямую с аргументами, без вникания в поведение метода:1

obvious_total(subtotal: 100, discount: 5, tax: 10) # => 105

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

mysterious_total(100, 5, 10) # => 95

Вывод

Как и множество вещей в программировании, именнованные аргументы имеют свои преимущества и недостатки. Обычные аргументы предлагают более лаконичный способ вызова метода. Но ясность и поддерживаемость кода достигается за счет именнованных аргументов. Я бы использовал подход с обычными аргументами, если я легко могу догадаться о каких именно аргументах идет речь в контексте метода, но, как показывает практика, такое редко случается.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.