Я прочитал blog post, который рекомендует использовать имена ваших патчей для обезьян, чтобы их можно было легко просмотреть и включить.Организация патчей обезьян
Например:
module CoreExtensions
module DateTime
module BusinessDays
def weekday?
!sunday? && !saturday?
end
end
end
end
идти ли в: файл lib/core_extensions/class_name/group.rb
.
Он может быть включен в класс DateTime с помощью метода Module#include
экземпляра (который класс наследуется, поскольку Class
является Module
)
# Actually monkey-patch DateTime
DateTime.include CoreExtensions::DateTime::BusinessDays
Мой вопрос куда включаемые заявления идут? Есть ли конвенция?
Например:
У меня есть следующие обезьяны патчи:
# http://www.justinweiss.com/articles/3-ways-to-monkey-patch-without-making-a-mess/
module CoreExtensions
module String
module Cases
def snakecase
return self if self !~ /[A-Z]+.*/
# http://rubular.com/r/afGWPWLRBB
underscored = gsub(/(.)([A-Z])/, '\1_\2')
underscored.downcase
end
def camelcase
return self if self !~ /_/ && self =~ /[A-Z]+.*/
split('_').map{ |e| e.capitalize }.join
end
end
end
end
, которые живут внутри файла lib/core_extensions/string/cases.rb
.
Куда я должен положить заявление String.include CoreExtensions::String::Cases
?
Также, чтобы быть понятным, это всего лишь рубиновый проект, разве это имеет значение?
Я попытался положить его в lib/devify.rb
require 'devify/version'
require 'devify/some_dir'
require 'devify/scaffold'
require 'devify/tree_cloner'
require 'devify/renderer'
require 'devify/project'
require 'devify/tasks/some_task'
require 'devify/tasks/bootstrap'
require 'core_extensions/string/cases'
module Devify
String.include CoreExtensions::String::Cases
end
Это работает, и это имеет смысл, почему это работает. Это потому, что все мое приложение живет внутри модуля или пространства имен Devify
.
Этот способ также хорош, потому что я не загрязняю глобальное пространство имен правильно? Потому что я всего лишь обезьяна, исправляющая String
s, которые живут внутри Devify
?
Просто не уверен, что это правильный путь.
если вы пишете 'String.include' в любом месте, где вы _are_ загрязняете глобальное пространство имен. Вы можете задержать его, поместив этот вызов в метод. Но как только будет вызван метод, все строки будут исправлены. Прочитайте уточнения как менее навязчивую альтернативу. Я добавил несколько примеров [здесь] (http://stackoverflow.com/documentation/ruby/6563/refinements#t=201701060134259018086). –
Кстати, это соглашение об именах файлов является хорошей практикой для программирования Ruby в целом. Он может помочь в автозагрузке зависимостей - например, если вы используете шаблон, вы можете сказать 'Dir.glob (" ./**/*. Rb "). Sort_by {| path | path.count ("/")} .each {| path | require path} ', который будет загружать все файлы, упорядоченные по счету'/'в их имени файла (в соответствии с вашей иерархией констант) –