Определение классов внутри модуля

#ruby #oop

#ruby #ооп

Вопрос:

 module Vehicle
  class Car < Wheeled
  end
end

module Vehicle
  class Bike < Wheeled
  end
end
  

Чего пытается достичь этот шаблон создания классов, я не в состоянии понять. В чем будет недостаток выполнения этого путем включения Vehicle в качестве модуля в другие классы?

Ответ №1:

При выполнении этого таким образом эти классы сохраняются в пространстве имен в Vehicle модуле:

 Car.new
# => NameError: uninitialized constant Object::Car
Vehicle::Car.new
# => #<Vehicle::Car:0x0000123456>
  

Таким образом, у вас также может быть отдельный Car класс вне модуля, и Vehicle::Car класс не будет вмешиваться.

Комментарии:

1. Спасибо! Это способ, которым мы следуем, когда нам нужны два класса с одинаковыми именами. Я не обнаружил создаваемого нового класса с тем же именем, что заставило меня задуматься, была ли какая-либо другая причина. Пожалуйста, дайте мне знать, если вы можете придумать какую-то другую причину для этого.

2. Конкретный код, который вы используете, может не иметь конфликта, но предположим, что вы используете этот код в проекте, который использует другие сторонние библиотеки. Если бы вы не указали пространство имен для классов, и в одной из этих сторонних библиотек также случайно оказался Car класс, не входящий в определенное пространство имен, возникли бы проблемы.

Ответ №2:

Этот шаблон группирует связанные некоторым образом классы в отдельное пространство имен для достижения более логичной структуры приложения и избежания конфликтов именования. Суперкласс-подкласс сильно отличается, хотя в вашем конкретном примере было бы лучше пойти этим путем, потому что автомобиль и велосипед — это оба вида транспортных средств, но есть много ситуаций, когда это не так. Например, широко используется группирование всех классов приложений в одном модуле.