JavaScript для новичков и не только

Интересные алгоритмы, олимпиадные задачи, эффектные и эффективные решения. freepascal, delphi, c, c++, c#, java, javascript, perl, ruby, python, php, bash, wsh и т.д. Компиляторы, интерпретаторы, линкеры, отладчики, системы контроля версий и многое другое.

Модератор: xdsl

JavaScript для новичков и не только

Сообщение xdsl 16 фев 2009, 10:52

Несколько советов всем, начинающим изучать JavaScript. Прежде всего - моим студентам, которых гружу программированием на этом языке.
1. JavaScript - это не JAVA!!! Не путайте два разных языка, с различными синтаксисом, семантикой и областями применения. Это все равно, что спутать C++ и C#
2. Не путать ядро языка с его клиентской частью!!! JavaScript - несамостоятельный язык. Его интерпретатор всегда куда-то встраивается. В браузер, в веб-сервер, в движок визуального интерфейса и т.п. В результате JavaScript состоит из двух частей - постоянно-неизменного ядра и стольже-постоянно-модифицируемой клиентской части, которая различна для браузеров, серверов и т.п. Ядро небольшое, и даже не имеет средств ввода-вывода.
3. Документации по JavaScript много, однако подходить к ней надо с осторожностью. Благодаря распространенности и востребованности языка доки по нему пишут все кому не лень, мешая в кучу ядро и клиентскую часть, неразличая или не указывая клиентские части различных систем. Например - могут использовать свойство window.all, не указывая, что оно имеет отношение к специфичной для IE клиентской части и в других браузерах, а уж тем более в других JS-системах отсутствует (как и сам объект window - имеющий отношение только к браузерам). Поэтому рекомендую пользоваться только спецификациями JavaScript от разработчиков, тем более - по ядру. Локально из вуза можете добраться до них по адресу http://vc.shgpi/doc.html, или из инета (ftp://shgpi.edu.ru/ftp.vc.shgpi/doc/w3c/jscoreguide15/). Еще рекомендую издательство O'Reilly (так называемые "книги с животными"). У них есть очень неплохой учебник-справочник-настольнаякнига по JS, автор - Дэвид Флэнаган. Неплохим порталом по всей JS-тематике является сайт javascript.ru

В процессе работы со студентами буду публиковать здесь наиболее интересные моменты, связанные с изучением этого языка и областей его применения. Например: https://shgpi.edu.ru/forum/viewtopic.php?f=39&t=43. Начало этой темы демонстрирует возможность написания программ непосредственно в командной строке браузера.
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Если бы Хемингуэй писал на JavaScript

Сообщение Vladislav_133 30 сен 2012, 16:28

Михаил Васильевич Шохирев прислал мне замечательную статью. Вот ссылка на нее .
Я же решил перевести статью на русский язык. Вот что у меня получилось.

Если бы Хемингуэй писал на JavaScript

Эта статья написана моим добрым другом и коллегой, Ангусом Кролом. Ангус работает в основной команде Твитера, выступает на конференциях пот всему миру, и ведет замечательный блог по javascript. Кроме этого, большой книгочей, так что я подумал, было бы здорово, если бы он написал о коде с этой точки зрения. Зацените! И дайте нам знать на Твитере, что вы об этом думаете.

Я полюбил литературу задолго до того, как написал первую строку программы. Теперь мне приходит много писать на JavaScript и я пишу книгу об этом.

Что же в JavaScript привлекает любителей литературы? У меня есть несколько сырых теорий о выразительности ограниченного синтаксиса, но об этом в другой раз. Что же можно сказать о великих писателях? Что бы они могли сделать на JavaScript? Даже будучи давним поклонником Хэмингуэя, я должен признать, что Папе (так звали Хэмингуэя) вряд ли бы понравилось программирование (и программисты). Но я держу пари, что среди всего, что вызывает общее презрение, есть слабое звено – JavaScript, потому что это его язык, разве я не прав? Скудная и обманчиво плоская поверхность, и скрывающаяся под ней жизнь и драма.

Мать всех рецензентов кода
Изображение
Недавно я видел сон, в котором я попросил Хэмингуэя и четырех других знаменитых литераторов написать для меня на JavaScript функцию, которая возвращает последовательность Фибоначчи заданной длины. Интересно, что каждый из авторов по-своему решил поставленную задачу. Они все сделали хорошо - насколько я могу сказать, каждое из решений работает, так как было сказано (да, даже у Андре Бретона). Вот что я получил:

Эрнест Хэмингуэй

Код: Выделить всё
function fibonacci(size) {

  var first = 0, second = 1, next, count = 2, result = [first, second];

  if(size < 2)
    return "запрос сделан, но он мне не нравится"

  while(count++ < size) {
    next = first + second;
    first = second;
    second = next;
    result.push(next);
  }
  return result;
}


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

Хэмингуэй не очень жаловал дураков, так что если вы попросите вывести ряд с количеством членов меньшим, чем два, он вас просто проигнорирует. «Я устал, да и вопрос идиотский».

Вильям Шекспир

Код: Выделить всё
function theSeriesOfFIBONACCI(theSize) {

  //ВЫЧИСЛЕНИЕ в двух актах.
  //используется юмористическая логика JavaScript

  //Действующие Лица
  var theResult; //и вот Массив, что Числа сохраняет
  var theCounter; //а вот Число, что Циклу служит

  //Акт I: в котором добавляется Ноль, чтобы провести Инициацию 

  //[ВХОДИТ: theResult]

  //согласно списку благородных даруем ноль
  var theResult = [0];

  //Акт II: Цикл в конце которого Запрашиваются и Суммируются два Числа

  //[ВХОДИТ: theCounter]

  //начать с единого и перейти ко многим
  for (theCounter = 1; theCounter < theSize; theCounter++) {
    //По предсказанию назначим смежные мы числа
    theResult[theCounter] = (theResult[theCounter-1]||1) + theResult[Math.max(0, theCounter-2)];
  }

  //Все кончено и вот ответ.
  return theResult;

  //[Все уходят]
}


Бард несколько многословен здесь, но иначе и нельзя. Обратите внимание, как написаны комментарии (кроме пояснений к актам и ремаркам). Это ямб – десять пар слогов с ударением на второй слог в каждой паре (я это не соблюдал, естественно). В своих пьесах Шекспир, чтобы добавить драматизма часто отклоняется от строгого ямба, добавляя слог или альтернативное ударение. Все выглядит так, что он пользуется этим приемом и в данном упражнении. Так держать Вил (Вильям Шекспир).

Андре Бретон

Код: Выделить всё
function Colette(umbrella) {
  var staircase = 0, galleons = 0, brigantines = 1, armada = [galleons, brigantines], bassoon;
  Array.prototype.embrace = [].push;

  while(2 + staircase++ < umbrella) {
    bassoon = galleons + brigantines;
    armada.embrace(brigantines = (galleons = brigantines, bassoon));
  }

  return armada;
}


Как один из основателей сюрреалистического движения, Бретон верил, что сны более интересны, чем реальность и формируют основу наших творческих порывов. Названия переменных выбраны соответствующим образом. Хотя на Бретона наезжать довольно просто, его работы уже в возрасте и неизменно теплы и прекрасны – выход бессознательного в форме сознательных проявлений. Вот здесь можно прочитать в переводе его великолепную поэму Facteur Cheval (фр.).

Очень вероятно, что Бретон назвал свою функцию вычисления ряда Фибоначчи по имени своей старой любви (Коллет), воображая, что результатом ее выполнения будет эскадра, старых кораблей. Его решение выдает элегантную логику – он использует оператор «запятая», чтобы произвести сдвиг между переменными galleons (галеоны), brigantines (бригантины) и bassoons (фаготы).

Роберто Болано

Код: Выделить всё
function LeonardoPisanoBigollo(l) {

  if(l < 0) {
    return " Я предпочитаю не отвечать. (Хотя некоторые ответы так и вертятся у меня на языке)"
  }

  /**/

  //Все усложняется.
  for (var i=2,r=[0,1].slice(0,l);i<l;r.push(r[i-1]+r[i-2]),i++)

  /**/

  //Здесь имена других математиков. Скорее всего, это бред.

  rationalTheorists = ["Archimedes of Syracuse", "Pierre de Fermat (such margins, boys!)", "Srinivasa Ramanujan", "Rene Descartes", "Leonhard Euler", "Carl Gauss", "Johann Bernoulli", "Jacob Bernoulli", "Aryabhata", "Brahmagupta", "Bhaskara II", "Nilakantha Somayaji", "Omar Khayyám", "Muhammad ibn Mūsā al-Khwārizmī", "Bernhard Riemann", "Gottfried Leibniz", "Andrey Kolmogorov", "Euclid of Alexandria", "Jules Henri Poincaré", "Srinivasa Ramanujan", "Alexander Grothendieck (who could forget?)", "David Hilbert", "Alan Turing", "von Neumann", "Kurt Gödel", "Joseph-Louis Lagrange", "Georg Cantor", "William Rowan Hamilton", "Carl Jacobi", "Évariste Galois", "Nikolay Lobachevsky", "Rene Descartes", "Joseph Fourier", "Pierre-Simon Laplace", "Alonzo Church", "Nikolay Bogolyubov"]

  /**/

  //Я этого не понимаю, но это надо в любом случае.
  return r

  /**/

  //Здесь ничего не происходит, но даже если происходит, то я не буду об этом говорить
}


Если прежде чем умереть вы не прочитали ни одной книги Болано, то вы зря прожили свою жизнь. Произведения Болано замечательны; одновременно сложные и наивные – его стиль повествования можно охарактеризовать как обезоруживающе-обаятельная искренность. Никакая из сторон человеческой натуры не запрещена, но теплота и юмор с которыми представляется любая слабость, делает их очаровательными и веселыми.
Верный по форме, экзаменационный лист Роберто слегка приправлен признаниями в ненадежности, затруднениях и невежестве. Хотя решение и блестяще, оно представляется как нечто вторичное. Всегда навязчивый и отклоняющийся от темы он с удовольствием предлагает нам умеренно интересный, но абсолютно бесполезный список математических гениев.

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

Чарльз Диккенс

Код: Выделить всё
function mrFibbowicksNumbers(enormity) {
  var assortment = [0,1,1], tally = 3, artfulRatio = 1.61803;

  while(tally++ < enormity) {
    //здесь чрезвычайно искусное выражение
    assortment.push(Math.round(assortment[tally-2] * artfulRatio));
  }

  //должен быть переизбыток элементов, надо использовать одно средство
  return assortment.slice(0, enormity);
}


Я не фанат Диккенса. По большей части я согласен с грубоватой оценкой Генри Джеймса.
«Если бы мы рискнули дать определение его роли в литературе, мы, соответственно, обозначили бы его, как самого великого из поверхностных романистов. Мы осознаем, что этим мы помещаем его в ранг младших чинов – департамент писем, который он и украшает; но мы принимаем это следствие нашего определения. По нашему мнению мы совершили бы грех против человечности, если бы поместили Мистера Диккенса среди самых великих романистов. Ибо, повторим, что мы уже объявили, он не создал ничего, кроме пустых очертаний. Он ничего не прибавил в наше понимание человеческой натуры.» - Генри Джеймс о Чарльзе Диккенсе в обозрении «Наши общие друзья», в Нэшион, 21 декабря 1865.

Поверхностность Боза (Boz – псевдоним Чарльза Диккенса) подтверждается и функцией получения ряда Фибоначчи. Да, используются интересные имена, но в целом отсутствует глубина понимания и суть предмета. Ему не удалось проникнуть в скрытую философию ряда Фибоначчи и вместо этого он прокладывает себе путь к решению дубинкой умножения. Увы.

Заключительные мысли

Защитный белок Крокфорда (популяризатор JavaScript) или сухой и узкий кругозор догм, доктрин и занятий по информатике – все это вредит JavaScript. Некоторые разработчики любят руководства и шаблоны, вот поэтому у нас есть Java. Удовольствие от JavaScript заложено в отсутствии жестких установок и безграничных возможностях, которые он нам предоставляет. Тоже можно сказать и об естественных языках. Лучшие авторы и лучшие разработчики на JavaScript те, кем овладел этот язык, кто исследуют его и экспериментируют с ним каждый день, разрабатывают собственный стиль, собственные шаблоны, собственные выражения.

Это все. Надеюсь, вам понравилось. Впрочем, это все чепуха.

Примечание (мое). Для того, чтобы до конца почувствовать всю прелесть представленных фрагментов кода, следовало бы еще перевести на русский язык имена переменных и самих функций, но я не уверен, что это можно хорошо сделать.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: JavaScript для новичков и не только

Сообщение xdsl 05 окт 2012, 09:11

Понравились поэма Шекспира и горячечный бред Диккенса. Однако в жизни пытаюсь писать программы как Хэмингуэй ;)
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.


Вернуться в Алгоритмизация и программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1