代码气候 - 太复杂错误
Code Climate - Too Complex Error
我在我的一个项目中使用代码气候,但我收到了一个错误,因为有 "too complex" 代码。我不确定如何使调用的代码不那么复杂?这是:
方法:
def apply_json
{
total_ticket_count: payment_details.tickets.count,
subtotal: payment_details.subtotal.to_f,
discount: payment_details.discount.to_f,
fees: payment_details.fees_total.to_f,
total: payment_details.total_in_dollars.to_f,
coupon: {
amount: payment_details.coupon.amount,
type: payment_details.coupon.coupon_type,
name: payment_details.coupon.name,
valid: payment_details.coupon.valid_coupon?,
}
}
end
只是JSON我把模型藏起来了。我分支上的所有东西都对这个有很大的期望吗?我不确定该怎么办?关于如何使它不那么复杂有什么想法吗?
您可以提取优惠券子哈希作为返回该子哈希的方法。它将降低代码复杂性(对于 codeclimate),但这并不是真正必要的。然而有些人认为该方法必须有 5 个或更少的字符串。它们在大多数用例中都是正确的。但这完全由您决定。
def apply_json
{
total_ticket_count: payment_details.tickets.count,
subtotal: payment_details.subtotal.to_f,
discount: payment_details.discount.to_f,
fees: payment_details.fees_total.to_f,
total: payment_details.total_in_dollars.to_f,
coupon: subhash
}
end
def subhash
{
amount: payment_details.coupon.amount,
type: payment_details.coupon.coupon_type,
name: payment_details.coupon.name,
valid: payment_details.coupon.valid_coupon?,
}
end
如果 Code Climate 认为某些东西太复杂,我不会太在意,但实际上很容易理解。 Code Climate 应该可以帮助您编写更好、更易于阅读的代码。但它没有提供硬性规定。
如果你真的想改变一些东西,你可能想要将 coupon
子散列的生成移动到 Coupon
模型,因为它只依赖于 [=11] 提供的值=]协会:
def apply_json
{
total_ticket_count: payment_details.tickets.count,
subtotal: payment_details.subtotal.to_f,
discount: payment_details.discount.to_f,
fees: payment_details.fees_total.to_f,
total: payment_details.total_in_dollars.to_f,
coupon: payment_details.coupon.as_json
}
end
# in coupon.rb
def as_json
{
amount: amount,
type: coupon_type,
name: name,
valid: valid_coupon?
}
end
可以使用 payment_details
进行类似的重构,但不确定该属性来自何处以及它是否是关联模型。
您正在尝试使用代码描述数据从一种复杂结构到另一种复杂结构的转换,这在 Code Climate 等审查工具的眼中产生了很多 "complexity"。
可能有帮助的一件事是根据数据描述转换:
PAYMENT_DETAILS_PLAN = {
total_ticket_count: [ :tickets, :count ],
subtotal: [ :subtotal, :to_f ],
discount: [ :discount, :to_f ],
fees: [ :fees_total, :to_f ],
total: [ :total_in_dollars, :to_f ],
coupon: {
amount: [ :coupon, :amount ],
type: [ :coupon, :coupon_type ],
name: [ :coupon, :name ],
valid: [ :coupon, :valid_coupon? ]
}
}
这似乎不是一个巨大的变化,实际上也不是,但它提供了一些可衡量的好处。首先是你可以反映,你可以使用代码检查配置。另一个是,一旦您确定了这种格式,您就可以编写一个 DSL 来操作它、过滤或扩充它,等等。换句话说:它很灵活。
解释 "plan" 并不难:
def distill(obj, plan)
plan.map do |name, call|
case (call)
when Array
[ name, call.reduce(obj) { |o, m| o.send(m) } ]
when Hash
[ name, distill(obj, plan) ]
end
end.to_h
end
当你把它付诸行动时,你会得到:
def apply_json
distill(payment_details, PAYMENT_DETAILS_PLAN)
end
也许这种方法在您做的事情大致相同的其他情况下会有所帮助。
请忽略复杂性警告。
他们被误导了。
这些警告基于虚假科学。
圈复杂度于 1976 年在学术期刊上提出,由于易于实现而被工具构建者采纳。
但最初的研究存在缺陷。
原始论文提出了一种简单的算法来计算 Fortran 代码的复杂性,但没有提供任何证据表明计算出的数字实际上与代码的可读性和可理解性相关。 Nada,niente,零,zilch。
这是他们的摘要
This paper describes a graph-theoretic complexity measure and
illustrates how it can be used to manage and control program
complexity. The paper first explains how the graph-theory concepts
apply and gives an intuitive explanation of the graph concepts in
programming terms. The control graphs of several actual Fortran
programs are then presented to illustrate the correlation between
intuitive complexity and the graph-theoretic complexity. Several
properties of the graph-theoretic complexity are then proved which
show, for example, that complexity is independent of physical size
(adding or subtracting functional statements leaves complexity
unchanged) and complexity depends only on the decision structure of a
program.
The issue of using non structured control flow is also
discussed. A characterization of non-structured control graphs is given
and a method of measuring the "structuredness" of a program is
developed. The relationship between structure and reducibility is
illustrated with several examples.
The last section of this paper
deals with a testing methodology used in conjunction with the
complexity measure; a testing strategy is defined that dictates that a
program can either admit of a certain minimal testing level or the
program can be structurally reduced
来源http://www.literateprogramming.com/mccabe.pdf
如您所见,仅给出了轶事证据 "to illustrate the correlation between intuitive complexity and the graph-theoretic complexity",唯一的证据是可以重写代码以具有此指标定义的较低复杂度数。这是复杂性指标的一个很好的 non-sensical 证明,并且对于当时的研究质量来说非常普遍。按照今天的标准,这篇论文是无法发表的。
这篇论文的作者没有做过用户研究,他们的算法也没有任何实际证据。从那以后,没有研究能够证明圈复杂度和代码理解之间存在 link。更不用说这个复杂度指标是为 Fortran 而不是现代高级语言提出的。
确保代码理解的最佳方法是代码审查。只需让其他人阅读您的代码并修复他们不理解的任何内容即可。
所以只需关闭这些警告即可。
我在我的一个项目中使用代码气候,但我收到了一个错误,因为有 "too complex" 代码。我不确定如何使调用的代码不那么复杂?这是:
方法:
def apply_json
{
total_ticket_count: payment_details.tickets.count,
subtotal: payment_details.subtotal.to_f,
discount: payment_details.discount.to_f,
fees: payment_details.fees_total.to_f,
total: payment_details.total_in_dollars.to_f,
coupon: {
amount: payment_details.coupon.amount,
type: payment_details.coupon.coupon_type,
name: payment_details.coupon.name,
valid: payment_details.coupon.valid_coupon?,
}
}
end
只是JSON我把模型藏起来了。我分支上的所有东西都对这个有很大的期望吗?我不确定该怎么办?关于如何使它不那么复杂有什么想法吗?
您可以提取优惠券子哈希作为返回该子哈希的方法。它将降低代码复杂性(对于 codeclimate),但这并不是真正必要的。然而有些人认为该方法必须有 5 个或更少的字符串。它们在大多数用例中都是正确的。但这完全由您决定。
def apply_json
{
total_ticket_count: payment_details.tickets.count,
subtotal: payment_details.subtotal.to_f,
discount: payment_details.discount.to_f,
fees: payment_details.fees_total.to_f,
total: payment_details.total_in_dollars.to_f,
coupon: subhash
}
end
def subhash
{
amount: payment_details.coupon.amount,
type: payment_details.coupon.coupon_type,
name: payment_details.coupon.name,
valid: payment_details.coupon.valid_coupon?,
}
end
如果 Code Climate 认为某些东西太复杂,我不会太在意,但实际上很容易理解。 Code Climate 应该可以帮助您编写更好、更易于阅读的代码。但它没有提供硬性规定。
如果你真的想改变一些东西,你可能想要将 coupon
子散列的生成移动到 Coupon
模型,因为它只依赖于 [=11] 提供的值=]协会:
def apply_json
{
total_ticket_count: payment_details.tickets.count,
subtotal: payment_details.subtotal.to_f,
discount: payment_details.discount.to_f,
fees: payment_details.fees_total.to_f,
total: payment_details.total_in_dollars.to_f,
coupon: payment_details.coupon.as_json
}
end
# in coupon.rb
def as_json
{
amount: amount,
type: coupon_type,
name: name,
valid: valid_coupon?
}
end
可以使用 payment_details
进行类似的重构,但不确定该属性来自何处以及它是否是关联模型。
您正在尝试使用代码描述数据从一种复杂结构到另一种复杂结构的转换,这在 Code Climate 等审查工具的眼中产生了很多 "complexity"。
可能有帮助的一件事是根据数据描述转换:
PAYMENT_DETAILS_PLAN = {
total_ticket_count: [ :tickets, :count ],
subtotal: [ :subtotal, :to_f ],
discount: [ :discount, :to_f ],
fees: [ :fees_total, :to_f ],
total: [ :total_in_dollars, :to_f ],
coupon: {
amount: [ :coupon, :amount ],
type: [ :coupon, :coupon_type ],
name: [ :coupon, :name ],
valid: [ :coupon, :valid_coupon? ]
}
}
这似乎不是一个巨大的变化,实际上也不是,但它提供了一些可衡量的好处。首先是你可以反映,你可以使用代码检查配置。另一个是,一旦您确定了这种格式,您就可以编写一个 DSL 来操作它、过滤或扩充它,等等。换句话说:它很灵活。
解释 "plan" 并不难:
def distill(obj, plan)
plan.map do |name, call|
case (call)
when Array
[ name, call.reduce(obj) { |o, m| o.send(m) } ]
when Hash
[ name, distill(obj, plan) ]
end
end.to_h
end
当你把它付诸行动时,你会得到:
def apply_json
distill(payment_details, PAYMENT_DETAILS_PLAN)
end
也许这种方法在您做的事情大致相同的其他情况下会有所帮助。
请忽略复杂性警告。
他们被误导了。
这些警告基于虚假科学。
圈复杂度于 1976 年在学术期刊上提出,由于易于实现而被工具构建者采纳。
但最初的研究存在缺陷。
原始论文提出了一种简单的算法来计算 Fortran 代码的复杂性,但没有提供任何证据表明计算出的数字实际上与代码的可读性和可理解性相关。 Nada,niente,零,zilch。
这是他们的摘要
This paper describes a graph-theoretic complexity measure and illustrates how it can be used to manage and control program complexity. The paper first explains how the graph-theory concepts apply and gives an intuitive explanation of the graph concepts in programming terms. The control graphs of several actual Fortran programs are then presented to illustrate the correlation between intuitive complexity and the graph-theoretic complexity. Several properties of the graph-theoretic complexity are then proved which show, for example, that complexity is independent of physical size (adding or subtracting functional statements leaves complexity unchanged) and complexity depends only on the decision structure of a program.
The issue of using non structured control flow is also discussed. A characterization of non-structured control graphs is given and a method of measuring the "structuredness" of a program is developed. The relationship between structure and reducibility is illustrated with several examples.
The last section of this paper deals with a testing methodology used in conjunction with the complexity measure; a testing strategy is defined that dictates that a program can either admit of a certain minimal testing level or the program can be structurally reduced
来源http://www.literateprogramming.com/mccabe.pdf
如您所见,仅给出了轶事证据 "to illustrate the correlation between intuitive complexity and the graph-theoretic complexity",唯一的证据是可以重写代码以具有此指标定义的较低复杂度数。这是复杂性指标的一个很好的 non-sensical 证明,并且对于当时的研究质量来说非常普遍。按照今天的标准,这篇论文是无法发表的。
这篇论文的作者没有做过用户研究,他们的算法也没有任何实际证据。从那以后,没有研究能够证明圈复杂度和代码理解之间存在 link。更不用说这个复杂度指标是为 Fortran 而不是现代高级语言提出的。
确保代码理解的最佳方法是代码审查。只需让其他人阅读您的代码并修复他们不理解的任何内容即可。
所以只需关闭这些警告即可。