LINUX.ORG.RU

Юзкейсы для with

 


1

2

Вместо вот этого недоразумения

;(function(){
  var value = 0
  increment = function(){value++}
  decrement = function(){value--}
  show = function(){console.log(value)}
})()

можно написать более изящно

with({ value: 0 }){
  increment = function(){value++}
  decrement = function(){value--}
  show = function(){console.log(value)}
}

А вместо bind, которого, в свое время так долго вожделели некоторые, можно написать

o = {a: 1}

f1 = function(){console.log(this.a)}.bind(o)
with(o) f2 = function(){console.log(a)}

то есть, этот вожделенный bind, фактически вообще не нужен в JS.

Хочу заметить, что во всех перечисленных случаях, использование with никак не сказывается на производительности, поскольку, существует только на момент опрделения.

Вообще, with — очень мощная, гибкая конструкция, естественная для семантики JS, органичная для него.

Предлагаю в этом треде постить всевозможные кейзы для with, это интересно, думаю, будет для многих, и познавательно.

анонiмус, сколько можно упарываться?

anonymous
()

Ты же лопнешь.

никак не сказывается на производительности, поскольку, существует только на момент опрделения.

4.2

bind, фактически вообще не нужен в JS.

4.2

всевозможные кейзы для with

Он один: job security

x3al ★★★★★
()
Ответ на: комментарий от anonymous

кстати, да, определенно

with(document.querySelector("canvas").getContext("2d")){
  beginPath()
  arc(150, 75, 50, 0, 2 * Math.PI, false)
  fillStyle="red"
  fill() 
  strokeStyle="black"
  stroke()
}

newquestion
() автор топика
Ответ на: комментарий от newquestion

ну, покажи, где без него нельзя обойтись

Ты когда-нибудь слышал про каррирование?

А это что такое?

Способ сохранить своё рабочее место при помощи кода, от которого любой нормальный программер сбежит. Например, для JS это будет игнорирование стайлгайдов (отказ от ; хотя бы), использование deprecated-техник вроде with, отказ от strict mode, костыляние с прототипным наследованием, изменение прототипов native-типов на каждый чих (которое тоже неслабо влияет на производительность) и подобное.

Впрочем, я без понятия, зачем это делаешь ты — ты ж не кодер.

x3al ★★★★★
()
Ответ на: комментарий от x3al

И да, http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/

зачем это делаешь

Вот, в частности, чтобы не быть таким дебилом, как этот автор. назначение with не только, и не столько в банальном сокращении имен. Он объединяет контексты, создает окружения, в том числе анонимные. Он похож на замыкания чем то, но на порядок мощней. Это отличный инструмент.

newquestion
() автор топика
Ответ на: комментарий от newquestion

Ты понимаешь, что это серьёзно усложняет чтение кода человеком?

В твоём же примере нельзя однозначно сказать, являются ли свойствами объекта или нет следующие вещи:

  • Math.PI
  • false
  • fillStyle (если нет — это может оказаться глобальной переменной. Потому, что strict mode отключен).
  • strokeStyle (аналогично)
x3al ★★★★★
()
Ответ на: комментарий от x3al

нельзя однозначно сказать, являются ли свойствами объекта

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

В данном случае, это легко определяемо, безо всяких проверок, поскольку разработчик обычно знает интерфейс встроенных объектов.

newquestion
() автор топика
Ответ на: комментарий от newquestion

В данном случае, это легко определяемо, безо всяких проверок, поскольку разработчик обычно знает интерфейс встроенных объектов.

который может быть разным в разных браузерах и (СЮРПРИЗ) меняется с выходом новых версий.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Кстати, я так и не понял, зачем автор по твоей ссылке костылит частичное применение байнндом, тогда как это и так работает, причем вполне очевидным образом в отличии от

list = function(){
  var args = [].slice.call(arguments)
  return function(){ return args.concat([].slice.call(arguments))}
}

Вот после таких сомнительных вещей, ходят по лору аналитеги, и вещают про то, что JS — это набор костылей и неочевидных хаков. А причина была, как говориться, не в бобине, просто д*б сидел в кабине.

