sjs*_*jsc 3 ruby ruby-on-rails
对于一个动作,是否使用50个if-else语句过于耗费资源?
我正在做这样的事情:
if team.players.count > 1
assign_team_type(..)
elsif team.players.count > 3
assign_team_type(..)
...
etc.
...
end
Run Code Online (Sandbox Code Playgroud)
另外,在控制器中的create action中放置50个if-else语句而不是after_create方法会更有效吗?或者使用case switch语句更有效率,还是完全避免使用它?
编辑:感谢您的快速回复!该代码用于社区体育锦标赛,根据该团队的球员数量分配球队.我正在尝试根据向该团队添加的玩家数量,为每个团队编写一个团队类型.因此,有1个玩家,3个玩家,5个玩家,7个玩家等的团队,最多200个玩家,总共需要50个if-else语句.
这些陈述发生在players_controller中,在用户访问http:// localhost/players/new之后,添加一个玩家,然后应用程序根据该团队当前有多少玩家决定分配他或她的团队的团队.它非常简单(一个基本的CRUD应用程序只需要这50个if-else语句)
models:
Team (has_many :players)
Player (belongs_to :team)
scaffold team name:string team_type:string
scaffold player team_id:integer name:string
Run Code Online (Sandbox Code Playgroud)
那就是它:)
您可以尝试将其重写为
assign_team_type(case team.players.count
when 2 then ...
when 3..5 then ...
else raise "Assignment failed"
end
)
Run Code Online (Sandbox Code Playgroud)
这应该更快,因为team.players.count只评估一次.此外,它更清洁,更短.基准将有所帮助.
呃,这是一个非常糟糕的代码味道.您可能会有一些实质性重复,可以推送到模型中,或者至少可以卷入其他内容.
为什么不将它们放入数组或哈希?就像是:
TeamTypes = { 1 => something, 2 => something_else, .. }
assign_team_type( TeamTypes[team.players.count] )
Run Code Online (Sandbox Code Playgroud)