私は、深い名前空間 (>= 4 の深さ) と戦っていることに気づきました。それらが論理的に理にかなっている場合でも、それらが引き起こす煩わしさを避けるためです。
まず、コードがテキスト エディター ウィンドウにうまく収まるようにし、幅を広げすぎないようにします。Ruby の従来の 2 sp のインデントは間違いなく役に立ちますが、スコープ演算子を使用してネストされたインデントをすべて回避する必要があります。しかし一方で、スコープ演算子を使用すると、独自の問題が発生します...
まず、現在の名前空間コンテキストの上流のどこかで定数を使用するには、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 ステートメントをソース コード ファイルの先頭に保持する