newquestion
() автор топика
Ответ на: комментарий от x3al

Кстати, само по себе частичное применение — дурацкий запутанный способ написать

with({arr1: [1,2,3]}) partial = function(arr2){return arr1.concat(arr2)}
//или даже
with([1,2,3]) partial = function(arr2){return concat(arr2)}
пришедший из языков без объектов, где объекты принято велосипедить. В полноценном то языке это зачем?

newquestion
() автор топика
Ответ на: комментарий от x3al

зачем нужен partial?

Конкретно там он использует его чтобы вернуть функцию с массивом. и чо?

newquestion
() автор топика
Ответ на: комментарий от hateyoufeel

В изначальном треде речь шла не о круге, а о реализации интрфейса для рисования кругов. Это кто-то пошутил, а потом попугаи подхватили. А чтобы осилить круг, открываешь гугл, вбиваешь туда «круг на канвас», пастишь оттуда код, и *осиливаешь*

newquestion
() автор топика
Ответ на: комментарий от x3al

Я знаю, что это звучит необычно, потому что все зомбированы странной идеей, что ФП — мощная парадигма, и все что оттуда идет — мощные техники программирования. На самом деле, это мифы, безусловно.

И то что я написал — соответствует действительности.

newquestion
() автор топика
Ответ на: комментарий от newquestion

На самом деле, это мифы, безусловно.

Ну всё, anonimous всех переиграл и всё опроверг.

hateyoufeel ★★★★★
()
Ответ на: комментарий от x3al

Это почти всего касается. Тот же Y-комбинатор — чрезжопный избыточный способ выразить рекурсию.

newquestion
() автор топика
Ответ на: комментарий от x3al

Я ее написал, ты просто хреново смотришь

partial = function(){
  var arr = [].slice.call(arguments)
  return function(){
    return arr.concat([].slice.call(arguments))
  }
}

part = partial(1,2,3)
console.log(part(4,5,6)) // [ 1, 2, 3, 4, 5, 6 ]

newquestion
() автор топика
Ответ на: комментарий от x3al

Причем, что интересно, это, опять же, чрезжопный способ для банального[1,2,3].concat([4,5,6]), по сути то, то же самое. Но так не круто, не по хипстерски:(

newquestion
() автор топика
Ответ на: комментарий от newquestion

[].slice.call

Это что б пустой объект просто так на каждый чих создавать, вместо того, чтобы писать Array.prototype.slice? :}

Deleted
()
Ответ на: комментарий от x3al

В этом, кстати, очень сильно заметно одно из основных отличий ООП от псевдоооп и фп. Когда у нас есть сообщения, мы можем строить бесконечные цепочки, расширять объекты, не меняя реализацию


neObject(foo).newObject(bar).newObject(baz)

А в твоих хипстерских поделиях, на каждый чих в реализацию залезать приходится.

newquestion
() автор топика
Ответ на: комментарий от Deleted

Неважно. Я так не пишу в реальном коде. но ты мимо не прошел, молодец, съешь пирожок.

Вообще, если часто используется, не нужно писать все время Array.prototype.call, прост создай ссылку на этот объект

newquestion
() автор топика
Ответ на: комментарий от newquestion

Так ты реального кода и не пишешь :}

Deleted
()
Ответ на: комментарий от newquestion

бесконечные цепочки, расширять объекты, не меняя реализацию

chain vs compose, лол. И, что характерно, compose — мощнее.

x3al ★★★★★
()

может лучше when? Да и вообще «маттерн патчинг» ?

... with вроде как паскалевская шняга, считается моветон в определенных кругах ...

anonymous
()
Ответ на: комментарий от x3al

ну, значит, ты не понимаешь, что такое частичное применение.

newquestion
() автор топика
Ответ на: комментарий от x3al

И, что характерно, compose — мощнее

Под мощностью тут видимо понимается обилие скобок, вложенностей, запутанность, многословность, неуклюжесть, etc. С этой точки зрения, да, *мощней*

newquestion
() автор топика
Ответ на: комментарий от anonymous

