Следует ли вам использовать частные, защищенные и общедоступные модификаторы в Ruby?
Я родом из C#, но в свободное время изучаю Ruby.
Учитывая классы, можно сделать их методы private
, public
(по умолчанию) или protected
, Хотя я понимаю их использование, характерно ли для кода Ruby использование таких модификаторов, несмотря на то, что это динамический язык, на котором пользователь может легко переопределить доступ?
При использовании Send
разрешает пользователю доступ к приватным методам независимо от того, мне просто интересно, что лучше всего делать с Ruby и модификаторами доступа? Другими словами, я должен использовать их в своих классах?
3 ответа
Для заданных классов можно сделать их методы частными, общедоступными (по умолчанию) или защищенными. Хотя я понимаю их использование, характерно ли для кода Ruby использование таких модификаторов, несмотря на то, что это динамический язык, на котором пользователь может легко переопределить доступ?
Это все еще относительно распространено, потому что оно передает намерение и минимизирует интерфейс, который вы выставляете. Некоторые условности для соблюдения:
Просто опустите
public
, так как все методы общедоступны, если вы не говорите иначе, и методы обычно группируются по модификации доступа.Даже если пользователь может переопределить доступ, это не значит, что он должен это делать (почти так же, как вы не видите, чтобы разработчики на C# делали такие сумасшедшие вещи, как внедрение заглушек IL в классы, чтобы они могли получить доступ к закрытым методам). Таким образом, все еще полезно иметь различие.
Защищенные методы встречаются несколько реже, чем в C#, потому что Ruby на самом деле не поощряет наследование как средство передачи поведения. Общее поведение часто может быть преобразовано в
Module
а потомinclude/extend
по мере необходимости.Частные методы примерно так же распространены, как в C#; Ruby часто отдает предпочтение множеству крошечных методов, которые делают очень специфические вещи, которые вы затем создаете вместе, чтобы получить что-то полезное. Но вы не раскрываете эти методы, потому что они не являются частью вашего общедоступного интерфейса, и вы хотите сохранить их без помех.
Поскольку закрытые методы не считаются частью интерфейса, вы можете свободно изменять их безнаказанно. Сделав их конфиденциальными, вы заметите, что эти методы, их реализация или определения могут измениться в любое время.
Я всегда полагал, что речь идет о разоблачении интерфейса. Вы не хотите, чтобы ваши пользователи были перегружены вашей реализацией, поэтому вы делаете такие вещи приватными. Это добрее к ним. Например, когда вы имеете дело с массивами, вы действительно хотите иметь на своем пути еще 71 метод (который вас почти наверняка не волнует?)
RUBY_VERSION # => "1.8.7"
Array.new.public_methods.size # => 149
Array.new.private_methods.size # => 71
Другое важное значение приватных методов - это "подверженность изменениям". Когда вы фиксируете себя на интерфейсе, вы должны его поддерживать. Вы не можете нарушать код каждого, когда они загружают новую версию. Вещи, которые являются частными, понимаются как изменчивые. Они не выставлены, поэтому вы можете изменить их. Если пользователи создавали код, основанный на приватных методах, то это не ваша вина (если они этого не делают, потому что вы дали им интерфейс дерьма). Таким образом, вы можете сделать это приватным, чтобы дать себе возможность улучшить его в будущем.
Я бы по-прежнему использовал их в вашем коде, так как он передает ясное намерение читателю кода, а также дает вам необходимую защиту. Если другой разработчик собирается переопределить ваши методы или вызвать их напрямую через #send, они, скорее всего, либо имеют, либо вескую причину, либо, по крайней мере, понимают, почему они должны делать это именно так.
Использование Private/Protected в вашем коде делает вещи более явными для будущего разработчика, который собирается переопределить ваши методы, а также работает для вас должным образом, если никто не отменяет их