2011-12-11 10 views
4

私はRubyで(Railsではなく)ゲームを自分自身にもっと良く教える方法として書こうとしています。 (意味は、私はこれを正しくやりたいのですが、ルビーにはうまくいかないものを靴ひねりにしようとすると、言語を切り替えるでしょう。)私は、必要な注文に問題があります。次のことを行うきれいな方法があるのだろうかと疑問に思います。Rails以外のRubyアプリケーションですべてのファイルを要求するクリーンな方法はありますか?

がここにこれまでのところ、私の構造です:

game 
    Gemfile 
    src 
    models 
     character.rb 
     game_object.rb 
    init.rb 

の代わりに個別のファイルを一覧表示、init.rbは、このようなファイルが必要です。

Dir['./src/**/*.rb'].each do |app| 
    require app 
    end 

game_object.rbは、これまでのところ、非常に簡単ですしかしcharacter.rbは次のようになります。

module Game 
    class Character < Game::GameObject 
    attr_accessor :name 

    def initialize(name) 
     @name = name 
     end 
    end 
end 

を残念ながら、私はそれを行うならば、私は「初期化解除を取得しますd constant Game :: GameObject(NameError) "、他のファイルの前にgame_objectが明示的に必要な場合を除きます。

私がここにいくつかのオプションを持っているように私には思える:

  1. 負荷game_object(および他のsuperclassees)init.rbで他人の前に。
  2. character.rbにgame_objectが必要ですが、使用するパスによってはファイルを複数回読み込む可能性があるため、問題があるようです。
  3. 各ファイルを個別に読み込んで完全に手動で管理するので、完全に制御できます。

これらはすべて、はるかに複雑であるようです。よりクリーンな方法がありますか?

答えて

5

ただそれをそこに置く:より多くのコードは「汚れた」という意味ではなく、少ないコードほど「きれい」を意味しない。

手動でファイルを要求すると、負荷の問題が解決され、実際には望んでいないファイルが必要になることを防ぐことができます。さらに、後であなたのコードを見ている人は、あなたのアプリに読み込まれているもののきれいで明瞭なマニフェストを持っています。

私の提案は:

  1. srcフォルダをドロップし、それは冗長あなたのRubyのアプリですすべてソースです。
  2. フォルダに自分の名前空間の地図
  3. 使用明示的には、あなたが#2を使用する場合、これが容易になる(必要になります。

例:

game/ 
    bin/ 
    gamerunner 
    Gemfile 
    lib/ 
    game.rb 
    game/ 
     game_object.rb 
    models/ 
    character.rb 
    spec/ 
    spec_helper.rb 
    models/ 
     character_spec.rb 

あなたは、仕様/テストをされていません書いています?

require 'game/game_object.rb' 
# require the rest of your library as you build it 

module Game 
end 

そして、あなたのinitに:次に

lib/game.rb

require 'game' 
require 'models/character.rb' 

多くのクリーナー、はるかに簡単後でから抽出すると、あなたの問題を解決する必要があります。

+1

srcディレクトリを持つことは、libディレクトリを持つことと同じくらい冗長であり、ライブラリを作成していないときには意味があります。 –

+0

ここでコンセンサスに行くと、これまで私のために働いています。ありがとう! – Jon

0

私はこれまでにやったことはありませんが、独自のオートローディングロジックをModule#const_missingに追加することができます。

class Module 
    def const_missing_with_autoload(c) 
    components = [] 
    (self.to_s.split("::") + c.to_s.split("::")).reverse.each do |comp| 
     components.unshift(comp.gsub(/([a-z])([A-Z])/, "\\1_\\2").downcase) 
     begin 
     require File.join(*components) 
     return const_get(c) 
     rescue LoadError 
     end 
    end 
    const_missing_without_autoload(c) 
    end 

    alias_method :const_missing_without_autoload, :const_missing 
    alias_method :const_missing, :const_missing_with_autoload 
end 

私は、これは、メソッドスウィズリングなしで動作します想定したが、私はその作業を得ることができませんでした。誰かが私がやろうとしていることを達成するきれいなソリューションを投稿するのが大好きです。 FWIWでは、あなたのプロジェクトにActiveSupportを追加するだけで、おそらく役に立つはずです。

関連する問題