Перейти к содержимому

Интроспекция и рефлексия в чем разница

  • автор:

Основные принципы программирования: интроспекция и рефлексия

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

Часто во время работы программы нам бывает нужна информация о данных — например, какой у них тип или являются ли они экземпляром класса (в ООП). Опираясь на эти знания, нам нужно проводить над данными некоторые операции, или даже изменять их — но необходимого вида данных у нас может и не быть! Если вы ничего не поняли, не расстраивайтесь — мы подробно во всём разберёмся. Всё, что я здесь описал — это иллюстрация целей двух возможностей, присутствующих почти в каждом современном языке программирования: интроспекции и рефлексии.

Интроспекция

Интроспекция — это способность программы исследовать тип или свойства объекта во время работы программы. Как мы уже упоминали, вы можете поинтересоваться, каков тип объекта, является ли он экземпляром класса. Некоторые языки даже позволяют узнать иерархию наследования объекта. Возможность интроспекции есть в таких языках, как Ruby, Java, PHP, Python, C++ и других. В целом, инстроспекция — это очень простое и очень мощное явление. Вот несколько примеров использования инстроспекции:

// Java if(obj instanceof Person)
//PHP if ($obj instanceof Person) < // делаем что угодно > 

В Python самой распространённой формой интроспекции является использование метода dir для вывода списка атрибутов объекта:

# Python class foo(object): def __init__(self, val): self.x = val def bar(self): return self.x . dir(foo(5)) => ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'bar', 'x'] 

В Ruby интроспекция очень полезна — в частности из-за того, как устроен сам язык. В нём всё является объектами — даже класс — и это приводит к интересным возможностям в плане наследования и рефлексии (об этом ниже). Если вы хотите узнать об этом больше, советую прочитать мини-цикл Metaprogramming in Ruby.

Прим. перев. Также не будет лишним прочитать нашу статью, посвящённую интроспекции в Ruby.

Вот несколько простых примеров интроспекции с использованием IRB (Interactive Ruby Shell):

# Ruby $ irb irb(main):001:0> A=Class.new => A irb(main):002:0> B=Class.new A => B irb(main):003:0> a=A.new => # irb(main):004:0> b=B.new => # irb(main):005:0> a.instance_of? A => true irb(main):006:0> b.instance_of? A => false irb(main):007:0> b.kind_of? A => true 

Вы также можете узнать у объекта, экземпляром какого класса он является, и даже “сравнить” классы.

# Ruby irb(main):008:0> A.instance_of? Class => true irb(main):009:0> a.class => A irb(main):010:0> a.class.class => Class irb(main):011:0> A > B => true irb(main):012:0> B true 

Однако интроспекция — это не рефлексия; рефлексия позволяет нам использовать ключевые принципы интроспекции и делать действительно мощные вещи с нашим кодом.

Рефлексия

Интроспекция позволяет вам изучать атрибуты объекта во время выполнения программы, а рефлексия — манипулировать ими. Рефлексия — это способность компьютерной программы изучать и модифицировать свою структуру и поведение (значения, мета-данные, свойства и функции) во время выполнения. Простым языком: она позволяет вам вызывать методы объектов, создавать новые объекты, модифицировать их, даже не зная имён интерфейсов, полей, методов во время компиляции. Из-за такой природы рефлексии её труднее реализовать в статически типизированных языках, поскольку ошибки типизации возникают во время компиляции, а не исполнения программы (подробнее об этом здесь). Тем не менее, она возможна, ведь такие языки, как Java, C# и другие допускают использование как интроспекции, так и рефлексии (но не C++, он позволяет использовать лишь интроспекцию).

По той же причине рефлексию проще реализовать в интерпретируемых языках, поскольку когда функции, объекты и другие структуры данных создаются и вызываются во время работы программы, используется какая-то система распределения памяти. Интерпретируемые языки обычно предоставляют такую систему по умолчанию, а для компилируемых понадобится дополнительный компилятор и интерпретатор, который следит за корректностью рефлексии.

Мне кажется, что мы сказали много об определении рефлексии, но смысла это пока несёт мало. Давайте взглянем на примеры кода ниже (с рефлексией и без), каждый из которых создаёт объект класса Foo и вызывает метод hello.

// ECMAScript - как JavaScript // Без рефлексии new Foo().hello() // С рефлексией // предполагаем, что Foo принадлежит this new this['Foo']()['hello']() // или не предполагаем new (eval('Foo'))()['hello']() // или вообще не заморачиваемся eval('new Foo().hello()') 
// Java // Без рефлексии Foo foo = new Foo(); foo.hello(); // С рефлексией Object foo = Class.forName("complete.classpath.and.Foo").newInstance(); // Альтернатива: Object foo = Foo.class.newInstance(); Method m = foo.getClass().getDeclaredMethod("hello", new Class[0]); m.invoke(foo); 
# Python # Без рефлексии obj = Foo() obj.hello() # С рефлексией class_name = "Foo" method = "hello" obj = globals()[class_name]() getattr(obj, method)() # С eval eval("Foo().hello()") 
# Ruby # Без рефлексии obj = Foo.new obj.hello # С рефлексией class_name = "Foo" method = :hello obj = Kernel.const_get(class_name).new obj.send method # С eval eval "Foo.new.hello" 

