Ruby包含对象的最佳实践

弗拉德科·莫泽克(Vladko Mozec)

首先,大家好

我想知道红宝石中对象包含的最佳实践。让我们描述一下上下文:

  • 对象A是“根”对象
  • 对象B是一个独立的对象,但需要访问A属性。所以要初始化它,我执行“ B.new(instance_of_A,other_param)”,然后将A的实例存储在attr_accessor中。
  • 对象C是一个独立的对象,但需要访问B属性。因此,我使用相同的方式对其进行初始化(传递B的实例)

结果是我最终得到了可能非常大的嵌套对象,然后重复自己。

还有其他解决方案/模式可以这样做,但方式更简洁吗?有没有很好的例子?

谢谢 !

这是一个基本示例,但可以想象该对象在具有很多属性的情况下会变得更大。

require 'awesome_print'

class A
  attr_accessor :title

  def initialize(title)
    @title = title
  end
end

class B
  attr_accessor :a, :level

  def initialize(a, level)
    @a = a
    @level = level

    # Here, I need to access to a.title
  end
end

class C
  attr_accessor :b, :name

  def initialize(b, name)
    @b = b
    @name = name

    # Here, I need to access to b.level
  end
end

a = A.new 'test'

b1 = B.new a, 1
b2 = B.new a, 2
b3 = B.new a, 3

c1 = C.new b1, 'one one'
c2 = C.new b1, 'one two'
c3 = C.new b1, 'one three'

ap c1
ap c2
ap c3

c4 = C.new b2, 'two one'
c5 = C.new b2, 'two two'
c6 = C.new b2, 'two three'

# ... etc

结果对我来说似乎很脏(将大对象包含在其他大对象中)

#<C:0x000001011e9680 @b=#<B:0x000001011e9720 @a=#<A:0x000001011e9748 @title="test">, @level=1>, @name="one one">
#<C:0x000001011e9630 @b=#<B:0x000001011e9720 @a=#<A:0x000001011e9748 @title="test">, @level=1>, @name="one two">
#<C:0x000001011e95b8 @b=#<B:0x000001011e9720 @a=#<A:0x000001011e9748 @title="test">, @level=1>, @name="one three">
Thalesmello

关于面向对象的事情是,您封装数据,方法以及其他对象以创建抽象。更多的抽象可以使您更轻松地推理项目,但同时也增加了复杂性并使项目更加复杂。我特别发现很难在这两者之间取得平衡。只有多年的实践才能实现。

如果封装的三个级别看起来太多了,请尝试将依赖项看作是代码的味道

所有对象都代表有意义的,有用的抽象吗?例如:

  • B似乎正在使用A#title某物
  • B将A暴露给C使用
  • B公开level给C使用

在这里,B似乎只是在使用A并包含一个level属性,以便C可以使用它。这种抽象意味着有用吗?

如果C收到A对象,alevel和a ,我们可以简化问题name吗?

class A
  attr_reader :title # Do you really need outside code to change this?

  def initialize(title)
    @title = title
  end
end

class C
  attr_reader :level, :name

  def initialize(a, level, name)
    @a = a
    @level = level
    @name = name

    # Here, you access a.title to do whatever you did in B
  end

  def title
    @a.title
  end
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Ruby Mixin最佳实践

来自分类Dev

引用对象的最佳实践

来自分类Dev

Ruby on Rails DRY最佳实践

来自分类Dev

角度:对象结构最佳实践

来自分类Dev

PHP。创建对象的最佳实践

来自分类Dev

返回对象(PHP最佳实践)

来自分类Dev

iOS创建对象最佳实践

来自分类Dev

请求对象的方法的最佳实践

来自分类Dev

在Angular模板中包含脚本的最佳实践?

来自分类Dev

Ruby救援和最佳实践语法

来自分类Dev

Ruby on Rails中的跟踪活动最佳实践

来自分类Dev

在 Ruby 中链接比较的最佳实践

来自分类Dev

``对象历史''的Python继承最佳实践

来自分类Dev

从方法更改对象属性(最佳实践)

来自分类Dev

在多个容器中存储对象的最佳实践

来自分类Dev

在课堂上创建对象的最佳实践

来自分类Dev

Java最佳实践-返回对象与泛型

来自分类Dev

NSArray查找对象-最佳实践

来自分类Dev

最佳实践:在Android活动之间传递对象

来自分类Dev

生成响应对象的最佳实践

来自分类Dev

连接字符串对象的最佳实践

来自分类Dev

向JavaScript添加新对象的最佳实践

来自分类Dev

JavaScript-通过对象“过滤”-最佳实践?

来自分类Dev

Scala“更新”不可变对象最佳实践

来自分类Dev

在Java中返回对象的最佳实践

来自分类Dev

Java最佳实践-返回对象与泛型

来自分类Dev

Tensorflow 对象检测培训最佳实践题

来自分类Dev

在 Java 中实现对象列表的最佳实践

来自分类Dev

使用对象复制数组的最佳实践