with вроде как паскалевская шняга, считается моветон в определенных кругах ...

В паскале совершенно другой with. With, он в каждом языке свой.

newquestion
() автор топика
Ответ на: комментарий от newquestion

Под мощностью тут видимо понимается обилие скобок, вложенностей, запутанность, многословность, неуклюжесть, etc. С этой точки зрения, да, *мощней*

compose работает даже если методы не возвращают объект. Твой пример — только если методы в курсе.

ну, значит, ты не понимаешь, что такое частичное применение.

Твой «пример» — обычное замыкание, а не частичное применение. Фича партиалов — в том, что функция не обязана знать об их наличии. Впрочем, ты ж Ъ ООП-кодер, который не в курсе, что JS не умеет в сообщения объектам как и любой применяемый на практике ООП-язык кроме... erlang если его считать ООП, но что с тебя взять.

x3al ★★★★★
()
Ответ на: комментарий от newquestion

В изначальном треде речь шла не о круге

ни3.14зди. в изначальном треде шла речь о модели вселенной с гравитацией и физическими законами, ты сказал, что за вечер такое осилишь и вообще такие задания не для реальных посанов, но потом съехал, тебя попросили хотя б интерфейс круга, а потом, хотя б, просто круг.

Анонинмус все помнит...

anonymous
()
Ответ на: комментарий от x3al

Твой пример — только если методы в курсе.

не обязательно, есть apply

вот на этом простом примере уже видно, почему композиция сливает

compose = function(f1, f2, data){return f1(f2(data))}

sum = function(x){return x + x}
mul = function(x){return x * x}

compose(sum, mul, 3)
пока вроде все нормально, но допустим, нам нужен факториал получившегося числа. Нам придется тогда либо лепить его к тому что есть, либо переписывать compose
fact(compose(sum, mul, 3))
//далее, преобразовать тип и передать в другую функцию

another(String(compose(sum, mul, 3)))
//уже запахло п*цом
//но это еще цветочки. Если арность не соответствует, переписываем compose, уже без вариантов
// в объектном стиле, например на io

3 mul sum asString another

//изменить арность? запросто.

3 mul(4) sum(2) asString another

// разную арность? без проблем

3 mul sum(4) asString ahother

// присвоить переменной

a := 3 mul sum(4) asString ahother

//присвоить только если есть все слоты, иначе nil, цепочку рвем

a := 3 ?mul ?sum(4) ?asString ?ahother

// применить несуществующий метод

another call(3 mul sum(4) asString)

Я жуе молчу о том чтобы унаследовать, создать экземпляр на ходу, и тп. Практически, процентов 99 из того что могут сообщения, композици не может. Плюс выглядит это все как размазанное по экрану скобчатое говно

newquestion
() автор топика
Ответ на: комментарий от newquestion

compose = function(f1, f2, data){return f1(f2(data))}

Это не compose. http://ramdajs.com/0.17/docs/#compose это compose. http://devdocs.io/lodash/index#flowRight это тоже compose.

в объектном стиле

Лол.

3 mul sum asString another

Будет точно так же, но без аргумента, т.е. без 3 — тогда можно будет говорить. Но это будет... compose.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Это не compose

Что то у тебя то не это а это не то. Для начала ознакомься с понятием частичное применение

В компьютерных науках, частичное применение (или частичное применением функции) — процесс фиксации части аргументов функции, который создает другую функцию, меньшей арности

и далее по тексту. Затем перейдем к композиции

Будет точно так же, но без аргумента

Да, в простейшем случае будет точно также + куча скобок. В других случаях будт нетривиально, в каких то невозможно.

newquestion
() автор топика
Ответ на: комментарий от x3al

Основная проблема частичного применения, и основное его отличие в том, что это по сути дела, чистая специализация. А объекты умеют как в специализацию, так и в расширение. Отсюба идет и неулюжесть твоего стиля.

newquestion
() автор топика
Ответ на: комментарий от x3al

Это, в общем то, та же проблема, что и у класс-ориентированного программирования. Частичное применение — это по сути, классовое ооп без сахара.

newquestion
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.