我正在模仿餐厅供应的菜肴。我可能会做一个像这样的Dish类:
class Dish
attr_accessor :name, :price, :ingredients, etc...
def initialize(dish_name, dish_price, etc...)
name= dish_name
price= dish_price
end
end
关于内存使用情况,为每个菜创建一个Dish实例({1}},或者创建一个子类Dish,Dish.new("Chicken Curry", ...)
的新类更好吗?在硬件资源方面选择这两种方法时还有其他需要考虑的事项吗?
为了澄清,ChickenCurry类只包含一个构造函数,它设置了相应的字段,如下所示:
class ChickenCurry < Dish; ...; end;
哪个使用了更多资源class ChickenCurry < Dish
def initialize
super("Chicken Curry", ...)
end
end
或Dish.new
?差异可以忽略不计吗?我计划拥有数千个这样的对象,所以即使10 KB的差异值得考虑。
我正在使用JRuby,所以请在回答时考虑JVM,但也欢迎有关Matz的Ruby的答案。
这不是关于设计的问题。我只对资源使用感兴趣。
答案 0 :(得分:0)
继承的全部目的是从超类继承常见事物并添加更多特定事物的子类。
为什么Chicken Curry
在没有任何糖时应该有一个字段文件sugarQuantity
。所以,恕我直言,你应该使用继承来做一个好的OO设计,所以有一个超级类,它将有共同的东西,然后每个子类将继承公共,并添加更具体的。
如果您将所有内容放在一个类中,那么会导致代码滥用,并且会有如此多的不必要的字段。
简而言之,根据您的情况,您需要使用 Inheritance 和 Cohesion 的概念来制作良好的OO设计。
什么使用更多内存,Class对象或该类的实例?
当您构建菜肴的对象时,绝对使用继承将导致较少的内存使用。
对象是类的运行时表示,它将根据类中字段的内存要求占用内存。尽量减少字段数量(通过继承和实际实现),您将获得良好的内存占用。如果你把所有东西放在一个班级中,那么肯定会有一个非常糟糕的记忆足迹。
考虑到在同一个菜单类中有1000个字段,并且在创建对象时,所有1000个字段将根据其数据类型占用一些内存空间。
通过继承和凝聚力,您可以拥有更好的内存占用+ OO设计。
P.S。:我是素食主义者:)
答案 1 :(得分:0)
不要担心记忆,要问自己的主要问题是:ChickenCurry
是否有任何延伸Dish
行为的行为?如果你的答案是否定的(就像你说的那样只有构造函数)那么只使用一个类。
让您的系统清晰易懂。
请记住这一点:
“过早优化是所有邪恶的根源”--DonaldKnuth