MyTetra Share
Делитесь знаниями!
Что такое релейшен и скоуп (Relation и Scopes) применительно к объектам данных
Время создания: 03.10.2014 20:37
Автор: Xintrea
Текстовые метки: Relation, Scopes, релейшн, скоуп
Раздел: Компьютер - Программирование - Теория программирования
Запись: xintrea/mytetra_syncro/master/base/1412354274rfwldpgknv/text.html на raw.github.com

Note: я пока еще сам толком не разобрался, что такое Scope и Relation. Здесь собираю информацию, которую удалось накопасть в сети.

В теории программирования есть две взаимо-противовположные вещи. Обычно термины Релейшен и Скоуп применяются тогда, когда речь идет о моделях данных в парадигме MVC.

Релейшен

Это когда у известного объекта запрашиваются связанные с ним данные.

Например:

$posts = $user->posts;

Здесь нам известен объект $user, и происходит запрос всех комментариев данного пользователя.

Скоуп

Часто возникает ситуация, когда стоит задача вытащить данные "в обратку".

Например, у нас есть объект списка комментариев Post::model()и нам нужно получить список комментариев для известного пользователя. Тогда скоуп будет выглядеть так:

$posts = Post::model()->forUser($user)->findAll();

Вообще, понятие Scoupe очень многогранное. Например вот еще одно объяснение (уже не касаясь парадигмы MVC):

Скоп, это некая структура данных, вроде хеш-таблицы, где имена переменных связаны с их значениями. В простейшем случае мы имеем один скоп - глобальный. Например, ты связал с именем а значение 1. Далее оперделил функцию, которая использует эту а. При вызове этой функции твой интерпретатор ищет данное имя в твоем скопе, находит, и «вычисляет», т.е. выдает связанное с ним значение.

В реальных современных языках программирования как правило имеется более чем один скоп. Например в языках с поддержкой замыканий свой собственный скоп создается для каждого замыкания, создается неявно, самим интерпретатором. Это лексический скоп. При вызове функции, созданной в замыкании, все имена использованные в теле функции интерпретатор будет искать в первую очередь в этом локальном скопе, в контексте которого была создана данная функция. Аналогично обстоят дела с поддержкой локальных блоков.

Существует также понятие динамического скопа. В этом случае, функция при вызове ищет имена своих свободных переменных, т.е. имен использованных в ее теле в скопе того блока кода, в котором вызывается, т.е она не «запоминает» контекст, в котором создавалась. Это называется динамическое связывание. Однако, динамическое связывание сейчас не модно и мало где используется. Из современных немаргинальных языков - только CL(наряду с лексическим), Emacs-lisp, Perl.

Но понятие лексический/динамический скоп - это не совсем корректное определение. Скоп он и есть скоп - т.е. таблица ключ - значение. Правильней все таки говорить о связывании - т.е. из какого конкретно скопа функция при вызове тащит свои внутренние имена.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования