【发布时间】:2015-12-16 19:48:13
【问题描述】:
我一直在开发一款需要模拟一长串国家/地区的游戏(如果有的话,更像是一个网络玩具),我已经设法让它工作,但我不禁感到我的解决方案既不是 Rubyish 也不是优雅的方式。
代码看起来有点像这样:
class Countries
include Singleton
def get(tag)
return eval "@#{tag}"
end
def initialize
@array = []
@afghanistan = Country.new("Afghanistan", [:authoritarian, :reactionary, :sunni, :capitalist, :militarist, :southern_asia, :unstable])
@afghanistan.gdp = 20444
@afghanistan.population = 26023
@array << :afghanistan
@albania = Country.new("Albania", [:hybrid, :conservative, :sunni, :capitalist, :pacifist, :southern_europe])
@albania.gdp = 13276
@albania.population = 2893
@array << :albania
#and so on and so forth
end
attr_accessor :array
end
countries = Countries.instance
puts countries.get("usa").name
puts
for i in 0..(countries.array.size-1)
puts countries.get(countries.array[i]).name
end
我得到了预期的输出
United States
Afghanistan
Albania
Algeria
...
但理想情况下,一个优雅的解决方案不需要 .get(),而且这看起来不像是解决这个问题的类似 Ruby 的方式。有没有更好的做法?
我主要从 Stack Overflow、Ruby 文档和测试中学到了一些知识,所以我很可能在此过程中违反了很多最佳实践。 Country 类的初始化程序采用一个字符串作为名称和一个要添加的标签数组,而其他属性打算在单独的行中添加。
【问题讨论】:
-
您绝对要做的第一件事就是将国家/地区存储在哈希中
-
@DamianoStoffie 你的意思是替换数组还是替换类?
-
@spickermann 的解决方案是我推荐的解决方案,但这里有一些关于类设计的更大问题。 SOLID principles 可能值得一读,尤其是单一职责原则和 DRY。
标签: ruby coding-style