Когда мы должны рассматривать использование частного или защищенного?

Просто интересно, когда мы должны использовать private или protected для некоторых методов в модели?

Иногда мне не мешает группировать мои методы в private и protected. Я просто оставлю это как есть. Но я знаю, что это плохая практика, иначе эти 2 группы не будут созданы в программировании.

Спасибо.

Ответ 1

  • Если вы планируете вызывать метод извне, record.method(), то "public"
  • Если он будет использоваться только внутри, self.method(), то "private"
  • Если вы планируете использовать его внутренне, но также и в потомках, self.method() # in subclass, затем "protected"

Ответ 2

Я дам свое мнение, и, может быть, я буду пинать его, но я не беспокоюсь о защищенном или приватном в Ruby. Реальность такова, что Ruby рассматривает вас как взрослого, если вы хотите запустить частный метод вне класса, вы можете (там способы). Вы можете запускать защищенные методы вне класса. Вы даже можете переназначить константы... вы можете делать все, что захотите, в основном.

И почему мне это нравится, это ваша ответственность. Я чувствую, что для обозначения чего-то защищенного или частного вы делаете две вещи:

  • Указывая, что вы не думаете, что потребитель будет нуждаться в нем.
  • Второе предположение, что кому-то еще нужно.

и, кроме того, вам сложно тестировать, так как это могут быть реальные методы тестирования боли (см. Каков наилучший способ unit test защищенных и частных методов в Ruby? для способов вокруг него)

По этим двум причинам я не беспокоюсь о них. Если вам действительно нужен какой-то барьер между вашими классами/методами и потребителями (будь то код или разработчики), тогда есть другие, более эффективные способы (прокси, обфускация, шифрование, защищенные паролем методы и т.д.). В противном случае, почему бы не дать им доступ к тем же инструментам, которые вы использовали?

Ответ 3

Я не знаю Ruby как специальный случай, но я предполагаю, что ответ будет таким же, как и для других языков, так вот вот:

Частный метод может быть доступен только членам одного класса, тогда как защищенный также доступен для членов классов, которые расширяют базовый класс, где объявлен метод.