Программисты на языках, где сильно метапрограммирование (чтобы под этим не понималось), зачастую несколько злоупотребляют своими возможностями по "упрощению" своей работы.
Пример (это Ruby):
Автору идеи не нравится часто используемая конструкция (проверить существование объекта и вызвать его метод)
@person ? @person.name : nilПричины, почему не
(
Read more... )
Comments 21
class Ornil
def initialize(object)
@content = object
end
def method_missing(method, *args)
begin
@content.send(method, *args)
rescue NoMethodError
nil
end
end
end
class Object
def try
Ornil.new(self)
end
end
puts "str".try.length
puts "str".try.whatif
puts "str".try.split(//)
puts "str".try.bogus(42)
По-моему, имя после точки читается как вызов однозначно. Или у вас, рубистов, не так? Я не издеваюсь, я правда не знаю, я на этом вашем языке ни разу в жизни не писал!
... Некоммерческая террористическая организация ...
Reply
Это, кстати, хороший пример "неправильного выбора идеомы" (именно в рамках привычного рубисту).
(Кроме того, кстати, если брать с т.з. эффективности, то предложенный вариант получится наименее эффективным из-за method_missing и игнорирование ошибок через перехват исключения; и еще кроме того, трюки с method_missing считаются довольно "грязными", для них должно быть серьезное обоснование. Именно потому, что от obj.blah как правило ожидаешь вызова метода blah, а не самодеятельности с решением то ли вызывать, то ли не вызывать, то ли вызвать но не его...)
Reply
Хрен его знает. Мне нравится самый первый вариант. Чем-то это напоминает священные войны между Коммон-Лисповцами, как правильно писать: (make-hash-table :test 'equal) или (make-hash-table :test #'equal), а также (mapcar (lambda (x) (+ x 1) '(1 2 3)) и (mapcar #'(lambda (x) (+ x 1)) '(1 2 3)). Лично я всегда пишу первые варианты, потому что считаю, что, если по смыслу видно, что "это" предназначено обозначать функцию, то вряд ли с ней будут делать что-то другое.
Насколько я смог понять, конструкция &:name в Ваших примерах должна напоминать читающему, что это блок, а стало быть, он будет вызываться. Ну хорошо, а сколь велики шансы встретить в программе символы, которые не являются именами методов и, стало быть, вызываться не будут? Если близкие к нулевым, то и так ясно, что раз символ, значит, метод, а раз метод, значит, будет вызываться. Или нет?
... Защита от дурака на дур не рассчитана ...
Reply
огромны. символы в Руби используются везде, например, для задания опций чего-нибудь:
Net.connect(:host => 'blah', :port => 8080, :proxy => 'proxy.proxy.ua')
- идеома "именованных параметров".
Или, какой-нибудь там, не знаю:
cool_document.format_as(:html)
cool_document.format_as(:text)
Или даже так:
div(:style => 'width:100%;'){
span "Test", :id => 'main-span'
}
Именно поэтому, когда я вижу something.try(:name) - что означает этот символ - совершенно неочевидно. В том-то и суть претензий к первому варианту :)
Reply
Leave a comment