2009-07-15 3 views
3

Я рассматриваю возможность написания (большого) настольного приложения в Ruby (на самом деле игра, подумайте что-то вроде Angband или Nethack, используя Gtk + для GUI). Я исхожу из фона C# /. NET, так что я немного потерялся за то, как структурировать вещи.Как структурировать большое приложение Ruby?

В C# я создал бы много пространств имен, таких как Application.Core, Application.Gui и т. Д.). Части приложения, которые не нуждались в Gui, не ссылались бы на него с использованием инструкции. Из того, что я понимаю, в Ruby заявление require в основном делает текстовую вставку, которая позволяет избежать дублирования кода. То, что меня беспокоит, с помощью запросов require, каждый файл/класс будет иметь доступ ко всему остальному, поскольку упорядочение требуемых операторов.

Я прочитал некоторый код ruby, который использует модули как пространства имен. Как это работает и как это помогает?

Не уверен, что я получаю здесь ... Есть ли у кого-нибудь хорошие рекомендации о том, как структурировать большое приложение Ruby? Как насчет некоторых нетривиальных (и не-Rails) приложений, которые используют Ruby?

ответ

0

Некоторые из ваших проблем не относятся к Ruby, это касается круговых зависимостей. Является ли Core зависимым от Gui или зависит от Gui от Core? Или оба?

Хороший способ решения этой проблемы заключается в очень небольшом компоненте «бегун», который зависит от ядра, компонентов доступа к данным, gui и т. Д. И связывает их все вместе.

+0

Нет, это не так. У меня уже есть бегун, но в основном он требует кучу и создает графический интерфейс и запускает его. –

3

Ruby ничем не отличается от любого другого языка, когда дело доходит до структурирования вашего кода. Делайте то, что кажется правильным, и это, вероятно, сработает. Я не совсем уверен, какую проблему вы ожидаете. Вы беспокоитесь о столкновениях с именами?

Модули - это хороший способ получить псевдопространственные пространства имен, например.

module Core 
    class Blah 
    self.def method 
    end 
    end 
end 

Core::Blah.method 
+0

Конечно, это не сработает семантически, потому что «бла» должно быть постоянным, и вы получите доступ к нему следующим образом: Core :: Blah.method - если «метод» был методом класса. Тем не менее, +1 –

Смежные вопросы