Есть ли правило о том, чтобы не вводить числа в имена классов? - PullRequest
0 голосов
/ 23 января 2012

Я строю серию классов, которые наследуются от общего класса. Экземпляры классов создаются этим кодом ( поддерживает этого парня ):

def self.create(service, logger)
  classified_name = service.name.to_s.split('_').collect! { |w| w.capitalize }.join << "Processor"
  service_proc = Object.const_get(classified_name).new
  service_proc.logger = logger ||= Rails::logger

ОК, так что все работало нормально, пока я не наткнулся на службу , в имени которой стояла цифра . Это может показаться плохой идеей, но в этом случае Процессор назван в честь внешней службы, у которой в имени есть цифра. Я решил сохранить эту цифру, чтобы избежать путаницы. «HToB» не имеет значения, в то время как «H2B» фактически имеет значение в контексте моего приложения.

Ну вдруг метод создания умер:

NoMethodError: undefined method `logger=' for #<H2bProcessor:0xb737f20>

ОК, странно. Имейте в виду, что у меня есть 4 других класса, которые строятся с помощью того же метода фабрики. Logger является свойством базового класса. Так что я немного возиться с этим, а потом решаю, что цифра, вероятно, все испортила. Поэтому я пытаюсь загрузить файл с и без цифры в имени класса:

>> load("/mnt/hgfs/kodiak/lib/processors/H2b_processor.rb")
TypeError: superclass mismatch for class H2bProcessor
    from /mnt/hgfs/kodiak/lib/processors/H2b_processor.rb:1:in `<top (required)>'
[...]
[change the 2 in the name to "To"]
[...]
>> load("/mnt/hgfs/kodiak/lib/processors/H2b_processor.rb")
=> true

ОК, значит, проблема решена. Тем не менее, это действительно заставило меня задуматься: неужели наличие цифр в именах классов каким-то образом портит Ruby? Я немного погуглил, но не знал, что искать, такие вещи, как 'соглашение о присвоении имен, рубиновая цифра' не дал мне никаких результатов.

Ответы [ 4 ]

3 голосов
/ 23 января 2012

Вам не разрешено иметь цифры в начале, но в противном случае вы должны быть правы.

class H2O
end

H2O.new # Works fine

class 2Extreme
end

SyntaxError: compile error
(irb):5: trailing `E' in number
class 2Extreme
        ^
(irb):5: syntax error, unexpected tIDENTIFIER, expecting tCOLON2 or '[' or '.'
    from (irb):6
    from :0
1 голос
/ 23 января 2012
NoMethodError: undefined method `logger=' for #<H2bProcessor:0xb737f20>

Глядя на это сообщение, загрузка класса прошла успешно.Я думаю, что просто у него не было метода 'logger ='.

А для ошибки ниже, посмотрите на этот вопрос .Вы получаете ошибку, потому что уже есть класс H2bPrecessor.

>> load("/mnt/hgfs/kodiak/lib/processors/H2b_processor.rb")
TypeError: superclass mismatch for class H2bProcessor
0 голосов
/ 22 ноября 2015

Эта проблема не имеет ничего общего с цифрами.Вы неправильно используете заглавные буквы при создании имени класса.

Сведено на простейший кусок "h2b".capitalize => "H2b", а не "H2B".

Вам не нужен H2bProcessor, вам нужен H2BProcessor, поэтому вместо

"h2b".to_s.split('_').collect! { |w| w.capitalize }.join << "Processor" => "H2bProcessor"

use

"h2b".to_s.split(/_|(?<=\d)/).collect! { |w| w.capitalize }.join << "Processor" => "H2BProcessor"

Метод String#split принимает буквенную строку или регулярное выражение.Регулярное выражение разбивает строку на подчеркивание или после строки цифр.Каждый элемент этого массива ["h2", "b"] пишется с прописной буквы отдельно, ["H2", "B"], затем к массиву присоединяется строка "H2B" и, наконец, "Processor" помещается в конец строки.

0 голосов
/ 23 января 2012

Это не очень хорошая практика кодирования, чтобы начинать вводить числа.Мой любимый это Textbox1, Textbox2 и т. Д.Как правило, хорошее практическое правило - описывать ваш класс или помещать его в массив контейнеров, если у вас их несколько.Я признаю, что код генерируется, но я думаю, что это можно было бы сделать лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...