> прототипы показались страшной вещью, но сейчас они мне больше нравятся, чем стандартное ООП.
Так а что? — В динамических классовых языках (типа Python и Ruby) — тоже самое (цепь классов, добавление нового слота в любое из звеньев цепи, тут же отражается на объектах, порожденных от (конструктора) этого звена, либо звеньев, находящихся ниже в иерархии)
С номерами функций путано получилось. Имеется в виду номера функций, так называемой, Модели А, а не моя нумерация дихотомий выше (просто я пронумеровал дихотомии, а потом использую номера функций из Модели А; вот, исправляюсь, уточняю, что это не они :))
О-о, боюсь, это тема не одного коммента ;) Да и, собственно, я знаю соционику на любительском уровне (так — интересно, конечно, но не «фанатею», так сказать).
В общем, это пара наука, типология, которая изучает информационный метаболизм в обществе (соционе). Отсюда и название — соционика (смесь психологии и информатики). Это то, как человек получает информацию из внешних источников (раздражителей), как ее обрабатывает (осознанно и неосознанно), и как выдает обратно в социон. Это форма и тип мышления. Психотип человека. Отсюда, что одному хорошо, другой может считать это полностью расходящимся с его принципами (так появляются «дуалы» и «конфликтеры»).
В основном, можно задать психотип, описывая его 4 дихотомиями (парами взаимоисключающих признаков). Это:
Комбинируя признаки дихотомий, всего выделяют 16 психотипов. Например, «рациональный логико-интуитивный интроверт» (псевдоним для более легкого запоминания — «Робеспьер»), или «иррациональный сенсорно-этический экстраверт» (псевдоним «Наполеон») и т.д.
Суть в том, что какие-то из аспектов человек воспринимает осознанно, и по в этих аспектах он чувствует полную уверенность (и эти аспекты определяют смысл жизнь; это комбинация «программной» (1) и «творческой» (2) функции), а другие аспекты — находятся в зоне комплексов и неуверенности (например, «болевая» (4) функция — это слабое место человека). Так вот, ваша «болевая» функция находится в «программной» у вашего конфликтера (т.е. то, что развито у конфликтера, у вас — вызывает неуверенность и потребность активно защищаться по ней). Т.е. конфликтер осознанно давит на вашу «болевую» (так же как и вы на его). В свою очередь у дуала, ваша болевая находится в подсознательной функции и он берет на себя ответственность (неосознанно) по поддержке вас по этой функции, тем самым дополняя вас (так же, как и вы его). Помимо дуалов и конфликтеров есть есть множество других отношений.
Помимо этих 4 дихотомий есть еще деления, состоящие из 16 признаков Рейнина (здешний питерский математик, который разработал эту теорию, описав это математически); туда, кстати, и входят упоминавшиеся выше «негативизм-позитивизм».
Так же можно пройти тест и определить свой ТИМ (тип информационного метаболизма): socionika.info/test.html (однако, тесты могут «врать»; человек может (неосознанно) выбирать ответы, которые ему нравится, но не те, которые есть на самом деле)
> Кстати, был когда-то негативом, смог исправиться. Путь — просто перестал говорить нет и всё что начинается с не… Мышление стало меняться то же. Сам себя перепрограммировал :)
Тип не меняется. Исправляться можно лишь в плане слабых функций (у каждого они есть) — т.е. тренировать слабые функции. Если будет один позитивистский подход, то многие формальные возможности системы могут быть упущены (именно поэтому в дуальной паре одни позитивист, другой негативист (прим. «дуальная пара» — пара полного дополнения и поддержки по слабым функциям партнера; наилучшее общение)).
Один лишь позитивизм может граничить с непритязательностью, когда (повторю) интересует лишь путь до цели, но не сама цель. Одни лишь позитивистские высказывания в большом объеме могут перерасти в лесть, и какие-то аспекты будут упущены.
В каждом сочетаются оба аспекта (и здесь нет ни «хорошего», ни «плохого») — это всего лишь отбор свойств в объекте — те которые «видны», либо те, которые «пока не видны, но хотелось бы».
Ах, да, прошу прощения, что привожу терминологию и описание, не указав ссылку на саму типологию; если, вдруг, будет интересно — ознакомительная ссылка в Вики — ru.wikipedia.org/wiki/Тип_информационного_метаболизма (это пара наука). И, кстати, одним из аспектов типа, к которому отношусь я в этой типологии, является негативизм — «желание дополнить, улучшить систему, видя в ней недочеты» (но никак не «упрямое отрицание, с целью поставить ногу на грудь»)
Кстати, психологи рекомендуют не употреблять негативиские фразы (с приставками «не» — «неплохая погода», «на небе ни облачка») на всякого рода собеседованиях, PR и т.д.
> рекомендую прочитать статью: «The power of NO» почему-то не сомневаюсь что она доставит Вам удовольствие %)
Читал уже :) Рекомендую почитать о психоанализе в целом, и о том, что в одной из типологий (например, информационного метаболизма) можно подразделять людей на «негативистов» и «позитивистов». При этом, это вовсе не означает (ага, здесь снова можно — «ну вот, вы подтверждаете мою теорию :)»), что один негативный, другой позитивный. Здесь можно проводить аналогии со «целью» и «достижением цели (путем к цели)» (в то время, как цель не столь и важна). Негативисты, всего лишь, видят в объекте те свойства, которые в нем не полны (замечают отсутствие свойств). Позитивисты — наиболее отчётливо видят свойства, которые присутствуют в объекте.
Наглядный пример:
— «На небе ни облачка!» или «Неплохая погода!» — фраза негативиста.
— «Небо ясное!» или «Хорошая погода» — фраза позитивиста.
При этом позиция, описанная автором в статье про «зэ пауэр оф НОУ» — практически беспроигрышная. На любую негативистскую фразу можно сказать — «ну вот, вы подтверждаете мою теорию». Что, в психологической теории, является «тонким» (для тех, кто не особо знаком с этим) демагогическим ходом.
Сам негитивизм, как и конкуренция, может являться двигателем, не давать системе пребывать подолгу в состоянии застоя.
Другое дело, что нужно различать «упрямство с неосознанной (подсознательной) целью победить в споре». Тогда как более высокой степенью обмена информацией — является дискуссия с нежеланием «поставить ногу на грудь», а найти относительную истину. Именно об этом автор пишет в той статье.
> Это не означает, что на JS невозможно сделать абстракции, инкапсуляции, наследование или полиморфизма.
Инкапсуляция — строгой инкапсуляции нет, но часто знание, что «так делать нельзя» — является инкапсуляцией. Инкапсуляция — лишь эффект создания черного ящика, его можно и достичь при открытости промежуточных сущностей. Можно замыкать var'ы, делая их недоступными напрямую из вне (хотя, есть реализации с eval'ом, когда их, все же, можно достать).
Наследование — заложено изначально в идеологию языка. Весь язык пропитан (делегирующим к прототипам) наследованием. Как вариант, часто привожу пример — объясните, что здесь происходит: — alert(1.toString());
Полиморфизм — есть изначально (ничто не мешает объявить методы с одинаковым названием, но с разной реализацией для разных объектов; ничто не мешает переопределить одноименные методы).
Не ясно, что имелось в виду под «сделать абстракции», ну да ладно (а вообще — в JS много абстракций).
> Получившийся экземпляр имеет структуру и поведение, жёстко заданные его классом.
Только в статических реализациях, динамических это ограничение не касается. При этом «классы-прототипы» здесь не при чем.
> В JS нет наследования и тем более множественного.
Уже отмечалось. В JS есть наследование — прототипное делегирующее, схожее с динамически-классовым делегирующим.
> а) Наследования, как такового нет, т.е. нельзя определить объект и как в C++ сказать class B: public A{...}. Есть прототипы, через которые можно сделать «почти» то же самое, об этом и писал :)
Я бы сказал, что нет такого синтаксического сахара "… :public A"; само же наследование, естественно, есть. Кстати, слово «почти» — вряд ли может быть однозначно описано, поскольку сложно сказать, что это «почти» в себе содержит.
> Внимательный читатель меня спросит — а где же в этой дьявольской смеси конструктор? Да, здесь его не было.
Терминологию лучше не путать. win, как уже отмечал Zeroglif, есть конструктор (в официальной терминологии JS). На конструктор можно смотреть, как на штамповщик объектов по заданному шаблону.
> В роли ключей могут выступать любые неизменяемые объекты
Если более точно, то ключами могут быть любые объекты, которые хэшируемы (термин hashable из глоссария Python'a). При этом, говорить о неизменяемости нужно именно хэш-значения, но не самого объекта. Например, объект, порожденный от пользовательского класса — изменяем (мы можем динамически добавлять новые слоты в него, например), но, тем не менее, имеет неизменяемое хэш-значение (которое также равно его id: id(obj) == obj.__hash__ — True).
Да там хоть у «вас», хоть «не у вас». Что такое «чистое ООП» и почему — никто толком не скажет (и вряд ли есть возможность отнести какую-то конкретную реализацию объектно-ориентированных систем под это словосочетание)
не дописал, опять отправилось по клавишам случайно.
При этом записи:
class << self # Здесь self это MyClass
include MyMod
end
и
extend MyMod
эквиваленты, и обе создают синглтон-методы для «сущности». Если сущностью является класс, то будет создан метакласс, который будет содержать методы класса. Если сущность — это инстанс, то будет создан virtual-класс, который будет хранить методы инстанса. Кстати, класс — тоже инстанс (класса Class), поэтому первая конструкция, в которой используется include (который добавляет инстанс-методы) эквивалентна второй.
И сам include, как я уже отмечал, создает прокси-класс со ссылкой на подмешиваемый модуль.
P.S> для начального изучения эти механизмы не столь важны, но привожу, поскольку знать это тоже нужно будет.
Перелистнем на одну каплю назад и вспомним, что такое модули и как их применять, в частности, обратим внимание на примеси и пример, приведенный там.
Но что случится при смешивании с нашими методами модуля? Если вы думаете, что будут включены как методы класса, то Руби так не поступает. Для этого можно сделать так:
Смотря как модмешивается модуль. Если это include — то будут instance-методы, если это extend — то — синглтон-методы. При этом записи:
модуль можно подмешать и extend'ом — для инстансов создастся virtual-класс, и методы модуля будут доступны конкретному инстансу, для класса же extend создаст мета-класс, где будет хранить методы класса.
Так а что? — В динамических классовых языках (типа Python и Ruby) — тоже самое (цепь классов, добавление нового слота в любое из звеньев цепи, тут же отражается на объектах, порожденных от (конструктора) этого звена, либо звеньев, находящихся ниже в иерархии)
В общем, это пара наука, типология, которая изучает информационный метаболизм в обществе (соционе). Отсюда и название — соционика (смесь психологии и информатики). Это то, как человек получает информацию из внешних источников (раздражителей), как ее обрабатывает (осознанно и неосознанно), и как выдает обратно в социон. Это форма и тип мышления. Психотип человека. Отсюда, что одному хорошо, другой может считать это полностью расходящимся с его принципами (так появляются «дуалы» и «конфликтеры»).
В основном, можно задать психотип, описывая его 4 дихотомиями (парами взаимоисключающих признаков). Это:
1. рациональность–иррациональность;
2. экстраверсия–интроверсия;
3. логика–этика;
4. сенсорика–интуиция.
Комбинируя признаки дихотомий, всего выделяют 16 психотипов. Например, «рациональный логико-интуитивный интроверт» (псевдоним для более легкого запоминания — «Робеспьер»), или «иррациональный сенсорно-этический экстраверт» (псевдоним «Наполеон») и т.д.
Суть в том, что какие-то из аспектов человек воспринимает осознанно, и по в этих аспектах он чувствует полную уверенность (и эти аспекты определяют смысл жизнь; это комбинация «программной» (1) и «творческой» (2) функции), а другие аспекты — находятся в зоне комплексов и неуверенности (например, «болевая» (4) функция — это слабое место человека). Так вот, ваша «болевая» функция находится в «программной» у вашего конфликтера (т.е. то, что развито у конфликтера, у вас — вызывает неуверенность и потребность активно защищаться по ней). Т.е. конфликтер осознанно давит на вашу «болевую» (так же как и вы на его). В свою очередь у дуала, ваша болевая находится в подсознательной функции и он берет на себя ответственность (неосознанно) по поддержке вас по этой функции, тем самым дополняя вас (так же, как и вы его). Помимо дуалов и конфликтеров есть есть множество других отношений.
Помимо этих 4 дихотомий есть еще деления, состоящие из 16 признаков Рейнина (здешний питерский математик, который разработал эту теорию, описав это математически); туда, кстати, и входят упоминавшиеся выше «негативизм-позитивизм».
Можно здесь посмотреть: socionika.info/
Так же можно пройти тест и определить свой ТИМ (тип информационного метаболизма): socionika.info/test.html (однако, тесты могут «врать»; человек может (неосознанно) выбирать ответы, которые ему нравится, но не те, которые есть на самом деле)
Описания типов: socionika.info/tips.html
P.S.> надеюсь, не слишком перегружено получилось ;)
Тип не меняется. Исправляться можно лишь в плане слабых функций (у каждого они есть) — т.е. тренировать слабые функции. Если будет один позитивистский подход, то многие формальные возможности системы могут быть упущены (именно поэтому в дуальной паре одни позитивист, другой негативист (прим. «дуальная пара» — пара полного дополнения и поддержки по слабым функциям партнера; наилучшее общение)).
Один лишь позитивизм может граничить с непритязательностью, когда (повторю) интересует лишь путь до цели, но не сама цель. Одни лишь позитивистские высказывания в большом объеме могут перерасти в лесть, и какие-то аспекты будут упущены.
В каждом сочетаются оба аспекта (и здесь нет ни «хорошего», ни «плохого») — это всего лишь отбор свойств в объекте — те которые «видны», либо те, которые «пока не видны, но хотелось бы».
Ладно, думаю, оффтоп устраивать не будем ;)
Ну, если, все-таки, надо выделить «нишу», тогда только 3 ;) Поскольку 2 и 4 (а 1 — априори), допустимы и в языках, где употребляется термин «класс».
> меньше неправильных ассоциаций возникает
Для этих целей, да.
> Без затей.
Ага, чтобы как-то разграничить; создать «свою» «нишу». Если же начнем капать, то там — опять концов терминологии не сыщем ;)
Читал уже :) Рекомендую почитать о психоанализе в целом, и о том, что в одной из типологий (например, информационного метаболизма) можно подразделять людей на «негативистов» и «позитивистов». При этом, это вовсе не означает (ага, здесь снова можно — «ну вот, вы подтверждаете мою теорию :)»), что один негативный, другой позитивный. Здесь можно проводить аналогии со «целью» и «достижением цели (путем к цели)» (в то время, как цель не столь и важна). Негативисты, всего лишь, видят в объекте те свойства, которые в нем не полны (замечают отсутствие свойств). Позитивисты — наиболее отчётливо видят свойства, которые присутствуют в объекте.
Наглядный пример:
— «На небе ни облачка!» или «Неплохая погода!» — фраза негативиста.
— «Небо ясное!» или «Хорошая погода» — фраза позитивиста.
При этом позиция, описанная автором в статье про «зэ пауэр оф НОУ» — практически беспроигрышная. На любую негативистскую фразу можно сказать — «ну вот, вы подтверждаете мою теорию». Что, в психологической теории, является «тонким» (для тех, кто не особо знаком с этим) демагогическим ходом.
Сам негитивизм, как и конкуренция, может являться двигателем, не давать системе пребывать подолгу в состоянии застоя.
Другое дело, что нужно различать «упрямство с неосознанной (подсознательной) целью победить в споре». Тогда как более высокой степенью обмена информацией — является дискуссия с нежеланием «поставить ногу на грудь», а найти относительную истину. Именно об этом автор пишет в той статье.
> Это не означает, что на JS невозможно сделать абстракции, инкапсуляции, наследование или полиморфизма.
Инкапсуляция — строгой инкапсуляции нет, но часто знание, что «так делать нельзя» — является инкапсуляцией. Инкапсуляция — лишь эффект создания черного ящика, его можно и достичь при открытости промежуточных сущностей. Можно замыкать var'ы, делая их недоступными напрямую из вне (хотя, есть реализации с eval'ом, когда их, все же, можно достать).
Наследование — заложено изначально в идеологию языка. Весь язык пропитан (делегирующим к прототипам) наследованием. Как вариант, часто привожу пример — объясните, что здесь происходит: — alert(1.toString());
Полиморфизм — есть изначально (ничто не мешает объявить методы с одинаковым названием, но с разной реализацией для разных объектов; ничто не мешает переопределить одноименные методы).
Не ясно, что имелось в виду под «сделать абстракции», ну да ладно (а вообще — в JS много абстракций).
> Получившийся экземпляр имеет структуру и поведение, жёстко заданные его классом.
Только в статических реализациях, динамических это ограничение не касается. При этом «классы-прототипы» здесь не при чем.
> В JS нет наследования и тем более множественного.
Уже отмечалось. В JS есть наследование — прототипное делегирующее, схожее с динамически-классовым делегирующим.
> а) Наследования, как такового нет, т.е. нельзя определить объект и как в C++ сказать class B: public A{...}. Есть прототипы, через которые можно сделать «почти» то же самое, об этом и писал :)
Я бы сказал, что нет такого синтаксического сахара "… :public A"; само же наследование, естественно, есть. Кстати, слово «почти» — вряд ли может быть однозначно описано, поскольку сложно сказать, что это «почти» в себе содержит.
> Внимательный читатель меня спросит — а где же в этой дьявольской смеси конструктор? Да, здесь его не было.
Терминологию лучше не путать. win, как уже отмечал Zeroglif, есть конструктор (в официальной терминологии JS). На конструктор можно смотреть, как на штамповщик объектов по заданному шаблону.
Если говорить о цепях наследования — то в классах тоже самое (во всяком случае, в динамических классовых реализациях) — делегация.
id(obj) == obj.__hash__() # опечатка, __hash__ — метод
Если более точно, то ключами могут быть любые объекты, которые хэшируемы (термин hashable из глоссария Python'a). При этом, говорить о неизменяемости нужно именно хэш-значения, но не самого объекта. Например, объект, порожденный от пользовательского класса — изменяем (мы можем динамически добавлять новые слоты в него, например), но, тем не менее, имеет неизменяемое хэш-значение (которое также равно его id: id(obj) == obj.__hash__ — True).
Да там хоть у «вас», хоть «не у вас». Что такое «чистое ООП» и почему — никто толком не скажет (и вряд ли есть возможность отнести какую-то конкретную реализацию объектно-ориентированных систем под это словосочетание)
Весьма сомнительное словосочетание.
При этом записи:
и
эквиваленты, и обе создают синглтон-методы для «сущности». Если сущностью является класс, то будет создан метакласс, который будет содержать методы класса. Если сущность — это инстанс, то будет создан virtual-класс, который будет хранить методы инстанса. Кстати, класс — тоже инстанс (класса Class), поэтому первая конструкция, в которой используется include (который добавляет инстанс-методы) эквивалентна второй.
И сам include, как я уже отмечал, создает прокси-класс со ссылкой на подмешиваемый модуль.
P.S> для начального изучения эти механизмы не столь важны, но привожу, поскольку знать это тоже нужно будет.
Смотря как модмешивается модуль. Если это include — то будут instance-методы, если это extend — то — синглтон-методы. При этом записи: