4

私は、深い名前空間 (>= 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 ステートメントをソース コード ファイルの先頭に保持する

4

1 に答える 1

0

あなたはあなたの質問であなた自身の質問に答えました:-)

コード内のスコープが長すぎるという問題を回避しようとしています。

スコープ階層のどこかにある定数を参照する場合は、技術的に何ができるかを見てください。

Rubyの力を使う

モジュールAと定数Bがある場合は、モジュールの名前空間を参照せずに、インクルードAを使用して定数Bにアクセスすることができます。

しかし、これはあなたが探しているものではないかもしれません-この場合、あなたはモジュールを含みますが、それはすでにそこで定義されているからです。

ルーツに目を向ける

名前空間A::B :: C :: Dの定数を参照する必要があるかどうかを確認してください。システムの設計が間違っている可能性がありますか?OOPの目標は通常、データとメソッドを可能な限り近づけることです。

2つの選択肢があります。

  1. においを感じる場合は、システムの設計を改善してください。
  2. エディターでどのように表示されるかに関係なく、長い参照を使用します。単純なマントラを繰り返します。「この長い参照は、そこにあり、このように見えるはずなので、ここにあります。」

そして、問題はなくなります。

Javaのようなパッケージベースの名前空間を使用する必要はありません。より便利で簡単な名前空間を選択するだけです。

于 2012-10-30T20:34:28.077 に答える