Skip to content

Add lesson-9 comments#5

Open
psylone wants to merge 12 commits into
dronky:masterfrom
psylone:master
Open

Add lesson-9 comments#5
psylone wants to merge 12 commits into
dronky:masterfrom
psylone:master

Conversation

@psylone
Copy link
Copy Markdown

@psylone psylone commented Jun 24, 2017

No description provided.


class Test
extend Accessor
# почему здесь использется extend, если мы обращаемся к инстансам класса, а не к классу?
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Именно поэтому и используется. Суть в том что extend расширяет текущий объект методами модуля. При этом не имеет значения, обычный ли это объект, или сам объект класса. Наша цель добавить методы в объект класса, поэтому используем extend.

Можно расширить поведение одного конкретного объекта среди многих:

module Telepathy
  def read_thoughts
    p 'The brain is reading thoughts...'
  end
end

class Brain

  def think
    p 'The brain is thinking...'
  end
  
end

jane = Brain.new
john = Brain.new

jane.think
john.think

jane.extend(Telepathy)

jane.read_thoughts
john.read_thoughts # => NoMethodError


class_eval %Q{
def #{name}=(value)
@#{name}_history = [@#{name}] unless defined? @#{name}_history
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно здесь определить @#{name}_history = [] unless defined? @#{name}_history и тогда ниже проверку unless можно будет убрать.

define_method(name) {instance_variable_get(var_name)}
define_method("#{name}=".to_sym) do |value|
raise "Argument isn't #{type} type." unless value.instance_of?(type)
instance_variable_set(var_name, value) if value.instance_of?(type)
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если случится raise, до этого места интерпретатор не дойдёт, поэтому условие избыточно.

@@ -0,0 +1,12 @@
module Validation
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше определить отдельный каталог modules и в нём уже хранить файл validation.rb.

def validate(atr_name, valid_type, params = nil)
case valid_type
when :presence
define_method(:validate!) {raise "#{instance_variable_get("@#{atr_name}")} couldn't be nil" if instance_variable_get("@#{atr_name}").nil? || instance_variable_get("@#{atr_name}").empty?; true}
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут суть в том чтобы как раз в одном месте определить один раз метод конкретной валидации и затем вызывать его где нужно. У нас же сейчас получается своего рода билдер, который добавляет методы валидаций физически в каждый класс.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Также, будет много удобней определить отдельный метод валидаций один раз в этом модуле:

module Validation

  private

  def validate_presence
  end

  def validate_format
  end

end

@@ -0,0 +1,9 @@
module Valid
def valid?
if validate!
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если объект содержит ошибку то метод validate! выбросит исключение, а значит метод valid? не вернёт false. Вместо этого Ruby процесс прервёт своё выполнение с ошибкой.

@@ -0,0 +1,9 @@
module Valid
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Также идея модуля Validations в том чтобы всю логику, которая относится к валидациям собрать в этом модуле, включае метод класса validate и остальные инстанс-методы. Пожалуйста, перечитай ещё раз задание.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant