Как улучшить метод класса lisibility / split "жирный" класс (внутри ruby class / rails model) - PullRequest
1 голос
/ 12 февраля 2020

как новый Rubyist, я сталкиваюсь с постоянной проблемой, когда речь заходит о структурировании моих моделей.

Когда метод слишком длинный:

  1. Я пытаюсь сделать рефакторинг с лучшим / более коротким синтаксисом
  2. Я пытаюсь разделить некоторые части на «под методы»

ПРОБЛЕМА: я не знаю, как правильно разделить метод + какой инструмент (частный метод, модули и т. д. c.)

Например:

Мне нужно запустить Foo.main_class_method

Моя модель выглядит так:

class Foo < Applicationrecord
  def self.main_class_method
    [...] # way too long method with nasty iterations
  end
end

Я пытаюсь разделить свой метод, чтобы улучшить восприимчивость. Это становится:

class Foo < Applicationrecord
  def self.main_class_method
    [...] # fewer code
    self.first_splitted_class_method
    self.second_splitted_class_method
  end

  private
  def self.first_splitted_class_method
    [...] # some code
  end

  def self.second_splitted_class_method
    [...] # some code
  end
end

Результат: это работает, но я упал, как будто это не правильный способ сделать это + У меня есть побочные эффекты

  • ожидается: splitted_methods недоступны, кроме как внутри main_class_method
  • получил: Я могу вызвать Foo.first_splitted_class_method, так как методы класса "игнорируют" Private. splitted_class_methods в Private не являются частными

Вопрос: Это приемлемый способ разделения main_class_method или это полное неправильное использование частного метода?

1 Ответ

0 голосов
/ 12 февраля 2020
  1. Использование частного метода для разделения вашего кода:

    • Возможно, но не реальное решение, если код принадлежит другому месту
    • Это скорее о "это принадлежит здесь?" чем "это выглядит лучше?"
  2. Исправить метод "не частного" частного класса ( оригинальный пост ):

    • используйте private_class_method :your_method_name после того, как вы его определили
    • или прямо перед
private_class_method def your_method_name
  [...] # your code
end
Если вы разбили метод класса / экземпляра:
  • метод splitted_method должен быть того же типа (класса / экземпляра), что и метод main_class_method, вызывающий его
  • В main_method Вы можете вызвать метод splitted_method с использованием синтаксиса self.method или без него
class Foo < Applicationrecord
  def self.main_class_method
    # Here, self == Foo class
    # first_splitted_class == class method, I can call self.first_splitted_class_method 
    self.first_splitted_class_method
    # I can also call directly without self because self is implicit
    second_splitted_class_method
  end

  def self.first_splitted_class_method
  end

  def self.second_splitted_class_method
  end

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