JS и его "недостатки"
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.123] |
|
|
Правила раздела:
| Страницы: (66) « Первая ... 28 29 [30] 31 32 ... 65 66 ( Перейти к последнему сообщению ) |
JS и его "недостатки"
|
Сообщ.
#436
,
|
|
|
|
Цитата Астарот @ Ну, что ошибочного в коде, если вызывается a(1) вместо a() и при этом ненужный параметр отбрасывается и ни на что больше не влияет? А как в определении функции указать, какие параметры нужные, а какие - нет? |
|
Сообщ.
#437
,
|
|
|
|
Цитата Астарот @ Ага, только сейчас я понял что ты говоришь фактически "у нас есть ОГО-ГО какая удобная штука, а у вас она точно такая же, но уже плохая" ![]() Да не об этой штуке речь, а о том, что в обычной ситуации нужно проверять аргументы, а для "этой штуки" есть отдельный механизм. Цитата Указал два аргумента - принял два. Как я принял два, если клиент отравил 3 или 1? Цитата А что делать если ей ПОФИГ как ее вызывают? Покажи мне такую функцию. |
|
Сообщ.
#438
,
|
|
|
|
Цитата Мяут-Настоящий @ А как в определении функции указать, какие параметры нужные, а какие - нет? Ты настолько суров, что при объявлении функции задаешь не только нужные тебе параметры, но и не нужные, которые отдельно помечаешь, как не нужные? ![]() Цитата D_KEY @ Либо я тебя не понимаю, либо ты меня Да не об этой штуке речь, а о том, что в обычной ситуации нужно проверять аргументы, а для "этой штуки" есть отдельный механизм. Цитата D_KEY @ Как я принял два, если клиент отравил 3 или 1? Да так! Ты не забыл еще о том, что в js переменный инициируются в 'undefined'? Если ты передал функции параметров меньше, чем ждет реализация, то не переданные у тебя будут не определены, ты сможешь это отловить и поступить соответственно - не только выдать ошибку, но и реализовать логику. Цитата D_KEY @ Покажи мне такую функцию. Любой функции в js ПОФИГ с каким количеством параметров ты ее вызываешь. По факту - пофиг. Правильно ее вызвали или нет отлавливается на этапе исполнения, а не на этапе вызова, что дает большую гибкость. Почему нужно столько копий сломать что бы такую простую вещь объяснить? |
|
Сообщ.
#439
,
|
|
|
|
Цитата Астарот @ Ты настолько суров, что при объявлении функции задаешь не только нужные тебе параметры, но и не нужные, которые отдельно помечаешь, как не нужные? ![]() Для них можно задать значения по-умолчанию. Это обычно даже более удобно, чем конструкция с проверкой налиичия того или иного значения. Цитата Астарот @ Правильно ее вызвали или нет отлавливается на этапе исполнения, а не на этапе вызова, что дает большую гибкость. И порождает кучу возможных ошибок, например вот здесь: получается валидный вызов function(true); Добавлено Цитата Астарот @ Если ты передал функции параметров меньше, чем ждет реализация, то не переданные у тебя будут не определены, ты сможешь это отловить и поступить соответственно - не только выдать ошибку, но и реализовать логику. Вопрос в том, почему нельзя переложить эти проверки на плечи разработчиков языка |
|
Сообщ.
#440
,
|
|
|
|
Цитата Мяут-Настоящий @ Для них можно задать значения по-умолчанию. Это обычно даже более удобно, чем конструкция с проверкой налиичия того или иного значения. Блин, да ты гений! Кто б мог подумать, что так можно. ![]() ![]() function f( a, b) { var a = a || 10 ,b = b || 100 ; return a+b; } ![]() ![]() alert( f(1,1) ); // 2 аlert( f(1) ); // 101 alert( f() ); // 110 Цитата Мяут-Настоящий @ И порождает кучу возможных ошибок, например вот здесь: Не вижу ошибок пока. Где? |
|
Сообщ.
#441
,
|
|
|
|
Цитата Астарот @ Цитата Мяут-Настоящий @ А как в определении функции указать, какие параметры нужные, а какие - нет? Ты настолько суров, что при объявлении функции задаешь не только нужные тебе параметры, но и не нужные, которые отдельно помечаешь, как не нужные? ![]() А разве вы в js не этим занимаетесь? Ведь у вас можно вызвать функцию, ожидающую два аргумента, хотя с одним параметром, хоть со 100500, хоть вообще без... Цитата Да так! Ты не забыл еще о том, что в js переменный инициируются в 'undefined'? Если ты передал функции параметров меньше, чем ждет реализация, то не переданные у тебя будут не определены, ты сможешь это отловить и поступить соответственно - не только выдать ошибку, но и реализовать логику. Я помню. Я как раз пытаюсь подвести тебя к мысли, что в js один костыль другой подпирает Только у меня не получается Покажи пример что ли на "реализовать логику"... Цитата на этапе исполнения, а не на этапе вызова Что? |
|
Сообщ.
#442
,
|
|
|
|
Цитата Мяут-Настоящий @ Вопрос в том, почему нельзя переложить эти проверки на плечи разработчиков языка ![]() Какие ЭТИ проверки? Разработчики языка должны за меня решить какие проверки мне нужны? Не, я понимаю, что за вас решили, что никаких проверок вам не надо вообще, проще кинуть ошибку в случае чего, вы привыкли и довольны, но я-то почему должен? Мне, знаете ли, нравится возможность работать в одной функции с тем числом параметров с каким мне удобно, и не парить мозг тем, что кто-то может вызвать функцию не правильно - в этом случае я ему об этом сообщу не на основании жестко прибитого гвоздями правила вызова, а на основании логики исполнения моего кода, и в том виде в котором я хочу. Кто тут жаловался на "я не просил, а оно сделало"? |
|
Сообщ.
#443
,
|
|
|
|
Цитата Астарот @ Кто б мог подумать, что так можно. Ну так запись ![]() ![]() def f(a = 10, b = 20): return a + b Всяко короче. Цитата Астарот @ Мявут, а мявут, ты уже скажи чем на практике плохо отбрасывание лишних аргументов, и как боротся за обратную совместимость? Только ты по делу говори, а не общими словами Сможешь? Ну вот смотри - есть три программиста: Вася, который отвечает за низкоуровневую составляющую библиотеки графических компонентов, Петя - за высокоуровневую, и Мяут который эту самую библиотеку использует. У Васи в библиотеке есть функция drawRectangle(Text, Color), и тут он решает ее переписать, разделив ее на две: drawRectangle(Color), drawText(Text). Ессно у Пети, который написал функцию createButton, использующую drawRectangle библиотека ошибок не выдаст. Как Мяуту догадаться, почему кнопки из синих в белые превратились - ошибок компиляции/выполнения-то нет. Добавлено Цитата Астарот @ в этом случае я ему об этом сообщу не на основании жестко прибитого гвоздями правила вызова, а на основании логики исполнения моего кода, и в том виде в котором я хочу. Кто тут жаловался на "я не просил, а оно сделало"? Астя, так ты и так задаешь сам правила вызова на основании логики исполнения твоего кода, указывая какие аргументы должны быть переданы функции. |
|
Сообщ.
#444
,
|
|
|
|
Цитата D_KEY @ Я помню. Я как раз пытаюсь подвести тебя к мысли, что в js один костыль другой подпирает Для этого нужно обосновать что инициализация в undefined есть костыль хотя бы ![]() Цитата D_KEY @ Покажи пример что ли на "реализовать логику"... Ну, ёк-макарёк! ![]() function f( currentTime ) { если currentTime задан - делаем так-то и так-то если currentTime не задан, т.е. вызов был вида f(), то реализовываем логику вычисления currentTime к примеру так: currentTime = getSystemTime(); это уже посложнее, чем значение по умолчанию, а? ![]() или если currentTime не задан, то вызвать x() } Добавлено Цитата Мяут-Настоящий @ Ну вот смотри - есть три программиста: Вася, который отвечает за низкоуровневую составляющую библиотеки графических компонентов, Петя - за высокоуровневую, и Мяут который эту самую библиотеку использует. У Васи в библиотеке есть функция drawRectangle(Text, Color), и тут он решает ее переписать, разделив ее на две: drawRectangle(Color), drawText(Text). Ессно у Пети, который написал функцию createButton, использующую drawRectangle библиотека ошибок не выдаст. Как Мяуту догадаться, почему кнопки из синих в белые превратились - ошибок компиляции/выполнения-то нет. Смешалось все в кучу - люди, кони... Я тебе так скажу - если Мяут узнает о подобных демаршах Васи только по возникновению ошибок компиляции, то Мяуту надо валить подальше от такого Васи. Хотя если Мяут считает это нормальным, то как раз рядом с Васей ему и место |
|
Сообщ.
#445
,
|
|
|
|
Цитата Астарот @ Я тебе так скажу - если Мяут узнает о подобных демаршах Васи только по возникновению ошибок компиляции, то Мяуту надо валить подальше от такого Васи. Хотя если Мяут считает это нормальным, то как раз рядом с Васей ему и место ![]() В крупных проектах так и есть. Я Illumos (форк OpenSolaris) уже неделю как собираю |
|
Сообщ.
#446
,
|
|
|
|
Цитата Мяут-Настоящий @ В крупных проектах так и есть. OMFG Надеюсь никогда не буду иметь отношения к подобным крупным проектам... Добавлено Цитата Мяут-Настоящий @ Я Illumos (форк OpenSolaris) уже неделю как собираю ![]() Вот пока ты собираешь с грудами ошибок компиляции веб-сообщество переходит на свежие версии jQuery без задних мыслей - просто подключая динамически, например с гугла, и что-то пока я не слышал ни разу воплей "Ааааа, в новой версии все поломалось!" Удивительно, да? И как это мифические проблемы о которых вы тут хором рассказывали не лезут косяками? |
|
Сообщ.
#447
,
|
|
|
|
Цитата Астарот @ Цитата D_KEY @ Я помню. Я как раз пытаюсь подвести тебя к мысли, что в js один костыль другой подпирает Для этого нужно обосновать что инициализация в undefined есть костыль хотя бы ![]() В данном конкретном случае, интерпретатор почему-то позволяет вызывать функцию с неправильным набором аргументов, заменяя неуказанные аргументы этим самым undefined и пропуская лишние. Ты почему-то считаешь, что это нормально. Сильно подозреваю, что нужных слов для объяснения найти не смогу Попробуй пописать с учетом обоих подходов, может тогда поймешь сам Кстати, если мне очень будет нужно, думаю я на питоне смогу написать декоратор, который будет вести себя так же, как и js. Т.е. можно будет написать: ![]() ![]() @js_like def f(x, y): return x + y Лишние аргументы будем пропускать, а неуказанные инициализировать None(аналог null). И вызывать как угодно. Вот только это совершенно не нужно... |
|
Сообщ.
#448
,
|
|
|
|
Цитата Астарот @ Вот пока ты собираешь с грудами ошибок компиляции веб-сообщество переходит на свежие версии jQuery без задних мыслей - просто подключая динамически, например с гугла, и что-то пока я не слышал ни разу воплей "Ааааа, в новой версии все поломалось!" А этого бага не существует: http://bugs.jquery.com/ticket/11119 |
|
Сообщ.
#449
,
|
|
|
|
Цитата Астарот @ Ну, ёк-макарёк! ![]() function f( currentTime ) { если currentTime задан - делаем так-то и так-то если currentTime не задан, т.е. вызов был вида f(), то реализовываем логику вычисления currentTime к примеру так: currentTime = getSystemTime(); это уже посложнее, чем значение по умолчанию, а? ![]() или если currentTime не задан, то вызвать x() } В этом случае, если значение по умолчанию в языке таких выкрутасов не позволяют, то можно задать значением по умолчанию null, а в теле функции проверить и если null, то выполнить нужные действия. Т.е. опять имеем полный аналог, только без глупостей и неочевидный "неявностей" |
|
Сообщ.
#450
,
|
|
|
|
Ещё доставляет смех сквозь слёзы - есть литералы true, false, null, но нет undefined. Поэтому всякий может написать
![]() ![]() undefined = {} Но ничего, подпорка ![]() ![]() if(typeof o == 'undefined') держит |