Этот список отнюдь не исчерпывает возможности рефлексии. Это очень мощный принцип, который к тому же является обычной практикой в метапрограммировании. Тем не менее, при использовании рефлексии нужно быть очень внимательным. Хотя у неё и есть свои преимущества, код, использующий рефлексию, значительно менее читаем, он затрудняет отладку, а также открывает двери по-настоящему плохим вещами, например, инъекции кода через выражения eval.

Eval-выражения

Некоторые рефлективные языки предоставляют возможность использования eval-выражений — выражений, которые распознают значение (обычно строку) как выражение. Такие утверждения — это самый мощный принцип рефлексии и даже метапрограммирования, но также и самый опасный, поскольку они представляют собой угрозу безопасности.

Рассмотрим следующий пример кода на Python, который принимает данные из стороннего источника в Сети (это одна из причин, по которой люди пользуются eval-выражениями):

session['authenticated'] = False data = get_data() foo = eval(data) 

Защита программы будет нарушена, если кто-то передаст в метод get_data() такую строку:

"session.update(authenticated=True)" 

Для безопасного использования eval-утверждений нужно сильно ограничивать формат входных данных — и обычно это лишь занимает лишнее время.

Заключение

Интроспекция и рефлексия — это очень мощные инструменты современных языков, и их понимание может позволить вам писать по-настоящему крутой код. Ещё раз отметим: интроспекция — это изучение атрибутов объекта, а рефлексия — это манипуляция ими. Будьте внимательны при использовании рефлексии, поскольку она может сделать ваш код нечитаемым и уязвимым. Чем больше сила, тем больше и ответственность — вот девиз всего, что связано с метапрограммированием.

Чем рефлексия отличается от интроспекции?

И еще хотелось бы узнать, в каких языках развита та или другая фича, или все вместе.

foo
07.06.14 06:52:38 MSK

У других школьнегов спроси, здешние не в курсах. Тут жабу и плюсы уважают.

anonymous
( 07.06.14 07:01:55 MSK )
Ответ на: комментарий от anonymous 07.06.14 07:01:55 MSK

А где те школьники, которые в курсе?

foo
( 07.06.14 07:03:53 MSK ) автор топика
Ответ на: комментарий от foo 07.06.14 07:03:53 MSK

На лямбда зе ультимейт, видимо.

anonymous
( 07.06.14 07:07:45 MSK )

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

Языки — это большинство интерпретируемых, например, javascript, tcl, интерпретируемые лиспы, sh. Они все рефлексивны, но какие конкретно лучше поддерживают, не знаю. Какие-то там костыли и в жабе есть.

anonymous
( 07.06.14 07:58:01 MSK )
Ответ на: комментарий от anonymous 07.06.14 07:58:01 MSK

А, ну да, smalltalk, self, io, традиционно славятся.

anonymous
( 07.06.14 08:00:11 MSK )

jesus_superstar
( 07.06.14 08:00:53 MSK )
Ответ на: комментарий от jesus_superstar 07.06.14 08:00:53 MSK

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

foo
( 07.06.14 08:03:08 MSK ) автор топика

В информатике отражение или рефлексия (синоним интроспекция, англ. reflection) означает процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения.

В психологии, btw, это тоже почти синонимы. Рефлексия — это принципиальная возможность самоанализа, а интроспекция — это самоанализ как активный метод.

E ★★★
( 07.06.14 09:22:56 MSK )
Ответ на: комментарий от E 07.06.14 09:22:56 MSK

Между прочим, в английском слово introspection никто не отменял. Чушь в твоей википедии, как всегда.

avtoritetniy-expert
( 07.06.14 09:32:12 MSK )
Ответ на: комментарий от avtoritetniy-expert 07.06.14 09:32:12 MSK

В русском слово «интроспекция» тоже существует и даже (сюрприз-сюрприз!) имеет значение и статью на рукипедии. Что сказать-то хотел?

В чём отличие интроспекции от рефлексии?

Рефлексия — это просто думание о себе и своей психике, эмоциях, и т. д. А интроспекция — это уже более углубленные практики для самопознания (медитация, например) . Imho.

Остальные ответы

Рефлексия — взгляд на себя дилетанта, а интроспекция — наблюдение как профессионала) ) В принципе, оба термина равнозначны. . Можно, порой, так дорефлексироваться, что интроспекции мало не покажется)

рефлексия- «а вдруг они подумают что я плохой? »
интроспекция — «ну почему я стал таким плохим, что мне теперь делать? «

