Help refactoring this nasty Ruby if/else statement

前端 未结 5 1837
无人共我
无人共我 2021-02-02 01:57

So I have this big, hairy if/else statement. I pass a tracking number to it, and then it determines what type of tracking number it is.

How can I simplify this thing? Sp

5条回答
  •  暖寄归人
    2021-02-02 02:29

    I believe this is sufficiently complex to deserve its own method.

    BTW, if the length is 20 then the original function returns whatever check_response(n) returns, yet then attempts (and will always fail) to return 'usps'.

    @lenMap = Hash.new false
    @lenMap[17] = 'dhlgm'
    @lenMap[13] = @lenMap[20] = @lenMap[22] = @lenMap[30] = 'usps'
    @lenMap[12] = @lenMap[15] = @lenMap[19] = 'fedex'
    @lenMap[10] = @lenMap[11] = 'dhl'       
    
    def ts n
      len = n.length
      return false if len < 8
      case n
        when /^.Z/
          return 'ups'
        when /^Q/
          return 'dhl'
        when /^96....................$/
          return 'fedex'
        when /^[HK]..........$/
          return 'ups'
      end
      return check_response n if len == 18 or len == 20
      return @lenMap[len]
    end
    
    # test code...
    def check_response n
      return 'check 18/20 '
    end
    %w{ 1Zwhatever Qetcetcetc 9634567890123456789012 H2345678901
        K2345678901 hownowhownowhownow hownowhownowhownow90
        12345678901234567
        1234567890123
        12345678901234567890
        1234567890123456789012
        123456789012345678901234567890
        123456789012
        123456789012345
        1234567890123456789
        1234567890
        12345678901 }.each do |s|
          puts "%32s  %s" % [s, (ts s).to_s]
        end
    

提交回复
热议问题