User Guide #15 - Ruby - контроль доступа

access control, Ruby, ruby lesson, ruby уроки, user guide, контроль доступа, руководство пользователя

Недавно, мы говорили, что Ruby не имеет функций, только методы. Однако имеется более, чем один вид методов. В этой главе мы ознакомимся с контролем доступа.

Рассмотрим, что происходит, когда мы определяем метод на верхнем уровне, не внутри определения класса. Мы можем подумать, что этот метод будет аналогичен функции в более традиционном языке, таком как C.

ruby> def square(n)
    |   n * n
    | end
   nil
ruby> square(5)
   25

Наш новый метод, как кажется, не принадлежит никакому класса, но фактически руби даёт ему класс Object , который является суперклассом для каждого другого класса. В результате, любой объект сможет использовать этот метод. Это справедливо , но имеется небольшая загвоздка: это приватный метод каждого класса. Мы обсудим что это означает ниже, но одним из следствий этого является то, что он может быть вызван только в стиле функции, как здесь:

ruby> class Foo
    |   def fourth_power_of(x)
    |     square(x) * square(x)
    |   end
    | end
  nil
ruby> Foo.new.fourth_power_of 10
  10000

Нам не позволяется выполнять данный метод как метод объекта:

ruby> "fish".square(5)
ERR: (eval):1: private method `square' called for "fish":String

Это сохраняет Объектно-ориентированную природу Ruby более чистой (функции всё ещё являются методами объекта, но приёмником неявно является self ) в то время как функции могут быть написаны как в традиционном языке.

Традиционным подходом в объектно-ориентированном программировании, о котором мы намекали в недавних главах, имеется разделение на спецификацию и имплементацию, или какие задачи объекта предполагается выполнять и как они на самом деле выполняются. Внутренняя работа объекта должна сохраняться, как правило, скрытой от пользователей. Они должны заботиться только о том, какие данные выходят и выходят в объект, и верить тому, что объекта знает, что делать с данными внутри себя. Таким образом, часто бывает полезным для классов иметь методы, которые не видны внешнему миру, но которые используются в внутри (и могут быть улучшены программистом, когда он пожелает, без изменения видения пользователями объекта снаружи. В обычном примере, что следует далее, думаем об engine как о невидимом внутреннем работнике класса.

ruby> class Test
    |   def times_two(a)
    |     print a," times two is ",engine(a),"\n"
    |   end
    |   def engine(b)
    |     b*2
    |   end
    |   private:engine  # this hides engine from users
    | end
   Test
ruby> test = Test.new
   #<Test:0x4017181c>
ruby> test.engine(6)
ERR: (eval):1: private method `engine' called for #<Test:0x4017181c>
ruby> test.times_two(6)
6 times two is 12.
   nil

Мы могли бы ожидать выполнения test.engine(6) для возврата значения 12, но вместо этого мы видим, что engine недоступен, когда пользователь применяет его к экземпляру класса Test . Только другим методам класса Test , таким как times_two , позволяется использовать engien . Нам требуется использовать публичный интерфейс, который содержится в методе times_two. Программист, который отвечает за этот класс, может изменить engine (здесь, возможно изменение с b*2 на b+b для улучшения производительности) не затрагивая того, как пользователь взаимодействует с объектами Test. Этот пример, конечно, очень простой, чтобы быть полезным; преимущества контроля доступа становятся более ясны только тогда, когда мы начинаем создавать более сложные и интересные классы.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

a
25 февраля 2020 г. 5:40
ayb

C++ - Тест 005. Структуры и Классы

  • Результат:83баллов,
  • Очки рейтинга4
ДЗ
24 февраля 2020 г. 14:47
Дмитрий Злобин

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:40баллов,
  • Очки рейтинга-8
p
17 февраля 2020 г. 14:41
pstMem

C++ - Тест 003. Условия и циклы

  • Результат:85баллов,
  • Очки рейтинга6
Последние комментарии
24 февраля 2020 г. 3:54
Евгений Легоцкой

Добрый день. Там будет url, на который указывает ссылка тега a в пагинаторе, если правильно помню )) Написал этот код и забыл.
B
24 февраля 2020 г. 0:37
BahaMeirman

Евгений Здравствуйте! Не могу понять вот эту часть кода: url: jQuery(this).attr('action') наверное здесь должен быть путь к url, тогда 'action' на какой url указывает?
17 февраля 2020 г. 3:22
Евгений Легоцкой

Добрый день. Это кастомный тег, помещается в файл, который находится в каталоге templatetags myapp/ templatetags/ myapp.py
B
16 февраля 2020 г. 13:36
BahaMeirman

Добрый вечер! Монжно по подробней о теге get_companion? ссылка не работает.
Сейчас обсуждают на форуме
a
25 февраля 2020 г. 8:06
ayb

Да
24 февраля 2020 г. 12:04
Евгений Легоцкой

Добрый день. Вот пример с дружественного ресурса с движением камеры
24 февраля 2020 г. 6:29
Евгений Легоцкой

Qt не предоставляет функционала по запросу root прав во время выполнения программы. Поэтому нужно использовать платформозависимый функционал, для Linux это будет выглядеть так: #include…
24 февраля 2020 г. 3:47
Евгений Легоцкой

Добрый день. Что означает клиентская область? Это изображение? Вам нужно распознавать символы текста или всё-таки пользователь будет вводить текст с клавиатуры, просто в любом месте "абстр…
VZ
21 февраля 2020 г. 5:19
Vladimir Zhitkovsky

void sendImage(int sessid, int type, int dest, int format, QString imgBase64Data){ QNetworkRequest request; request.setUrl(QUrl(ipAddress + "ctlapi/cmd=preparereportimg&sessid=…
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB