- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
指标/圈复杂度:notification_path 的圈复杂度太高。 [9/8]而且我不明白如何解决这个问题。你能帮帮我吗?谢谢
def notification_path
return h.company_trial_activation_index_path if User.current.company.trial_pending?
dot = object.eventable
case object.event.to_sym
when :new_app, :updates_approved, :updates_disapproved, :new_partial_app, :completed_app, :received_lead
h.company_dot_application_path(id: dot.id)
when :bg_check_received, :bg_check_failed, :bg_check_completed
h.company_dot_application_background_checks_path(dot)
when :voe_completed, :voe_corrected, :voe_invalid,
:voe_driving_school_completed, :voe_driving_school_corrected, :voe_driving_school_invalid
h.company_dot_application_applications_requests_path(dot_application_id: dot.id)
when :voe_instructions, :voe_driving_school_instructions
h.company_dot_application_applications_requests_path(dot.id)
when :email_reply, :note, :sms_reply
h.company_dot_application_communications_path(dot.id)
when :follow_up_task, :follow_up_task_on_due_date
h.company_dot_application_follow_up_tasks_path(dot_application_id: dot.id)
when :bulk_actions_background_location, :bulk_actions_background_assign_user, :bulk_actions_background_lead_source
h.home_users_path
else
h.home_users_path
end
end
最佳答案
在讨论圈复杂度之前,让我们解决该函数的两个更大的问题。巨大的数组列表和全局变量。因为 Rubocop 的目的是让您的代码更易于阅读和维护,并减少出现错误的可能性,而不是从列表中剔除。
如果符号列表被命名,事情会更具可读性。
WHATEVER_THESE_ARE = [
:new_app, :updates_approved, :updates_disapproved,
:new_partial_app, :completed_app, :received_lead
].freeze
BG_CHECK_DONE = [
:bg_check_received, :bg_check_failed, :bg_check_completed
].freeze
...and so on...
def notification_path
return h.company_trial_activation_index_path if User.current.company.trial_pending?
dot = object.eventable
case object.event.to_sym
when WHATEVER_THESE_ARE
h.company_dot_application_path(id: dot.id)
when BG_CHECK_DONE
h.company_dot_application_background_checks_path(dot)
...and so on...
end
end
然后注意你的函数没有参数。它使用两个全局变量,名称模糊的 object
和 h
。我不知道这些到底是什么,这些名字没有帮助,但也许你为这个问题对它们进行了 sanitizer 。将它们用作全局变量会使代码更加复杂。它们应作为参数传入,或至少以描述性命名。
def notification_path(better_name_for_h, better_name_for_object)
...
end
好的,关于气旋复杂性。 case
基本上是一个很大的 if/elsif/else,每个 when
都增加了一点复杂性。对于这么大的表,我们似乎无能为力,但让我们首先观察一下这种情况仅取决于 object.event
、object.eventable
(事件表?为什么命名为dot
?)和h
。我们可以做一个提取方法。
def notification_path(h, object)
return h.company_trial_activation_index_path if User.current.company.trial_pending?
dot_to_application_path(object.event, object.eventable, h)
end
def dot_to_application_path(event, dot, h)
case event.to_sym
when WHATEVER_THESE_ARE
h.company_dot_application_path(id: dot.id)
when BG_CHECK_DONE
h.company_dot_application_background_checks_path(dot)
...
else
h.home_users_path
end
end
这切断了总计 1 给我们 8。其他人已经观察到最终条件是多余的,所以切断它给出 7。有时你只是比 Rubocop 更清楚逻辑真的很复杂并且可以添加一个异常(exception).
# rubocop:disable Metrics/CyclonicComplexity
def dot_to_application_path(event, dot, h)
这是最后的手段。考虑 Rubocop 的提示总是值得的。我们已经通过尝试修复 Rubocop 问题对代码进行了相当大的改进。
或者我们可以进一步挖掘。
我们可以观察到这张表正在做两件事。它正在选择适当的路径方法并规范它的调用方式。每个路径方法采用的点
略有不同,这使事情变得更加复杂且容易出错。
如果方法一致,我们可以用哈希查找替换大小写。
WHATEVER_THESE_ARE = [
:new_app, :updates_approved, :updates_disapproved,
:new_partial_app, :completed_app, :received_lead
].freeze
BG_CHECK_DONE = [
:bg_check_received, :bg_check_failed, :bg_check_completed
].freeze
...
# You'll want to put this somewhere else.
def flatten_keys(hash)
hash.each_with_object({}) { |(keys, value), new_hash|
keys.each { |key| new_hash[event] = value }
}
end
EVENT_TO_APPLICATION_PATH_METHOD = flatten_keys({
WHATEVER_THESE_ARE => :company_dot_application_path,
BG_CHECK_DONE => :company_dot_application_background_checks_path,
...
}).freeze
def notification_path(h, object)
return h.company_trial_activation_index_path if User.current.company.trial_pending?
method = EVENT_TO_DOT_APPLICATION_PATH_METHOD[object.event.to_sym] || :home_users_path
h.send(method, dot)
end
现在我们可以看到这段代码有多简单了!
要实现这一点,您可以重构方法以使其保持一致,或者您可以编写使其保持一致的包装方法。重构是更可取的选择,但这可能超出您的范围。
最后,这可能都足够复杂,足以保证将所有逻辑放入一个类中。
关于ruby-on-rails - Rubocop Metrics/CyclomaticComplexity 以防万一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52520697/
我尝试使用 Keras Tuner 进行超参数优化: import keras from kerastuner import HyperModel from kerastuner.tuners imp
它有一些不错的地方(比如它封装了圈复杂度的概念),我想知道是否有人在“现实生活”中使用过它。如果是这样,你有什么经验?它是衡量规模的有用指标吗(相对于 KLOC 或功能点)? 对于那些想知道我在抽什么
我有一个启用了 Actuator 和 Hystrix 的 spring-boot-app。 Spring-Boot-版本:1.3.1.RELEASE org.springframework.
我在尝试使用 metrics for graphite 时收到 carbon 错误: [listener] invalid line received from client HOST:PORT, i
尝试使用谷歌搜索,但找不到如何在 keras 中实现像 cohen kappa、roc、f1score 这样的 Sklearn 指标作为不平衡数据的指标。 如何在 Keras 中将 Sklearn M
Keras 2.x 取消了我需要使用的一堆有用指标,因此我将旧的metrics.py 文件中的函数复制到我的代码中,然后按如下方式包含它们。 def precision(y_true, y_pred)
在某些情况下, tf.metrics.auc 产生的值与 sklearn.metrics.roc_auc_score 非常不同。 我无法确定这种情况的特殊性是什么,但我能够获得一个可重现的例子: 代码
我正在使用 sklearn,我注意到 sklearn.metrics.plot_confusion_matrix 的参数和 sklearn.metrics.confusion_matrix不一致。 p
我正在使用 Prometheus(prometheus-operator Helm chart)进行内存监控。 在调查值时,我注意到内存使用量 ( container_memory_working_s
由于 codahale-metrics 已移至 io. 下。我们代码中的一个实现使用了类: import com.codahale.metrics.JmxReporter 与依赖版本 3.2.2 现在
为什么有两个不同的属性用于指标报告?是什么让它们与众不同? 如果它们不同,那么何时使用哪一个? 谢谢,阿比 最佳答案 Kafka 使用 2 个库作为其指标: "Yammer" metrics : 这些
我的目标是可视化 vertx 指标 - 例如通过 eventbus 发送的消息计数等。(请考虑以下工具都在我的本地主机上,没有任何东西驻留在单独的机器上) 因此,我使用了 vertx 的 Hawkul
我观察到一件奇怪的事情。 heap.used 随着每次后续的/metrics api 调用而增加。我是唯一使用此应用程序的客户。不知道为什么会发生。有人可以解释一下吗? “堆.已使用”:62495 “
在使用 kubeadm 安装 Kubernetes 后,我试图创建一个水平 pod 自动缩放。 主要症状是kubectl get hpa返回列 TARGETS 中的 CPU 指标作为“未定义”: $
我在 minikube 上启用了 heapster minikube addons start heapster 和自定义指标 minikube start --extra-config kubele
我尝试序列化我的 Map>对象使用 Gson但我收到 JSON 字符串响应。而且我在内部 Map 中有指标值和名称我的代码如下所示: @GetMapping(path = "/showRawKafka
我们正在尝试在台风kubernetes集群上启动metricbeat。但是由于以下原因,它在启动后无法获得一些特定于Pod的事件,例如重新启动等 对应的metricbeat.yaml代码段 # Sta
我是 k8s 的新手,普罗米修斯。我正在尝试使用 prometheus 收集每个 pod 的指标,但由于错误而无法这样做: API ERROR . { "kind": "Status", "a
我使用 xgboost 进行预测,我的主要代码如下: params={ 'booster':'gbtree', 'object':'binary:logistic', 'ear
来自OTel Metrics specification计数器是用于衡量已完成请求数的推荐工具。这稍后可用于计算吞吐率。 Example uses for Counter: count the num
我是一名优秀的程序员,十分优秀!