ruby - 对于 ruby​​ 中的深度命名空间,如何最好地管理编码风格和作用域运算符的烦恼?

标签 ruby coding-style namespaces scope

<分区>

我发现自己与深层命名空间(>= 深度为 4)作斗争,即使它们在逻辑上是有意义的,以避免它们引起的一些烦恼。

首先,我希望我的代码能够很好地适应文本编辑器窗口,而不必太宽。尽管 2 sp 的 ruby​​ 常规缩进肯定有帮助,但这促使我使用范围运算符来避免所有嵌套缩进。但另一方面,使用范围运算符会带来一系列问题......

首先,要在当前命名空间上下文的上游某处使用常量,您必须使用该常量的完整命名空间,以便 Ruby 找到它。而且由于当我使用范围运算符时,命名空间深度很深,因此引用常量和类会变得很长。

require 'a/b'
class A::B::C
  FOO = 'hi'
end
class A::B::C::D
  # FOO # can't do this. raises NameError: uninitialized constant; would work fine if classes used nested format, but then the extra indent makes for wide code.
  A::B::C::FOO # must use full reference when using scopes, ugh. Depending on the real names of A,B,C, this could be rather long as well.
end

其次,我遇到了一种情况,我必须在我的类定义之后要求文件,我不想这样做(我喜欢顶部的要求语句),就像这样。

# File: a/b/c.rb
require 'a/b'
# require 'a/b/c/d' # can't put it here, otherwise you get uninitialize const A::B::C when a/b/c/d.rb is getting interpreted.
class A::B::C
  def initialize
    @d = A::B::C::D.new 
  end
end
require 'a/b/c/d' # it bothers me putting requires anywhere but at the top

# File: a/b/c/d.rb
require 'a/b/c'
class A::B::C::D
end

必须付出一些东西。也许我只是需要让步并扩大我的编辑器并坚持使用嵌套,或者我可能不了解如何最好地使用范围运算符在命名空间的上下文中工作。

有没有人对我应该如何处理管理这些问题的深度命名空间有任何建议? 1. 通过最小化缩进来降低代码宽度 2. 当在当前上下文的上游定义常量时,能够仅使用常量名称 (FOO) 来引用常量 3. 将所有的require语句放在源代码文件的顶部

最佳答案

你自己在你的问题中回答了你的问题:-)

您试图避免代码中作用域过长的问题。

简单地看一下——如果你引用一个在你的作用域层次结构深处的常量——你可以在技术上做什么:

使用 Ruby 的强大功能

如果您有一个模块 A 和其中的常量 B,您可以尝试使用 include A 并在不引用模块命名空间的情况下访问常量 B。

但这可能不是您要找的 - 因为在这种情况下您将包含该模块,但它已经在那里定义了。

追根溯源

看看你是否必须引用命名空间 A::B::C::D 中的常量,你的系统设计可能有误吗? OOP 的目标通常是使数据和方法尽可能接近。

你有两个选择:

  1. 如果您闻到气味,请改进您的系统设计。
  2. 使用长引用,无论它们在您的编辑器中如何出现 - 只需重复简单的咒语:“我在这里有这么长的引用,因为它应该在那里并且看起来像这样。”

问题就迎刃而解了。

您不必使用类似于 Java 的基于包的命名空间。您可以选择一个更方便、更简单的 namespace 。

关于ruby - 对于 ruby​​ 中的深度命名空间,如何最好地管理编码风格和作用域运算符的烦恼?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13146910/

相关文章:

javascript - 什么是 xml dom 命名空间以及为什么某些 DOM 方法末尾有 NS?

ruby-on-rails - 仅针对新记录进行验证

ruby-on-rails - 如何正确使用 stub 在rspec中进行测试

iphone - 如何使用 3D 阴影边框设计 UITextView 的样式?

PHP项目组织

没有项目名称的 VB.NET 导入

sql - 如何解决选择框中的 N + 1 问题?

ruby - 如何在不先保存文本文件并用它提供 CSV 的情况下在 Ruby 中获取 FTP 记录

PHP codeniffer (phpcs) - 作为 svn 预提交 Hook 的一部分使用时如何允许覆盖?

c++ - gcc 无法编译命名空间中的静态函数