toJSON=function () {
var results = [];
this.each(function (object) {var value = Object.toJSON(object);if (!Object.isUndefined(value)) {results.push(value);}});
return "[" + results.join(", ") + "]";
}
clone=function () {
return [].concat(this);
}
intersect=function (array) {
return this.uniq().findAll(function (item) {return array.detect(function (value) {return item === value;});});
}
uniq=function (sorted) {
return this.inject([], function (array, value, index) {if (0 == index || (sorted ? array.last() != value : !array.include(value))) {array.push(value);}return array;});
}
without=function () {
var values = $A(arguments);
return this.select(function (value) {return !values.include(value);});
}
flatten=function () {
return this.inject([], function (array, value) {return array.concat(Object.isArray(value) ? value.flatten() : [value]);});
}
compact=function () {
return this.select(function (value) {return value != null;});
}
last=function () {
return this[this.length — 1];
}
first=function () {
return this[0];
}
clear=function () {
this.length = 0;
return this;
}
_each=function forEach() {
[native code]
}
_reverse=function reverse() {
[native code]
}
entries=function () {
return this.map();
}
member=function (object) {
if (Object.isFunction(this.indexOf)) {
if (this.indexOf(object) != -1) {
return true;
}
}
var found = false;
this.each(function (value) {if (value == object) {found = true;throw $break;}});
return found;
}
select=function (iterator, context) {
iterator = iterator.bind(context);
var results = [];
this.each(function (value, index) {if (iterator(value, index)) {results.push(value);}});
return results;
}
find=function (iterator, context) {
iterator = iterator.bind(context);
var result;
this.each(function (value, index) {if (iterator(value, index)) {result = value;throw $break;}});
return result;
}
inspect=function () {
return "[" + this.map(Object.inspect).join(", ") + "]";
}
size=function () {
return this.length;
}
zip=function () {
var iterator = Prototype.K, args = $A(arguments);
if (Object.isFunction(args.last())) {
iterator = args.pop();
}
var collections = [this].concat(args).map($A);
return this.map(function (value, index) {return iterator(collections.pluck(index));});
}
toArray=function () {
return [].concat(this);
}
sortBy=function (iterator, context) {
iterator = iterator.bind(context);
return this.map(function (value, index) {return {value: value, criteria: iterator(value, index)};}).sort(function (left, right) {var a = left.criteria, b = right.criteria;return a < b ? -1 : a > b ? 1 : 0;}).pluck(«value»);
}
reject=function (iterator, context) {
iterator = iterator.bind(context);
var results = [];
this.each(function (value, index) {if (!iterator(value, index)) {results.push(value);}});
return results;
}
pluck=function (property) {
var results = [];
this.each(function (value) {results.push(value[property]);});
return results;
}
partition=function (iterator, context) {
iterator = iterator ? iterator.bind(context) : Prototype.K;
var trues = [], falses = [];
this.each(function (value, index) {(iterator(value, index) ? trues : falses).push(value);});
return [trues, falses];
}
min=function (iterator, context) {
iterator = iterator ? iterator.bind(context) : Prototype.K;
var result;
this.each(function (value, index) {value = iterator(value, index);if (result == null || value < result) {result = value;}});
return result;
}
max=function (iterator, context) {
iterator = iterator ? iterator.bind(context) : Prototype.K;
var result;
this.each(function (value, index) {value = iterator(value, index);if (result == null || value >= result) {result = value;}});
return result;
}
invoke=function (method) {
var args = $A(arguments).slice(1);
return this.map(function (value) {return value[method].apply(value, args);});
}
inject=function (memo, iterator, context) {
iterator = iterator.bind(context);
this.each(function (value, index) {memo = iterator(memo, value, index);});
return memo;
}
inGroupsOf=function (number, fillWith) {
fillWith = Object.isUndefined(fillWith) ? null : fillWith;
return this.eachSlice(number, function (slice) {while (slice.length < number) {slice.push(fillWith);}return slice;});
}
include=function (object) {
if (Object.isFunction(this.indexOf)) {
if (this.indexOf(object) != -1) {
return true;
}
}
var found = false;
this.each(function (value) {if (value == object) {found = true;throw $break;}});
return found;
}
grep=function (filter, iterator, context) {
iterator = iterator ? iterator.bind(context) : Prototype.K;
var results = [];
if (Object.isString(filter)) {
filter = new RegExp(filter);
}
this.each(function (value, index) {if (filter.match(value)) {results.push(iterator(value, index));}});
return results;
}
findAll=function (iterator, context) {
iterator = iterator.bind(context);
var results = [];
this.each(function (value, index) {if (iterator(value, index)) {results.push(value);}});
return results;
}
detect=function (iterator, context) {
iterator = iterator.bind(context);
var result;
this.each(function (value, index) {if (iterator(value, index)) {result = value;throw $break;}});
return result;
}
collect=function (iterator, context) {
iterator = iterator ? iterator.bind(context) : Prototype.K;
var results = [];
this.each(function (value, index) {results.push(iterator(value, index));});
return results;
}
any=function (iterator, context) {
iterator = iterator ? iterator.bind(context) : Prototype.K;
var result = false;
this.each(function (value, index) {if ((result = !!iterator(value, index))) {throw $break;}});
return result;
}
all=function (iterator, context) {
iterator = iterator ? iterator.bind(context) : Prototype.K;
var result = true;
this.each(function (value, index) {result = result && !!iterator(value, index);if (!result) {throw $break;}});
return result;
}
eachSlice=function (number, iterator, context) {
iterator = iterator ? iterator.bind(context) : Prototype.K;
var index = — number, slices = [], array = this.toArray();
while ((index += number) < array.length) {
slices.push(array.slice(index, index + number));
}
return slices.collect(iterator, context);
}
each=function (iterator, context) {
var index = 0;
iterator = iterator.bind(context);
try {
this._each(function (value) {iterator(value, index++);});
} catch (e) {
if (e != $break) {
throw e;
}
}
return this;
}
1=B
0=A
Кроме того это язык, основанный на прототипах. Т.е можно динамически расширить все объекты чем угодно - функциями или свойствами и они отобразатся во все порожденные из них. Не добавятся, а отобразятся по дереву (т.е будут только в одном месте, а не в каждом объекте своя копия).
Но massiv[1] и massiv[0] будут выдавать ровно те же значения как и раньше. Или надо for in ?
Цитата:
------------
Например пусть объект кролик "rabbit" наследует от объекта животное "animal".
Ссылка [[prototype]] работает так:
1. Любое запрошенное свойство ищется сначала в rabbit
2. Если свойство там не найдено, то оно ищется в rabbit.[[prototype]], т.е в animal
Благодаря поиску по прототипу получается, что все функции и переменные, которые были в animal, доступны и в rabbit.
------------
там есть поясняющие картинки
Что касается massiv.length - он хорошо работает только для массивов. Если же мы имеем хэш massiv={a:'A',b:'B'}, то здесь length начинает давать сбои при изменении числа элементов.
Нет ли какого-то способа очиститься от тлетворного влияния prototype.js прямо на уровне массивов?
Расширяем сперва стандартные Array и Object. Итерируемся обычным способом, видим тот мусор, что мы добавили. Проверяем hasOwnProperty (вернёт true, если свойство явно объявлено в объекте, а не в вышестоящем прототипе) и мусор исчезает.
Array.prototype.x = 5;
Object.prototype.y = 10;
var a = [5,6];
var b = {a:1,b:2};
document.write("Simple iteration: ");
for(var i in a) document.write("a["+i+"]="+a[i]+" ");
for(var i in b) document.write("b["+i+"]="+b[i]+" ");
document.write(" Using hasOwnProperty: ");
for(var i in a) if(a.hasOwnProperty(i)) document.write("a["+i+"]="+a[i]+" ");
for(var i in b) if(b.hasOwnProperty(i)) document.write("b["+i+"]="+b[i]+" ");
Как любая вещь, фреймворк фреймворку рознь. Бывают нормальные. Бывают уебищные. И херить целиком концепцию фреймворка из-за того, что попался один уебищный - это крайне странно.
Вообще, для фреймворков закон Старджона никто не отменял.
На практике это приводит к тому, что когда подобному деятелю поручают смастерить сумку на колесиках, он сразу покупает 4 горных велосипеда и начинает их крепить скотчем к ящику из ИКЕИ. Получившийся продукт оказывается дико громоздким, разваливающимся на ходу и абсолютно неудобным в использовании. Зато есть повод для гордости: не стал изобретать велосипед, взял готовый.
Хорошо написанные и документированные фреймворки при правильном применении позволяют существенно сэкономить время программиста без значительного увеличения требований.
Грубо говоря - есть один lleo, которые каждый раз ныряет в глубины тонкости обработки JS разными браузерами разных версий и в итоге выдает вылизанный и скоростной код. Можно ли кому-то другому пользоваться результатами его труда или каждому, желающему поднять блог надо писать блог с нуля? Если ответ будет "можно использовать труд lleo", то сразу возникает вопрос - почему нельзя использовать труд десятка таких lleo, которые написали фреймворк? Ситуации ведь абсолютно идентичные! Кому-то будет не нужно 90% кода и для него все рюшечки и завитки, которые составляют фишки движка будут "колесами от горного велосипеда". Значит ли это, что lleo написал гавно? Нет, это всего лишь значит, что для нужд данного конкретного пользователя подойдет более простой движок. Точно так же и с фреймворками.
Тут я нарочно опускаю вопрос фреймворков (и блогов), созданных с принципиальной ошибкой в архитектуре. Более того, применяя неправильный фреймворк для решения задач, на которые он не расчитан, можно легко получить оценку "фреймворк - гавно с ошибками в архитектуре и ДНК программистов".
И если бы кто-то не пожелал в свое время еще раз изобрести счеты, только более быстрые, то наш спор был бы невозможен за отсутствием предмета спора.
Но причем тут собственно JavaScript? Просто к слову пришлось? В общем виде описанный подход характерен практически для любого современного программного продукта. Изящным программным решением сегодня считается уничтожение мух атомными боеголовками.
Как ни полезна вещь,- цены не зная ей,
Невежда про нее свой толк все к худу клонит;
А ежели невежда познатней,
Так он ее еще и гонит.“
Все остальное я делаю с нуля или полностью переписываю под свои задачи своими руками.
Но не будете же вы советовать программисту писать с нуля сайт, который практически ничем не отличается от сотни аналогичных сайтов? Да еще и заказчик ориентируется не на "яйца ручной работы", а на "дешевую штамповку" - по ценам, естественно, и по скорости, а не по претензиям. В этом случае выбор "использовать готовые решения или нет" в принципе неуместен.
"А Леша хорошо устроился - и пожрет, и будет выглядеть высокоморальным человеком!"
То есть, мне понятна ваша точка зрения: я к вам не лезу, и вы меня не трогайте. Имеете право. Но имейте же смелость заявить: мой движок ни с чем не совместим, и клал я на ваше желание делать красиво. Ведь по факту это так. Вы просто явно это как одну из фич движка декларируйте, и в мире наступит покой.
Сам страшно не люблю новые зависимости в любом проекте, но подхожу к этому расчётливо: иногда выгода от новой библиотеки превышает минусы. Если же из килотонной библиотеки нужно реально 5% кода, то пусть она идёт лесом, сам напишу.
Нет, имя $ я не собираюсь задействовать - пугает оно меня, если честно. Так что пусть тем, кто захочет встраивать в движок jQuery, жизнь будет проще.
В хобби-проектах всё меня интересующее делаю с нуля, но там скорость разработки не важна, и приёмочное тестирование не запланировано на слудущую недел
Если не верите, просто попробуйте открыть пустую страницу с одним jQu*ry, загружаемым через google cdn - инициализируется он очень быстро, и в кеше уже наверняка есть =).
А вот что сделали вы в своей жизни, профессиональная пуля из недерьма? Киньте ссылку на ваши великие проекты.
Я извиняюсь, а судить о вкусе блюда можно только будучи профессиональным поваром с кучей мишленовских звезд - или все-таки достаточно его просто съесть? Вообще - судить о полезности чего-либо можно будучи только разработчиком этого чего-либо? Кстати, вы только что явно высказали взгляды, результатом которых являются те самые говнофреймворки и говноинтерфейсы. Ведь с полным осознанием собственной правоты (поскольку такие же взгляды демонстрирует хозяин журнала) сюда сейчас может прийти автор prototype и начать рассказывать, что ему, в отличии от lleo есть что показать: ферймворк, который отлично работает, служит ему и миллионам пользователей долгие годы и нередко является примером для передираний и заимствований. А вот что сделал lleo? Пусть он кинет ссылку на свои великие фреймворки. Ну или хотя бы на сравнимые по популярности проекты.
Эх, написал ответ, а ваш великолепный самописный фильтр подвис на слове j+Query (без знака +) и перестал как-нибудь реагировать. Замечательный пример, почему написанное Вами на досуге решение не такое уж и хорошее, как Вы утверждаете. А насчет быстродействия - может быть, Вы пользуетесь gmail? Там, наряду с другими фрейморками, используется и так нелюбимый Вами джейКвери. И быстродействие от этого не страдает, как ни удивительно :) Так что, дело не только и не столько в данном инструменте, а и в умении его применять.
Что касается gmail, вы будете потрясены, но я им не пользуюсь - он тоже достаточно неповоротлив. У меня свой email на ахе, который старше вашего Гугля года на 4, и он не тормозит и не подвисает.
Хорошие фреймворки позволяют включать/скачивать только то, что лично тебе надо. Т.е есть модули, плагины, подгрузка по требованию. Примерно как в этом движке "штука". Кстати, этот движек тоже в своем роде фреймворк - для модулей.
Самое главное что они дают - опыт, сохраненный в коде. Ни один человек не будет сам тестить свой скрипт в таком списке броузеров как у них:
* Firefox 2.0+
* Internet Explorer 6+
* Safari 3+
* Opera 9+
* Chrome 1+
Фреймворк ускоряет в первую очередь не работу программы. Он ускоряет разработку ПО. Да оно получается раздутое, но время программиста сейчас дороже железа. :)
Да и вообще зачем личное время тратить на обработку напильником, если в это время можно посмотреть кино, книгу почитать или еще чем полезным заняться.
Ну и сейчас авторы фреймворков все-таки думают что админ/програмер сайта понимает что делает. Т.е если он добавил фреймворк, то понимает к чему это приводит и как повлияет на остальное. Но.. очевидно это уже не так.
> Он ускоряет разработку ПО. Да оно получается раздутое,
> но время программиста сейчас дороже железа. :)
При чем тут стоимость железа? Говнокодеры воруют в первую очередь время пользователей. Чем популярнее их поделки, тем масштабнее кража. Тут суммы могут быть такие что говорить о стоимости времени программиста просто смешно.
> Ну и сейчас авторы фреймворков все-таки думают
> что админ/програмер сайта понимает что делает.
И очень зря - использование фреймворков - первый принак воли к безмыслию. :-)
Допиливать имеющиеся фреймворки — долго и противно, но на стадии прототипирования они могут сильно ускорить процесс.
Я не возьмусь рассуждать, какой из вас программист, хотя интерфейсник из вас, на мой вкус, достаточно посредственный, судя по интерфейсу блога, который достаточно очевиден, но требует тренированного зрения, некоторого привыкания, терпения к ужасному виду и оптимизма по поводу доброты внутри :)
Тем не менее, очевидно, что вы, в свою очередь, слегка перебарщиваете с возмущениями про фреймворки для JS.
Во-первых, есть задачи, которые требуют, чтобы было "красиво". То есть, "аяксненько", "прозрачненько", "анимированненько" и в таком духе "вебдванольненько". И частенько это получается неплохо по работоспособности, если быть готовым запускать это на "мощном и современном" компе с таким званием хотя бы 5-тилетней давности. И именно фреймворки делают разработку таких красивостей лёгкой и непринуждённой. Например, Яндекс jКвери использует вовсю. Да и многие другие известные ресурсы.
Во-вторых, иметь мозги нужно при использовании хоть "голого" JS, хоть фреймворка, хоть чёрта лысого. То есть, фреймворки надо использовать в меру и с умом - тогда они не будут сильно тормозить процесс и отжирать память.
В-третьих, фреймворки изначально почти полностью кроссбраузерны (за исключением некоторых редких багов) на тех версиях браузеров, которые поддерживают. А это - весьма серьёзный "компресс" против головной боли. И дополнительная возможность обойти некоторые грабли для новичков и просто тупых быдлокодеров.
В-четвёртых, ни в коем случае, по-моему, не надо кичиться собственными достижениями на ниве программирования на JS без фреймворков, т.к. это на данный момент больше смахивает на неприятие нового, чем на желание оптимизировать :) Лично я по своей основной работе вынужден обходиться без них в большинстве случаев, т.к. декларируемые технические требования проекта, который я разрабатываю, начинаются с IE 5.01, а мой любимый jКвери поддерживает минимум IE 6 (будь этот IE тыщу раз неладен...). И я всё пишу "голым" JS-ом. И не вижу в этом никакой крутизны, т.к. зачастую получается негибко (например, иногда бывает, что поменял структура DOM-а - поменял JS) и громоздко по коду, а значит - нечитабельно, что для команды разработчиков весьма плохо. Это можно обходить, но тогда получается ещё более громоздко и в разы дольше. А с jКвери всё проще, быстрее, более гибко и более понятно для стороннего человека при прочтении.
Так что, Леонид, вы зря не любите фреймворки. Очевидно, вы просто не умеете их готовить :)
И не важно, в чем проявляется попса: в музыке, в технике или в программировании.
Или как в анегдоте... Мнэ... Если цензурно: "Ем и плачу, ем и плачу..."
- ссылки "следующая/предыдущая заметка" мелким шрифтом затрудняют их понимание (привыкнуть быстро, найти с плохим зрением - не очень);
- на широком экране в большом разрешении длиннющие строчки основного текстового блока (да и комментариев) читать гораздо труднее, чем было бы, если б эта ширина была более-менее строго задана, скажем, в сантиметрах экрана хотя бы на ширину листа А4;
- микроскопическая ссылка "штука" над полем текста добавляемого комментария, возможно, и призвана быть не найденной, но если нет - она ещё больше ломает глаза, чем ссылки "предыдущая/следующая".
Можно ещё поискать и попридираться, но смысл, я думаю, понятен.
Я всё надеюсь, что вам как-нибудь придёт на досуге мысль сделать редизайн блога по избранным пожеланиям читателей :) Было бы интересно и полезно, ИМХО :)
Дизайн - не мое призвание, я никогда не занимался дизайном и не собираюсь копаться в CSS - это прекрасно сделают другие люди, когда я подниму binoniq и разрешу пользовательское редактирование стилей. А я, возможно, позаимствую тот стиль, который мне больше понравится.
:D
Кроме того, я обычно использую не ajax, а majax - свою надстройку, которая работает не с данными, а с управляющими кодами. А для этих задач существующая библиотека далеко не идеальна.
> ...когда я подниму binoniq и разрешу пользовательское редактирование стилей
А до этого момента блог в плюс-минус-нынешнем виде сколько уже просуществовал? Вот-вот. Долго :)
Я понял, что дизайн - не ваше призвание. Это видно :) Но ведь можно было бы давно попросить кого-нибудь квалифицированно помочь, например. Был бы у вас набор простых и совершенно базовых стилей, с которыми можно было бы уже самостоятельно творить почти всё, что угодно, и получалось бы более-менее симпатично. Потому что не хватает, в основном, именно их. А возлагать эту работу на пользователя - хорошо, но не все умеют, как это ни странно. И что ещё интереснее, не все и не всегда хотят :) Что-то симпатичное хорошо бы и по дефолту.
В общем, дизайн - дело личное. Раз я здесь, значит ничего катастрофического в нём уж точно нет, так ведь? :)
Однако фреймворки хаять так рьяно не стоит - они помогают в работе очень часто. Главное - правильное и своевременное применение. А оно зависит от приоритетов проекта. Если приоритет - быстродействие, то особо ими не разыграешься. Если - красота, то без них всё будет долго и мучительно
Еще раз говорю: я подниму публичный сервис, где каждый участник (не посетитель) сможет нарисовать тот стиль, который считает красивым и правильным. Вполне вероятно, что при этом среди потоков серости и убожеств (мало отличающихся от моих рамочек) родится что-то гениальное от какого-то профессионала. Я верю в людей.
Но моя задача - довести до ума движок, который позволит это делать, а не пытаться рвать задницу, чтобы самостоятельно нарисовать в своем блоге такие кнопочки, рамочки и рюшечки, которые я рисовать не умею в силу отсутствия дизайнерского таланта.
Вот FireFox - попса? При том что в России он обогнал по статистике использования всех остальных уже:
Даже банальные лестницы в виде ступенек и лифты - попса?
Вот пример альтернативы -
Это тогда не попса?
Лично я ориентируюсь на удобство для себя. При этом не важно популярная это вещь или нет. То же и с кино, музыкой.
Или тут дело в том что люди рекомендуют и хвалят? Не думаю что тот же молоток кто-то будет знакомым рекламировать - значит он не попса, хотя и очень популярен в быту :))
Но почему-то требуете, чтоб вам положили на стол строгий черно-белый алгоритм.
А компьютеры. то! Компьютеры совсем другие! И экраны цветные, и не трубочные, а на богопротивных кристаллах! И процессоры не Z80. И вообще - компьютеры, занимающие меньше комнаты - уже и не компьютеры!
Или вы считаете, что замена деревянной рамы на металлическую, а металлической на углепластиковую равно как и замена ламп на транзисторы, а транзисторы - на микросхемы - это уже "изобретние заново"?
Изобретение - да, заново - нет.
Кто сказал что изобретение это единственный квант времени в который рождается что-то новое? Это возобновляемый процесс.
А в применении к фреймворкам - если бы каждый программсит был озабочен изобретением или, если угодно, совершенствованием существующих фреймворков, их использование сократилось бы на порядки. Ведь для того что-бы что-то изобретать заново нужно разобраться в уже изобретенном, а если эта работа сделана сразу станет очевидным что для реализации необходимых функций фреймворк избыточен и нет никакого разумного повода тащить к себе "кучу сраных чемоданов с говном" (C) Леонид Каганов.
У меня создается ощущение, что вы не пользовались нормальными фреймворками. Для пользования нормальным фреймворком нужно достаточно прочитать документацию и разобраться до уровня API фреймворка. Любой другой подход сразу вызывает вопрос: вот, у вас в заголовке поста Windows IE стоит. Я понимаю, что поскольку вы - не пустобрех, то перед тем, как использовать IE и тем более - Windows - вы прочитали весь исходный код обоих продуктов и полностью разобрались как они работают? Или вы все-таки пустобрех и цена всем вашим словам - меньше копейки? Или вдруг включилось двоемыслие и при использовании фреймворка "разбираться нада", а при использовании абсолютно любого другого продукта - "разбираться нинада"?
Или может заберете свои слова насчет "разбираться в уже изобретенном для каждого чиха"?
Заранее разъясню логику, что бы не было вопросов. "Изобретение заново" подразумевает все-таки использование какого-то багажа или набора инструментов, изобретенных до вас. Иначе заново прийдется изобретать ВСЕ. Включая математику, письменность и речь. Или вам не приходит в голову, что вы в своей повседневной жизни пользуетесь миллионами "фреймверков", изобретенных до вас?
Кстати, мне непонятно, как "я буду/не буду модифицировать исходники" относится к "я не могу изучить исходники венды". Не можете - не пользуйтесь. Это ведь ваше кредо. "Тотальное изучение". Или - см. параграф 1.
И да, я по умолчанию считаю, что человек, не изучивший фреймворк "русский язык" туп и непригоден к писательству.
А человек, не изучивший математику -- нифига не математик.
Вот только я не ожидаю, что писатель досконально разбирается в интегралах по объему. А Вы? См. предложение №1 Вашего комментария.
Пойду лучше возьму с полки вашу книжку и почитаю.
Куда-то пропали кнопки ответа на нужный комментарий..
Фитча это или баг - не знаю.
Спасибо по словам "вкус"+"попса" все замечательно гуглится. Даже разложенное в строгий алгоритм. ;)
Тьма - это не антисвет, а отсутствие света. Или как-то так. И не может быть у человека вкуса сразу во всем. Уж слишком много времени это требует.
Фреймворк вовсе не является ненужной хернёй. Говорить, что фреймворки не нужны, значит примерно то же, что говорить, будто не нужен вообще никакой софт. Экстраполируем это громогласное заявление: хочешь написать заметку в бложик - не пользуйся текстовым редактором, даже простейшим - набей текст кодами в шестнадцатеричном редакторе! Или сначала напиши редактор сам!
Когда будешь сохранять полученный файл на диск, не пользуйся даже функциями операционной системы - сделай это через BIOS, записывай инфу на диск, обращаясь непосредственно к контроллёру харда, пользуясь не понятием файла, а дорожками, секторами, цилиндрами...
Не хочется? Ну тогда не вякай про ненужность фреймворков.
ПыСы: быдлокодеров ненавижу, но пейсателей, обсирающих то, в чём не разбираются, тоже отнюдь не уважаю...
> Интересная логика. Выходит, если я построил двухэтажный шестиместный велосипед-тандем на восьми колесах в форме автобуса - это я занимаюсь ерундой и продолжаю изобретать велосипед. А вот если отломал педали и цепь - вау, я гений, я изобрел новое: самокат.
У... как все запущено... Лео, вы же писатель и на мой взгляд и вкус - хороший писатель. Я не могу поверить, что вы не знаете о том, что аналогия призвана исключительн иллюстрировать мысль. Что расширять аналогии за проводящего - дело некрасивое. Тогда зачем ви троллите?
А касательно изобретательства - таки да, порождение новых сущностей может происходить как усложнением существующих, так и упрощением. Пример с педалями и цепью - намеренно доведен почти до абсурда с целью предельно четко продемонстрировать мысль. Или вы считаете, что изобретение нового путем упрощения принципиально невозможно? Такое мне слышать крайне странно. Впрочем, предположение об отсутствии у вас абстрактного мышления мне кажется еще более абсурдным. (с надеждой) Мы же все еще говорим о велосипедах и самокатах метафорически, да?
А насчет фреймворков у меня есть два комментария:
1. Я уверен, что вся операционная система и все ПО написано вами с нуля.
2. Я уверен. что весь компьютер, на котором вы работаете, собран вами с нуля. Начиная от добычи кремния и заканчивая свинчивением корпуса, включая всю цепочку нужных инструментов.
Иначе получается явное двоемыслие - использовать готовый продукт "фреймворк" - это моветон, а использовать готовый продукт "ОС" или "компьютер" - нормально. А мне не хочется думать, что вам свойственно двоемыслие.
Я так же, кстати, абсолютно уверен, что все молотки, пассатижи, паяльники, отвертки и прочие "фреймворки" ака инструменты у вас дома так же сделаны вашими руками с нуля - веть использовать готовые "фреймворки" это такое западло!
а то как представлю Леонида, переписывающего заново библиотеки работы с СУБД, изображениями, регулярными выражениями и прочими "поделками из ближайшей ИКЕИ" - так мы завершения проекта никогда не дождемся!
а хотелось бы.
Понятно, что рабочие библиотеки - это отвертки. Они выполняют свою задачу. В первую очередь - эффективно, во вторую - универсально (но не в ущерб). Переписать их - это еще уметь надо.
Фреймворки же - это швейцарские ножи. В первую очередь - универсально, во вторую - тормозно, потому что универсально.
При этом больше, чем двумя лезвиями, никто реально не пользуется, и те дико неудобны. Для небанальной и творческой работы просто-таки противопоказаны...
Библиотека - набор инструментов, каждый из которых оптимален, но выполняет одну задачу.
Фреймворк - абстракция, позволяющая вам не заморачиваться с инструментами библиотеки. Вы можете "просто" указать, что здесь должно быть сделано. В удобной для вас форме. То, чего стоит такая абстракция (особенно в языках, не оптимизирующих код до выполнения) и то, как она реализуется (в тех же языках) - и есть две из трех причин ненависти Леонида ;) Третья - как это используют кодеры 8(
То есть претензия не к идеологии библиотеки как таковой, а к идеологии фреймворка, как хуевой реализации идеологии библиотеки.
А кто начал разговор про изобретение велосипеда или собственную ОС - тупо не въехал в тему.
То есть на мой взгляд виноват разработчик библиотеки, а Леонид "попал", так как не от него зависит, использовать ее или нет. N'est-ce pas?
Может перед тем, как что-то использовать, нужно все-таки прочитать инструкцию?
Пусть такое будет сто тысяч пятьсот раз описано в документации, мое мнение не изменится - это говно.
А для переменных, как вы, надеюсь, понимаете, от смены системы счисления результат не изменяется. И 11(3) = 4(10) без каких либо дополнительных указаний.
Леонид, я надеюсь, вы понимаете, что фреймворки всё-таки сделаны для того, чтобы облегчить вам как программисту жизнь. В данном случае, prototype добавляет множество полезных функций, среди которых и нужное вам перечисление массива. Эти функции, вместе с прочим, заметно ускоряют разработку сложного вычислительного кода, поскольку JS в этом мягко скажем неудобен.
Я подозреваю, что prototype умирает именно потому, что заметно тормознее jQ и навешивает много непонятного для начинающих пользоваться фреймворком мусора.
Что касается фреймворков в целом, сравнение Adamos'а с универсальными швейцарскими ножами довольно удачно. Фреймворк - инструмент, который позволяет быстро, качественно и красиво сделать те вещи, для которых он предназначен. При грамотном использовании - см. например любую страницу любого проекта Яндекса (включая главную), он делает ровно то, что нужно, максимально быстро и удобно.
Последнее время нередко попадаются люди, не понимающие, как без фреймворка сделать простейшие вещи, из-за чего хорошо виден критерий хоть сколько-то думающего программиста - тот хоть раз в конкретной области написал свой велосипед. Безусловно, обилие в веб-дизайне людей, не знающих жизни вне фреймворков, приводит к обилию говнокода, но это не проблема фреймворков как таковых.
Всё это к тому, что вы никуда не денетесь, и тоже рано или поздно начнёте пользоваться крупным фреймворком. =) Ну или прекратите активно поддерживать свои проекты. Просто потому, что это реально удобно, и сильно уменьшает количество багов и ускоряет дебаг.
PS Что-то этот комментарий отправляется, однако при обновлении страницы не появляется. Это очередная бага движка?
Нет, не понимаю. Разумеется, они придуманы, чтобы облегчить жизнь. Но - жизнь среднего программиста, решающего типичные распространенные задачи.
Лично мне для моих задач фреймфорки не облегчают жизнь, а усложняют.
Но при этом я знаю, что кому-то и Windows облегчает жизнь, и Дима Билан, и "Лада-Калина" в кредит.
Леонид, при всём уважении к вам и уникальности вашего творчества, те задачи, которые вы решаете как программист, вполне типичны. Например, вам бы не помешало добавить для того же биноника аудио/видео html5+flash проигрыватель (важно для iPhone/iPad), или удобную галерею с листанием, или человеческий ajax-постинг комментариев (в смысле с обновлением при постинге и нормальном позиционировании нового комментария), или минималистичный wysiwyg-редактор с учётом местных особенностей. Всё это с соответствующими плагинами к Jq (или даже без них) делается за один длинный вечер, без особого увеличения загружаемого кода.
Кроме того, если быть честными, JsHttpRequest ничем не лучше ajax части фанатично нелюбимого вами jQ (а с учётом возможностей последнего, в разы хуже).
>Но при этом я знаю, что кому-то и Windows облегчает жизнь, и Дима Билан, и "Лада-Калина" в кредит.
Вы не поверите, но Windows и правда облегчает жизнь желающим без шаманства подключить дома любой МФУ/usb-модем/вай-фай модуль, желающим работать в конкретных программах, желающим запускать конкретную игру... Да что там, даже для простейшего foobar2000 не найти аналога по удобности, качеству и возможностям в *nix.
Машина в кредит (например, горячо любимый "планктоном" кредитный Форд Фокус) - очень хорошая возможность при разумных доходах купить автомобиль, только-только начав работать.
Да, это всё попса (включая фреймворки), но плоха она не сама по себе, а в контексте использования идиотами, или просто не по назначению. Даже вы пользуетесь всё тем же JsHttpRequest, дабы самому не изобретать велосипед, а потратить время на разработку с пользой.
Давайте всё-таки не переходить на демагогию. Рано или поздно вы всё равно начнёте пользоваться действительно удобными для вас фреймворками - в этом смысле прогресс неизбежен (тем более, что php сам по себе появился как "фреймворк" (вернее, шаблонизатор) на perl'е).
for in для массивов использовать не рекомендуется. И вообще, конструкцию for in надо уметь использовать. В частности, необходимо использовать propertyIsEnumerable() или hasOwnProperty(), потом что for in пробегается не только по свойствам объекта, но и по прототипу объекта. Апрототип объекта особенно в случае с массивами может быть расширен для улучшения/увеличения функциональности.
Почитал сайт того самого фреймворка - они очень извиняются что не могут спрятать то, что добавили от глаз for in тем же способом как спрятано arr.length и arr.prototype.
И описывают другие способы работы с массивами, ссылаясь также на стандарты.
всего комментариев: 105