Re: [Ruby] Фабрика, eval или что-то еще

SoNaR sonar на scli.ru
Пн Июл 26 18:45:28 MSD 2004


Уважаемый SoNaR,

Monday, July 26, 2004, 6:35:48 PM, Вы писали следующее:

S> Уважаемый Ruby,

S>   Есть такой метод:
  
S>     def parse( body = @mail.body )
S>         {
S>         'SEND_ME'      =>  /SEND ME (.*)/i,
S>         'ALIAS'        =>  /\$[a-z]+\$/i
S>         }.inject( [] ){ |result,i|
S>             key, value = i
S>             result += case key
S>                 when 'SEND_ME'
S>                     ETALON6_SEND_ME.new( @mail.from[0], body.scan( value ) ).create_request
S>                 when 'ALIAS'
S>                     ETALON6_ALIAS.new( @mail.from[0], body.scan( value ) ).create_request
S>                 else
S>                     []
S>             end
S>             result
S>         }
S>     end

S>   Хочу избавиться от case_when, но ничего кроме eval И фабрики в
S>   голову не лезет.

S>     def parse( body = @mail.body )
S>         {
S>         'SEND_ME'      =>  /SEND ME (.*)/i,
S>         'ALIAS'        =>  /\$[a-z]+\$/i
S>         }.inject( [] ){ |result,i|
S>             key, value = i
S>             result += eval( [ self.class.to_s.split('_').last, key].join('_') ).new( @mail.from[0], body.scan( value ) ).create_request
S>             result
S>         }
S>     end
  
S>   Фабрику делать не с руки, т.к. объекты обычно по одному ходят. Может
S>   вообще как-то без них обойтись? Но тогда коряво получается... Чего посоветуете?

     Решение как всегда пришло тогда, когда я нажал кнопку SEND. :-) Я
     создал массив с именами классов, а регулярные выражения запрятал
     в эти самые классы. В результате получилось вроде как красивее... :-)

    def parse( body = @mail.body )
        [ ETALON6_SEND_ME, ETALON6_ALIAS ].inject( [] ){ |result,class_name|
            result += class_name.new( @mail.from[0], body.scan( value ) ).create_request
            result
        }
    end
     


---
г.Москва, Научный центр правовой информации при Минюсте РФ

Шипиев Роман Николаевич
Начальник отдела проектирования, программирования 
и сопровождения информационных систем.

Тел: (095) 459-05-12
E-Mail: sonar на scli.ru
UIN: 289794359



Подробная информация о списке рассылки Ruby