В качестве ответа на ваш коммент могу порекомендовать еще раз перечитать 2 последних абзаца статьи.
После этого фразы типа «не поняв зачем нужна инкапсуляция, не стоит отвергать её из-за специфики», если они конечно обращены ко мне, потеряют всякий смысл.
У вас несколько искаженное цитирование. Я имел ввиду, что наличие всех этих концепций в языке одновременно не является обязательным условием для того, чтобы назвать его объектно-ориентированным.
Также реализация этих вещей в конкретных ЯП может варьироваться начиная от строго формальной (private, public, protected), до идеологической (в JS мы можем работать с объектами так, как будто это «черные ящики», но можем и не делать этого. Подход определяется задачами проектируемой системы, а не формальными инструкциями языка).
Если бы при приеме на работу к водителям относились так же, как к программистам:
Вакансия: водитель.
Требования:
Профессиональные навыки управлении легковыми и грузовыми автомобилями, троллейбусами, трамваями, поездами метрополитена и фуникулера, экскаваторами и бульдозерами, спецмашинами на гусеничном ходу, боевыми машинами пехоты и современными легкими/средними танками, находящимися на вооружении стран СНГ и НАТО.
Навыки раллийского и экстремального вождения — обязательны, опыт управления болидами F1 — приветствуется.
Знания и опыт ремонта поршневых и роторных двигателей, автоматических и ручных трансмиссий, систем зажигания, бортовых компьютеров, антиблокировочных систем, навигационных систем (GPS) и автомобильных аудиосистем ведущих производителей — обязательны.
Опыт проведения кузовных и окрасочных работ приветствуется.
Претенденты должны иметь сертификаты BMW, General Motors, а также справки об участии в крупных международных ралли не более чем двухлетней давности.
Зарплата 1500-2500 руб., определяется по результатам собеседования.
«Там где программист начинает заниматься вводом данных — начинается рутина». Это правильно. Но ведь сплошь и рядом приходится заниматься вот такими вот рутинными вещами.
Однако не стоит называть это проблемами программирования.
Даже если я сам заполняю названия полей формы, и даже если я делаю это прямо в коде — то я просто выношу их в отдельный массив и, самое главное, процесс заполнения этого массива я не считаю программированием.
Т.е. я четко осознаю, что здесь я именно что работаю по совместительству. Программирую, и еще «примусы починяю» на полставки :)
«Но все равно придется прописать параметры каждого чекбокса»
Решение настолько же простое, насколько эффективное — отделение данных от логики.
Вывод полей различных типов, методы их обработки, запись в БД — это логика.
Но название полей, обязательность/необязательность, сообщения об ошибках — это данные.
И вводиться они должны не программистом, а человеком, который занимается вводом данных. Т.е. тем, кто работает с CMS, в данном конкретном случае.
Там где программист начинает заниматься вводом данных — начинается рутина.
Угу, противоречиво )
Я когда писал первый коммент, смотрел не на ту часть текста, где вот строчки из Википедии, а на ту, где Создание объекта «с нуля» в JS, «это вещь»!
В итоге смешал понятия из прототип-ориентированных языков вообще и из JavaScript конкретно.
Правильная фраза видимо должна звучать так:
«При создании любого объекта в JavaScript мы связываем его с объектом-прототипом при помощи функции-конструктора, таким образом среда исполнения способна выполнять диспетчеризацию вызовов методов (или поиск нужных данных) в созданном объекте к объекту-прототипу. По умолчанию конструктором является Object, а прототипом — Object.prototype»
Однако, боюсь что такая фраза уже теряет всю легкость и простоту )
Ну, клонирование объектов в тексте автора это общий термин для всех прототип-ориентированных языков. В самом JS понятное дело не происходит никакого клонирования, а происходит делегирование от объекта к его прототипу.
Сама же фраза «создание объекта с нуля» некорректна ни в том случае, ни в другом.
… он мало того что уже имеет свойства и методы, так еще и не всегда одни и те же (в случае расширения базовых прототипов — вот из-та таких тонкостей я бы не стал использовать выражение «с нуля» даже в кавычках. Потому что уж слишком образное оно получается. И вроде как использовано только для красного словца.
Почему бы не сказать просто: «Все объекты в JavaScript создаются путем клонирования существующих. По умолчанию источником клонирования является базовый объект Object».
И коротко, и корректно.
Чего-то я не понял, что тут принципиально нового по сравнению с моей статьей, ну да ладно )
По существу: В прототип-ориентированных системах (например JS) предоставляется два метода создания нового объекта: клонирование существующего объекта, либо создание объекта «с нуля».
Это не так. Даже создавая объект как obj={} мы всегда используем конструктор Object и его прототип. Более того, если мы этот прототип расширим, то и эти добавленные свойства будут во всех якобы «созданных с нуля» объектах.
Очевидно, что никакого создания объекта с нуля не получается, т.к. он мало того что уже имеет свойства и методы, так еще и не всегда одни и те же (в случае расширения базовых прототипов).
Ну если у вас есть пожелания, про что можно еще написать о JavaScript в подобном стиле — было бы интересно о них узнать. Потому что я пока не придумал, что бы такого еще написать образовательного (именно про сам язык, а не про фреймворки). Тем более что хорошая статья про замыкания уже тоже есть.
В таком случае просто можно сделать возможность «дампа памяти» ИИ, и если он зайдёт в тупик (решит, например, что всё это тщетно и не имеет смысла ничего делать), можно будет загрузить его с какой-то точки, чтобы обучать по-другому.
Ну дык это подмена шила на мыло.
Если при этом стирать ему всю память до момента возврата в контрольную точку (т.е. чтобы он не помнил, что попал в тупик), то это равнозначно разветвлению его в данной контрольной точке на два физических экземпляра (один из которых потом умрет, а другой возможно выживет).
Если же память не стирать, то получится как раз тот самый бессмертный персонаж, который рано или поздно поймет, что какую бы фигню он не делал, все равно останется жив.
Не надо валить все в кучу. Вы тут сразу приводите и безусловные, и условные рефлексы, и процесс вербального обучения человека (который вообще к рефлексам имеет слабое отношение).
Очевидно, что ребенок, если он не сидит все детство в замкнутой комнате без окон, помимо знания о том, что «сделал дело — получил подарок», будет иметь ряд других знаний, типа «если прыгнуть свысока — будет больно», «не всегда стоит доверять другим людям» и т.д.
Соответственно, после просьбы прыгнуть с крыши у него возникнет конфликт интересов и далеко не факт что победит желание подарка.
По вашему, так люди прям какие-то «собаки Павлова», у которых на лампочку всегда течет слюна. Каждую секунду мозг человека обрабатывает множество информации и выбирает наиболее эффективную на его взгляд модель поведения исходя из имеющихся данных — и это все на порядки сложнее, чем «прыгну с крыши — получу подарок».
Я бы сказал, не стремление выжить — двигатель эволюции, а в результате эволюции выжившие организмы приобрели механизмы, которые позволяют им выживать. Именно потому, что организмы без таких механизмов умирали и не передавали свой генетический и другой опыт потомству.
Это просто игра словами.
Можно представить эволюцию видов во временном срезе либо как дерево, содержащее только выжившие виды (ну и предков этих видов естественно), либо как другое дерево, которое содержит еще и все тупиковые ветви (виды, которые не выжили сами и не дали никаких потомков).
Соответственно, те кто выжили, отращивали себе именно инструменты для выживания, а те кто сдохли — какие-то другие штуки.
Да, вот эти вторые (которые сдохли) — он двигались не в сторону выживания. Но двигались они в сторону тупика.
Технически — это эволюция с другой целью, нежели «выживание», но практически — это просто смерть вида в перспективе. И уже не имеет никакого значения, в какую сторону они развивались и чего такого интересного у них выросло, если в итоге не осталось ничего, кроме окаменелостей.
Ну вы попробуйте конечно, я же не могу вас заставить этого не делать :)
Просто, на мой взгляд, вы упускаете тот важный факт, что любой инструмент развития (т.е. какой-то механизм в организме, рефлекс, нерв, орган чувств, принцип работы памяти и т.д.) — так вот, любой инструмент является одновременно и продуктом развития.
Т.е. по идее если уж реально делать искусственную жизнь, то делать ее надо начиная с «бульона из аминокислот», далее к одноклеточным и по нарастающей.
Просто «планария» с уже готовыми рефлексами, системой пищеварения, системой передвижения созданными «с нуля» — она будет похожа на реальную планарию, но и развиваться будет только в рамках планарии, а не дальше по эволюционной цепи.
Это все равно что смоделировать в 3D целиковый монолитный куб и потом хотеть, чтобы он от виртуального нагревания расширялся как обычный — но этого не будет, потому что куб упрощен и не состоит из виртуальных молекул.
Цитирую автора: Это должен быть динамичный мир со своими объектами, у которых будут свои свойства, и со своими законами, которые будут действовать на объекты и на саму программу. И программу теперь уже уместнее называть искусственным организмом.
Если мы хотим, чтобы он развивался как человек и думала как человек, то нужно создать для него мир, максимально соответствующий реальному. Иначе мы получим интеллект уровня пришельца с Альфы Центавра.
Смотрите, вот существует реальный мир, с реальной историей, физическими законами и живностью. Существует (уже довольно давно) желание человека изучать этот мир, а в связи с недавним развитием компьютеров — и моделировать тоже.
Причем моделируют преимущественно с двумя целями: чтобы лучше изучить, и чтобы можно было использовать смоделированное на практике (роботы работают, люди отдыхают).
Так вот, само понятие «моделирование» подразумевает по возможности точное и полное копирование оригинала. Об этом кстати пишет и автор статьи.
Конечно, программист может задавать какие хочет условия и какие хочет законы виртуального мира, но называть это моделированием живых организмов — в корне не верно.
Я уже писал дважды, могу повторить и в третий раз — развитие в биологическом, эволюционном смысле не является атрибутом отдельного живого существа — это свойство вида, генетической линии потомков и предков. Развитию вида смерть одного животного помогает тем, что оно не даст потомков, которые будут повторять его действия и тоже попадать в безвыходные ситуации. Соответственно, потомки других (более умелых или удачливых) представителей вида получат больше жизненного пространства и не будут портить свой генетический материал спариванием с неудачниками.
Это конечно очень упрощенно все, но суть такова.
И отбросьте вы все эти мысли о жестоких уроках, адских муках, голодных щеночках (ниже в комментах прочитал). В природе ежедневно сотни тысяч животных пожирают других животных (причем живьем), еще сотни тысяч погибают в муках от голода и болезней. И это происходит уже много-много тысяч лет.
Да не может модель существовать без летального исхода )
Во-первых, в случае с голодом, это просто противоречит закону сохранения энергии. Если ресурсы кончились — значит кончились. Все, баста. Какие тут могут быть отрицательные эмоции? Или вы на машине с пустым баком все равно едете, просто она на вас немножко ругается?
Или вы собираетесь подкидывать в таком случае ей пару литров бесплатно? Тогда поинтересуйтесь у работников зоопарков например, как меняется поведение животного при внешнем (читай халявном) подкорме.
Смысл доводить до крайности в том, чтобы животные (как вид, а не как экземпляр) учились не только «справляться со сложившейся ситуацией», но и не попадать в нее. Потому что в жизни сплошь и рядом встречаются тупиковые ситуации, из которых животное уже не может выбраться живым при всем желании. Нет тут такого, что «терпение и труд все перетрут».
После этого фразы типа «не поняв зачем нужна инкапсуляция, не стоит отвергать её из-за специфики», если они конечно обращены ко мне, потеряют всякий смысл.
Также реализация этих вещей в конкретных ЯП может варьироваться начиная от строго формальной (private, public, protected), до идеологической (в JS мы можем работать с объектами так, как будто это «черные ящики», но можем и не делать этого. Подход определяется задачами проектируемой системы, а не формальными инструкциями языка).
Однако не стоит называть это проблемами программирования.
Даже если я сам заполняю названия полей формы, и даже если я делаю это прямо в коде — то я просто выношу их в отдельный массив и, самое главное, процесс заполнения этого массива я не считаю программированием.
Т.е. я четко осознаю, что здесь я именно что работаю по совместительству. Программирую, и еще «примусы починяю» на полставки :)
Решение настолько же простое, насколько эффективное — отделение данных от логики.
Вывод полей различных типов, методы их обработки, запись в БД — это логика.
Но название полей, обязательность/необязательность, сообщения об ошибках — это данные.
И вводиться они должны не программистом, а человеком, который занимается вводом данных. Т.е. тем, кто работает с CMS, в данном конкретном случае.
Там где программист начинает заниматься вводом данных — начинается рутина.
Я когда писал первый коммент, смотрел не на ту часть текста, где вот строчки из Википедии, а на ту, где Создание объекта «с нуля» в JS, «это вещь»!
В итоге смешал понятия из прототип-ориентированных языков вообще и из JavaScript конкретно.
Правильная фраза видимо должна звучать так:
«При создании любого объекта в JavaScript мы связываем его с объектом-прототипом при помощи функции-конструктора, таким образом среда исполнения способна выполнять диспетчеризацию вызовов методов (или поиск нужных данных) в созданном объекте к объекту-прототипу. По умолчанию конструктором является Object, а прототипом — Object.prototype»
Однако, боюсь что такая фраза уже теряет всю легкость и простоту )
Сама же фраза «создание объекта с нуля» некорректна ни в том случае, ни в другом.
Почему бы не сказать просто: «Все объекты в JavaScript создаются путем клонирования существующих. По умолчанию источником клонирования является базовый объект Object».
И коротко, и корректно.
По существу:
В прототип-ориентированных системах (например JS) предоставляется два метода создания нового объекта: клонирование существующего объекта, либо создание объекта «с нуля».
Это не так. Даже создавая объект как obj={} мы всегда используем конструктор Object и его прототип. Более того, если мы этот прототип расширим, то и эти добавленные свойства будут во всех якобы «созданных с нуля» объектах.
Очевидно, что никакого создания объекта с нуля не получается, т.к. он мало того что уже имеет свойства и методы, так еще и не всегда одни и те же (в случае расширения базовых прототипов).
Ну дык это подмена шила на мыло.
Если при этом стирать ему всю память до момента возврата в контрольную точку (т.е. чтобы он не помнил, что попал в тупик), то это равнозначно разветвлению его в данной контрольной точке на два физических экземпляра (один из которых потом умрет, а другой возможно выживет).
Если же память не стирать, то получится как раз тот самый бессмертный персонаж, который рано или поздно поймет, что какую бы фигню он не делал, все равно останется жив.
Очевидно, что ребенок, если он не сидит все детство в замкнутой комнате без окон, помимо знания о том, что «сделал дело — получил подарок», будет иметь ряд других знаний, типа «если прыгнуть свысока — будет больно», «не всегда стоит доверять другим людям» и т.д.
Соответственно, после просьбы прыгнуть с крыши у него возникнет конфликт интересов и далеко не факт что победит желание подарка.
По вашему, так люди прям какие-то «собаки Павлова», у которых на лампочку всегда течет слюна. Каждую секунду мозг человека обрабатывает множество информации и выбирает наиболее эффективную на его взгляд модель поведения исходя из имеющихся данных — и это все на порядки сложнее, чем «прыгну с крыши — получу подарок».
Это просто игра словами.
Можно представить эволюцию видов во временном срезе либо как дерево, содержащее только выжившие виды (ну и предков этих видов естественно), либо как другое дерево, которое содержит еще и все тупиковые ветви (виды, которые не выжили сами и не дали никаких потомков).
Соответственно, те кто выжили, отращивали себе именно инструменты для выживания, а те кто сдохли — какие-то другие штуки.
Да, вот эти вторые (которые сдохли) — он двигались не в сторону выживания. Но двигались они в сторону тупика.
Технически — это эволюция с другой целью, нежели «выживание», но практически — это просто смерть вида в перспективе. И уже не имеет никакого значения, в какую сторону они развивались и чего такого интересного у них выросло, если в итоге не осталось ничего, кроме окаменелостей.
Просто, на мой взгляд, вы упускаете тот важный факт, что любой инструмент развития (т.е. какой-то механизм в организме, рефлекс, нерв, орган чувств, принцип работы памяти и т.д.) — так вот, любой инструмент является одновременно и продуктом развития.
Т.е. по идее если уж реально делать искусственную жизнь, то делать ее надо начиная с «бульона из аминокислот», далее к одноклеточным и по нарастающей.
Просто «планария» с уже готовыми рефлексами, системой пищеварения, системой передвижения созданными «с нуля» — она будет похожа на реальную планарию, но и развиваться будет только в рамках планарии, а не дальше по эволюционной цепи.
Это все равно что смоделировать в 3D целиковый монолитный куб и потом хотеть, чтобы он от виртуального нагревания расширялся как обычный — но этого не будет, потому что куб упрощен и не состоит из виртуальных молекул.
Это должен быть динамичный мир со своими объектами, у которых будут свои свойства, и со своими законами, которые будут действовать на объекты и на саму программу. И программу теперь уже уместнее называть искусственным организмом.
Если мы хотим, чтобы он развивался как человек и думала как человек, то нужно создать для него мир, максимально соответствующий реальному. Иначе мы получим интеллект уровня пришельца с Альфы Центавра.
Смотрите, вот существует реальный мир, с реальной историей, физическими законами и живностью. Существует (уже довольно давно) желание человека изучать этот мир, а в связи с недавним развитием компьютеров — и моделировать тоже.
Причем моделируют преимущественно с двумя целями: чтобы лучше изучить, и чтобы можно было использовать смоделированное на практике (роботы работают, люди отдыхают).
Так вот, само понятие «моделирование» подразумевает по возможности точное и полное копирование оригинала. Об этом кстати пишет и автор статьи.
Конечно, программист может задавать какие хочет условия и какие хочет законы виртуального мира, но называть это моделированием живых организмов — в корне не верно.
Это конечно очень упрощенно все, но суть такова.
И отбросьте вы все эти мысли о жестоких уроках, адских муках, голодных щеночках (ниже в комментах прочитал). В природе ежедневно сотни тысяч животных пожирают других животных (причем живьем), еще сотни тысяч погибают в муках от голода и болезней. И это происходит уже много-много тысяч лет.
Во-первых, в случае с голодом, это просто противоречит закону сохранения энергии. Если ресурсы кончились — значит кончились. Все, баста. Какие тут могут быть отрицательные эмоции? Или вы на машине с пустым баком все равно едете, просто она на вас немножко ругается?
Или вы собираетесь подкидывать в таком случае ей пару литров бесплатно? Тогда поинтересуйтесь у работников зоопарков например, как меняется поведение животного при внешнем (читай халявном) подкорме.
Смысл доводить до крайности в том, чтобы животные (как вид, а не как экземпляр) учились не только «справляться со сложившейся ситуацией», но и не попадать в нее. Потому что в жизни сплошь и рядом встречаются тупиковые ситуации, из которых животное уже не может выбраться живым при всем желании. Нет тут такого, что «терпение и труд все перетрут».