Забодали, честно говоря.. .
Уж в который раз требуют ответа на этот вопрос.. .
Как милиционеры (((((((((

~Екатерина~Просветленный (45507) 13 лет назад
Ни разу не видела этот вопрос. Может потому что нет ответов на него?))))

Kira Petrova Просветленный (29259) Есть и сходные вопросы, есть и ответы. Просто здесь искать не очень легко. Увы.

Интроспекция (от лат. introspecto — смотрю внутрь) — метод психологического исследования, который заключается в наблюдении собственных психических процессов без использования каких-либо инструментов или эталонов.
Интроспекция — метод углубленного исследования и познания человеком моментов собственной активности: отдельных мыслей, образов, чувств, переживаний, актов мышления как деятельности разума, структурирующего сознание, и т. п. Метод, основанный В. Вундтом, используется в структурализме.

Рефле́ксия (от позднелат. reflexio — обращение назад) — обращение субъекта на себя самого, на свое знание или на свое собственное состояние.

это было из википедии.
на мой взгляд, разницы тут нет никакой, кроме того, что термин Интроспекция введён в психологию как науку — как метод психологического самоисследования, самоанализа, то есть Рефлексии [собственного] психического состояния.

Интроспекция в психологии — плюсы и минусы метода

интроспекция

Рождение метода исследования поступков и психоэмоционального фона человека во время их совершения относится к XVII веку. У его истоков стояли такие знаменитые философы Р. Декарт, Д. Локк и другие, пытавшиеся понять возможности человека, который самостоятельно анализирует свои поступки и внутренние ощущения, связанные с ними.

Что такое интроспекция?

Хотя это и непонятный термин, используемый в психологии и означающий «смотреть внутрь», интроспекция знакома большинству из нас. Не найдется человека, кто не пытался бы понять свои действия в той или иной ситуации, анализируя ее последствия. И мало кто подозревает, что в этот момент он погружается в состояние, которое попросту считается способностью к самоанализу.

Таким образом, интроспекция – это один из методов глубокого самопознания, когда самостоятельно можно анализировать:

  • поступки;
  • эмоции;
  • мысли;
  • чувства;
  • намерения, формирующиеся в мозгу.

Интроспекция в психологии

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

что такое интроспекция

Интроспекция — плюсы и минусы

Метод интроспекции в психологии, как и любой метод исследования, может таить в себе положительные и отрицательные стороны, потому что психологический портрет каждого – уникален, и выдать рекомендации, подходящие абсолютно всем, невозможно. Тем не менее, метод интроспекции, используемый для наблюдения за состоянием человека, выявил более характерные его черты. Среди положительных отмечаются:

  • знание своих привычек, достоинств и недостатков;
  • возможность самосовершенствования;
  • «закрытость» от постороннего наблюдения всего, что происходит с человеком.

Что касается отрицательных сторон метода, то исследователи называют здесь только одну: необъективное отношение к себе самому в широчайшем диапазоне. Оно простирается от оценки: «Все прощаю себе, любимому», до: «Во всем виноват только я, потому что я – плохой (неудачник, эгоист и т.д.)». Отдавая должное внутренним оценкам, являющимся ценными для самого индивида, специалисты не считают их научными.

Интроспекция и самонаблюдение

Между методом интроспекции и самонаблюдением иногда ставят знак равенства, подразумевая, что аспекты изучения для них одинаковы: внутренняя эмоциональная реакция на различные события, где оценку дает испытуемый, которого принято называть «наивным наблюдателем». Но специалисты полагают, что интроспекция и самонаблюдение имеют существенные различия:

  • самонаблюдение – это способ получения информации об эмоциональном и психическом состоянии индивида от него самого;
  • интроспекция — использование данных, полученных в результате самонаблюдений.

Рефлексия и интроспекция — отличия Интересно взаимодействие интроспекции и рефлексии как двух методов, расширяющих горизонты исследований эмоционально психического состояния индивида. Большинство специалистов сходятся на том, что важны оба: интроспекция и рефлексия; различия в том, что первая «отвечает» за душу, анализируя ее реакцию на совершаемые действия, а вторая – за тело, давая информацию о его поступках.

метод интроспекции

Виды интроспекции в психологии

История возникновения метода породила отдельные виды интроспекции, открытые учеными разных европейских философских и психологических школ. Среди них выделяются:

  • систематическая, позволяющая анализировать возникновение мыслей и чувств в ретроспективе, то есть, после совершениях тех или иных действий;
  • аналитическая, как будто препарирующая эмоции, раскладывая их на малые составляющие и показывающая их от момента формирования до проявления;
  • феноменологическая интроспекция – самонаблюдение, использующаяся в гештальтпсихологии, когда анализ внутреннего состояния человека происходит описательно, без нанесения душевных травм.

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

Статьи по теме:

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

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

Тема, объясняющая, что такое дедукция, после выхода на экраны сериала «Шерлок Холмс», находится на пике популярности. Подобный тип мышления будет полезным в разных сферах, главное, постоянно его развивать, для чего следует воспользоваться простыми рекомендациями.

Нарколепсия — редкое и загадочное заболевание нервной системы, поражающее в основном мужскую часть населения. Недуг сопровождается непреодолимым желанием «провалиться в сон» и потерей мышечного тонуса (катаплексией) – нарколептик при этом, падает как «подкошенный».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *