首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化包含类似键和值的映射哈希?

如何优化包含类似键和值的映射哈希?
EN

Stack Overflow用户
提问于 2020-11-28 08:55:37
回答 1查看 101关注 0票数 1

我有一些常量定义如下

代码语言:javascript
复制
CONSUMER_TYPE = 'consumer'
CONSUMER_1_TYPE = "#{CONSUMER_TYPE}1"
CONSUMER_2_TYPE = "#{CONSUMER_TYPE}2"
CONSUMER_3_TYPE = "#{CONSUMER_TYPE}3"

INDUSTRIAL_TYPE = 'industrial'
INDUSTRIAL_1_TYPE = "#{INDUSTRIAL_TYPE}1"
INDUSTRIAL_2_TYPE = "#{INDUSTRIAL_TYPE}2"
INDUSTRIAL_3_TYPE = "#{INDUSTRIAL_TYPE}3"

SERVICES_TYPE = 'services'
SERVICES_1_TYPE = "#{SERVICES_TYPE}1"
SERVICES_2_TYPE = "#{SERVICES_TYPE}2"
SERVICES_3_TYPE = "#{SERVICES_TYPE}3"

记录字段可以有像services2industrial1这样的值。在我的模型中,我创建了一个映射方法,它应该根据记录字段的值返回具有不同属性集的散列,如下所示

代码语言:javascript
复制
def classification_attributes
  product_type_mapping[product_type]
end

def product_type_mapping
  {
     CONSUMER_1_TYPE => { abc: abc, vpn: vpn, lbc: lbc },
     CONSUMER_2_TYPE => { abc: abc, vpn: vpn, lbc: lbc },
     CONSUMER_3_TYPE => { abc: abc, vpn: vpn, lbc: lbc },
     INDUSTRIAL_1_TYPE => { vpn: vpn, htt: htt, bnn: bnn },
     INDUSTRIAL_2_TYPE => { vpn: vpn, htt: htt, bnn: bnn },
     INDUSTRIAL_3_TYPE => { vpn: vpn, htt: htt, bnn: bnn },
     SERVICES_1_TYPE => { dhy: dhy, rtt: rtt, abc: abc },
     SERVICES_2_TYPE => { dhy: dhy, rtt: rtt, abc: abc },
     SERVICES_3_TYPE => { dhy: dhy, rtt: rtt, abc: abc }
  }
end

例如,如果一个记录包含一个值consumer3,则映射方法应该返回{ abc: abc, vpn: vpn, lbc: lbc }。正如您所看到的,有大量的代码重复。我想知道是否有更理想和简洁的方式来处理这项任务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-28 09:31:49

constants.

  • Don't

  • 使用符号代替公开映射.

Ruby中的常量主要是关于信息隐藏的。例如,如果键从consumer1更改为consumer_1,只要所有东西都使用CONSUMER_1_TYPE访问Hash,那么您就没事了。为什么冒这个险?

相反,完全隐藏哈希。既然它是隐藏的,常量就没有必要了。用符号。

如果所有的值都是相同的,那么将它们放入自己的方法中。

代码语言:javascript
复制
def classification_attributes(product_type)
  product_type_mapping[product_type]
end

private def consumer_config
  { abc: abc, vpn: vpn, lbc: lbc }
end

private def industrial_config
  { vpn: vpn, htt: htt, bnn: bnn }
end

private def services_config
  { dhy: dhy, rtt: rtt, abc: abc }
end

private def product_type_mapping
  {
     conumser1: consumer_config,
     consumer2: consumer_config,
     consumer3: consumer_config,
     industrial1: industrial_config,
     industrial2: industrial_config,
     industrial3: industrial_config,
     services1: services_config,
     services2: services_config,
     services3: services_config
  }
end

这是我所能说的,没有更多的背景。如果存在如此多的冗余,您可能可以将product_type分为类型和子类型。

考虑将product_type_mapping移动到config/application.rb中,以及任何其他相关配置。这使得应用程序配置保持在一个地方,而不是分散在不同的类中。

代码语言:javascript
复制
module YourApp
  class Application < Rails::Application
    config.x.consumer_config = { abc: abc, vpn: vpn, lbc: lbc }.freeze
    config.x.industrial_config = { vpn: vpn, htt: htt, bnn: bnn }.freeze
    config.x.services_config = { dhy: dhy, rtt: rtt, abc: abc }.freeze

    config.x.product_type_mapping = {
      conumser1: config.x.consumer_config,
      consumer2: config.x.consumer_config,
      consumer3: config.x.consumer_config,
      industrial1: config.x.industrial_config,
      industrial2: config.x.industrial_config,
      industrial3: config.x.industrial_config,
      services1: config.x.services_config,
      services2: config.x.services_config,
      services3: config.x.services_config
    }.freeze
  end
end

# in your class...

def classification_attributes(product_type)
  Rails.configuration.x.product_type_mapping[product_type]
end
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65047938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档