2014-12-09 3 views
0

Любые предложения по реорганизации этого уродливого футляра-переключателя в нечто более элегантное?refactor large switch-statement

Этот метод (в Ruby) возвращает (краткое или полное) описание для бельгийских провинций с учетом почтового индекса.

def province(zipcode, short = false) 
    case zipcode 
    when 1000...1300 
    short ? 'BXL' : 'Brussel' 
    when 1300...1500 
    short ? 'WBR' : 'Waals-Brabant' 
    when 1500...2000, 3000...3500 
    short ? 'VBR' : 'Vlaams-Brabant' 
    when 2000...3000 
    short ? 'ANT' : 'Antwerpen' 
    when 3500...4000 
    short ? 'LIM' : 'Limburg' 
    when 4000...5000 
    short ? 'LIE' : 'Luik' 
    when 5000...6000 
    short ? 'NAM' : 'Namen' 
    when 6000...6600, 7000...8000 
    short ? 'HAI' : 'Henegouwen' 
    when 6600...7000 
    short ? 'LUX' : 'Luxemburg' 
    when 8000...9000 
    short ? 'WVL' : 'West-Vlaanderen' 
    when 9000..9999 
    short ? 'OVL' : 'Oost-Vlaanderen' 
    else 
    fail ArgumentError, 'Not a valid zipcode' 
    end 
end 

Основываясь на предложениях от MiiinimalLogic, я сделал вторую версию. Это предпочтительнее?

class Provincie 
    ProvincieNaam = Struct.new(:kort, :lang) 

    PROVINCIES = { 
    1000...1300 => ProvincieNaam.new('BXL', 'Brussel'), 
    1300...1500 => ProvincieNaam.new('WBR', 'Waals-Brabant'), 
    1500...2000 => ProvincieNaam.new('VBR', 'Vlaams-Brabant'), 
    2000...3000 => ProvincieNaam.new('ANT', 'Antwerpen'), 
    3000...3500 => ProvincieNaam.new('VBR', 'Vlaams-Brabant'), 
    3500...4000 => ProvincieNaam.new('LIM', 'Limburg'), 
    4000...5000 => ProvincieNaam.new('LIE', 'Luik'), 
    5000...6000 => ProvincieNaam.new('NAM', 'Namen'), 
    6000...6600 => ProvincieNaam.new('HAI', 'Henegouwen'), 
    6600...7000 => ProvincieNaam.new('LUX', 'Luxemburg'), 
    7000...8000 => ProvincieNaam.new('HAI', 'Henegouwen'), 
    8000...9000 => ProvincieNaam.new('WVL', 'West-Vlaanderen'), 
    9000..9999 => ProvincieNaam.new('OVL', 'Oost-Vlaanderen') 
    }.freeze 

    def self.lang(postcode) 
    provincie_naam(postcode).lang 
    end 

    def self.kort(postcode) 
    provincie_naam(postcode).kort 
    end 

    def self.provincie_naam(postcode) 
    PROVINCIES.each { |list, prov| return prov if list.cover?(postcode) } 
    fail ArgumentError, 'Geen geldige postcode' 
    end 

    private_class_method :provincie_naam 
end 
+2

какой это язык? – MiiinimalLogic

+0

извините, если не ясно. Это в рубине. – Thomvil

+1

Этот вопрос на самом деле принадлежит [Code Review] (http://codereview.stackexchange.com/) (я там модератор). * Если этот код работает так, как предполагалось *, вы можете его перепроверить и удалить здесь вопрос. – Jamal

ответ

0

Лично я бы указать почтовый индекс находится в пределах & провинции информации в другой структуре данных, а-ля карта объектов Range/Провинции, а затем использовать методы Range рубина, чтобы проверить, если результат попадает в диапазон с полигоном метод.

0

Вы можете рассмотреть возможность поиска только одного диапазона, как здесь, так и с картой, со вторичным поиском (возможно, на карте) из краткого описания в подробное описание.