55+ в ИТ

User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 12785
Joined: 27 Sep 2007 22:53

Re: 55+ в ИТ

Post by Мальчик-Одуванчик »

АццкоМото wrote: 08 Oct 2018 23:05
valchkou wrote: 08 Oct 2018 21:24

Code: Select all

	
	boolean isItemInCart(Item item) {
	    return cart.getItems().contains(item);
	}
Ну вот да, хотя бы как-то так. Даже полученное с сервера в виде массива сохранить во что-то отличное от массива/ArrayList почему-то большинству в голову не приходит

Хотя на самом деле куда интереснее, когда нужно, например, посчитать общую стоимость айтемов в карте в предположении, что их может быть чуть больше 100500 миллионов.
Ну да, а потом какой-нибудь умник ради одноразовой операции преобразует массив в неупорядоченную таблицу якобы для ускорения поиска.
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: 55+ в ИТ

Post by АццкоМото »

Мальчик-Одуванчик wrote: 08 Oct 2018 23:14
АццкоМото wrote: 08 Oct 2018 23:06
Мальчик-Одуванчик wrote: 08 Oct 2018 21:48 cart.getItems() - переливаем из пустого в порожнее?
Сборщик мусора все стерпит.
а в чем проблема-то?
Ну когда одно говно превращается в точно такое же, но с вишенкой сверху то это явно проблемма дизайна структуры данных.
И на мой взгляд это явный косяк: чтобы узнать свойство обьекта преобразовывать его к обьекту другого типа.
Не знаю, о чем речь. Во первых, корзина может содержать много чего, кроме спейска товаров. Ну, допустим, айди магазина. Во-вторых, не понятно при чем тут сборщик мусора. getItems() же возвращает ссылку на коллекцию. Никакие новые абекты не создаются (ну, если, конечно, реализовывал не идиот)
Мат на форуме запрещен, блдж!
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: 55+ в ИТ

Post by АццкоМото »

Мальчик-Одуванчик wrote: 08 Oct 2018 23:26
АццкоМото wrote: 08 Oct 2018 23:05
valchkou wrote: 08 Oct 2018 21:24

Code: Select all

	
	boolean isItemInCart(Item item) {
	    return cart.getItems().contains(item);
	}
Ну вот да, хотя бы как-то так. Даже полученное с сервера в виде массива сохранить во что-то отличное от массива/ArrayList почему-то большинству в голову не приходит

Хотя на самом деле куда интереснее, когда нужно, например, посчитать общую стоимость айтемов в карте в предположении, что их может быть чуть больше 100500 миллионов.
Ну да, а потом какой-нибудь умник ради одноразовой операции преобразует массив в неупорядоченную таблицу якобы для ускорения поиска.
В общем случае не вижу ничего предосудительного.
Мат на форуме запрещен, блдж!
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 12785
Joined: 27 Sep 2007 22:53

Re: 55+ в ИТ

Post by Мальчик-Одуванчик »

АццкоМото wrote: 08 Oct 2018 23:05 ИЧСХ даже тривиальное решение типа "а зачем считать при необходимости, можно же счетчик менять, когда добавляем/удаляем" тоже мало кто даст
Что налагает более жесткие требования устойчивости к исключениям для методов корзины.
Ведь так легко сделать данные несогласовынными если исключение вылетело между операцией изменения корзины и обновлением счетчика.
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 12785
Joined: 27 Sep 2007 22:53

Re: 55+ в ИТ

Post by Мальчик-Одуванчик »

АццкоМото wrote: 08 Oct 2018 23:27 getItems() же возвращает ссылку на коллекцию.
Тут я честно не понял. Разве getItems() не создает эту саму коллекцию, то есть новую структуру данных, отличающуюся от cart?
User avatar
valchkou
Уже с Приветом
Posts: 3721
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: 55+ в ИТ

Post by valchkou »

АццкоМото wrote: 08 Oct 2018 23:05 Хотя на самом деле куда интереснее, когда нужно, например, посчитать общую стоимость айтемов в карте в предположении, что их может быть чуть больше 100500 миллионов. Тоже вроде бы не бином ньютона, а мало кто напишет эффективно.
согласен что интереснее, но не согласен что не бином.
добавим сюда вполне ожидаемые требования по high availability, scalability, latency и задача сразу превращается в нетривиальный проект.
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 12785
Joined: 27 Sep 2007 22:53

Re: 55+ в ИТ

Post by Мальчик-Одуванчик »

АццкоМото wrote: 08 Oct 2018 23:29
Мальчик-Одуванчик wrote: 08 Oct 2018 23:26
АццкоМото wrote: 08 Oct 2018 23:05
valchkou wrote: 08 Oct 2018 21:24

Code: Select all

	
	boolean isItemInCart(Item item) {
	    return cart.getItems().contains(item);
	}
Ну вот да, хотя бы как-то так. Даже полученное с сервера в виде массива сохранить во что-то отличное от массива/ArrayList почему-то большинству в голову не приходит

Хотя на самом деле куда интереснее, когда нужно, например, посчитать общую стоимость айтемов в карте в предположении, что их может быть чуть больше 100500 миллионов.
Ну да, а потом какой-нибудь умник ради одноразовой операции преобразует массив в неупорядоченную таблицу якобы для ускорения поиска.
В общем случае не вижу ничего предосудительного.
В случае если результат этого преобразования больше нигде не используется, то накладные расходы на создание новой одноразовой структуры данных чаще всего окажутся больше тупого линейного поиска, что и будет типичным переливанием из пустого в порожнее.
В этом действительно нет ничего предосудительного, сборщик мусора и не такое стерпит.
User avatar
valchkou
Уже с Приветом
Posts: 3721
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: 55+ в ИТ

Post by valchkou »

Мальчик-Одуванчик wrote: 08 Oct 2018 23:45
АццкоМото wrote: 08 Oct 2018 23:29
Мальчик-Одуванчик wrote: 08 Oct 2018 23:26
АццкоМото wrote: 08 Oct 2018 23:05
valchkou wrote: 08 Oct 2018 21:24

Code: Select all

	
	boolean isItemInCart(Item item) {
	    return cart.getItems().contains(item);
	}
Ну вот да, хотя бы как-то так. Даже полученное с сервера в виде массива сохранить во что-то отличное от массива/ArrayList почему-то большинству в голову не приходит

Хотя на самом деле куда интереснее, когда нужно, например, посчитать общую стоимость айтемов в карте в предположении, что их может быть чуть больше 100500 миллионов.
Ну да, а потом какой-нибудь умник ради одноразовой операции преобразует массив в неупорядоченную таблицу якобы для ускорения поиска.
В общем случае не вижу ничего предосудительного.
В случае если результат этого преобразования больше нигде не используется, то накладные расходы на создание новой структуры данных чаще всего окажутся больше тупого линейного поиска, что и будет типичным переливанием из пустого в порожнее.
мы видим задачу по разному, в данном примере я предположил что
cart.getItems() не создает никаких коллекций, а попросту возвращает референс на коллекцию спрятанную внутри объекта cart.
причем имплементация коллекции может быть как массивом так и hash based structure.
но нам по барабану потому как они все имплементируют метод contains().

с другой стороны такой подход не надежен, потому как можно подменить содержимое cart не используя никаких add or set методов.
или даже словить concurrent ex если допустить что один поток пишет а другой ищет
User avatar
Komissar
Уже с Приветом
Posts: 56969
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: 55+ в ИТ

Post by Komissar »

народ, неужели сборщики мусора по-прежнему куются вручную?!
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 12785
Joined: 27 Sep 2007 22:53

Re: 55+ в ИТ

Post by Мальчик-Одуванчик »

valchkou wrote: 08 Oct 2018 23:54 мы видим задачу по разному, в данном примере я предположил что
cart.getItems() не создает никаких коллекций, а попросту возвращает референс на коллекцию спрятанную внутри объекта cart.
причем имплементация коллекции может быть как массивом так и hash based structure.
но нам по барабану потому как они все имплементируют метод contains().
Тогда предположим дальше что самописный метод getItem(i) не выкидывает исключений, что нельзя сказать про метод contains.
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 12785
Joined: 27 Sep 2007 22:53

Re: 55+ в ИТ

Post by Мальчик-Одуванчик »

Komissar wrote: 09 Oct 2018 00:18 народ, неужели сборщики мусора по-прежнему куются вручную?!
Да, так же как и аллокаторы для определенных типов данных. Не так давно на Хабре хороший пример на эту тему приводился.
User avatar
Komissar
Уже с Приветом
Posts: 56969
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: 55+ в ИТ

Post by Komissar »

У мужика нормальный читаемый код, скорее всего для данной задачи можно обойтись перебором. Меня напрягло, чтотне взбрасывается exception, если в корзине обнаружен item which is null.
User avatar
brrdrr
Уже с Приветом
Posts: 9560
Joined: 26 Mar 2011 23:02
Location: Russia -> Orlando, FL

Re: 55+ в ИТ

Post by brrdrr »

Komissar wrote: 09 Oct 2018 07:49 У мужика нормальный читаемый код, скорее всего для данной задачи можно обойтись перебором. Меня напрягло, чтотне взбрасывается exception, если в корзине обнаружен item which is null.
Откуда там null может появиться?
Стареет Комиссар. Комиссар уже не тот. :D
Пример с корзиной конечно некорректный, но смысл понятен, что плохо просто сканировать огромный массив.
Человек никогда не бывает так несчастен, как ему кажется, или так счастлив, как ему хочется. (Франсуа де Ларошфуко)
User avatar
major Major Major Major
Уже с Приветом
Posts: 1123
Joined: 10 Jan 2000 10:01
Location: Хьюстон

Re: 55+ в ИТ

Post by major Major Major Major »

У нас было бы примерно так :)

Code: Select all

private isItemInCart(item: Item): boolean  {
    return this.cart.Items.Any(cartItem => cartItem.Id === item.Id);
}
Items это LINQ обертка над Item[], внутре у нее неонка которая в генерируемом javascript дергает find, fiter и проч.
Проверку аргументов на null в private методах обычно не делаем
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: 55+ в ИТ

Post by АццкоМото »

Мальчик-Одуванчик wrote: 08 Oct 2018 23:35
АццкоМото wrote: 08 Oct 2018 23:05 ИЧСХ даже тривиальное решение типа "а зачем считать при необходимости, можно же счетчик менять, когда добавляем/удаляем" тоже мало кто даст
Что налагает более жесткие требования устойчивости к исключениям для методов корзины.
Ведь так легко сделать данные несогласовынными если исключение вылетело между операцией изменения корзины и обновлением счетчика.
это верно. стало быть, нужно взвешивать риски, плюсы-минусы и все такое. ИМЕННО ЭТО есть то, за что платят инжинегру. а не за обход дерева
Мат на форуме запрещен, блдж!
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: 55+ в ИТ

Post by АццкоМото »

Мальчик-Одуванчик wrote: 08 Oct 2018 23:39
АццкоМото wrote: 08 Oct 2018 23:27 getItems() же возвращает ссылку на коллекцию.
Тут я честно не понял. Разве getItems() не создает эту саму коллекцию, то есть новую структуру данных, отличающуюся от cart?
та ни, все как valchkou понял: Cart имеет кучу полей, одно из них - спейсок CartItems. getter просто возвращает ссылку на этот спейсок
Мат на форуме запрещен, блдж!
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: 55+ в ИТ

Post by АццкоМото »

valchkou wrote: 08 Oct 2018 23:39
АццкоМото wrote: 08 Oct 2018 23:05 Хотя на самом деле куда интереснее, когда нужно, например, посчитать общую стоимость айтемов в карте в предположении, что их может быть чуть больше 100500 миллионов. Тоже вроде бы не бином ньютона, а мало кто напишет эффективно.
согласен что интереснее, но не согласен что не бином.
добавим сюда вполне ожидаемые требования по high availability, scalability, latency и задача сразу превращается в нетривиальный проект.
я бы сказал, что нетривиально будет все это делать с нуля и самому. но все колеса изобретены до нас и в буквально несколько строк это можно сделать с RxJava или другой подобной "реактивной" бляблятекой. но чтобы высрать эти несколько строк у Интерраптушки уйдет полчаса, у меня - день-два, а у некоторых не выйдет вовсе
Мат на форуме запрещен, блдж!
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: 55+ в ИТ

Post by АццкоМото »

major Major Major Major wrote: 09 Oct 2018 16:40 У нас было бы примерно так :)

Code: Select all

private isItemInCart(item: Item): boolean  {
    return this.cart.Items.Any(cartItem => cartItem.Id === item.Id);
}
Items это LINQ обертка над Item[], внутре у нее неонка которая в генерируемом javascript дергает find, fiter и проч.
Проверку аргументов на null в private методах обычно не делаем
Да, это ок, но по сути то же самое. Почему не рассмотреть HashSet<Item> или HashMap<Id, Item> ? Не всегда это лучшее решение, но очень часто
Мат на форуме запрещен, блдж!
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: 55+ в ИТ

Post by АццкоМото »

Komissar wrote: 09 Oct 2018 07:49 У мужика нормальный читаемый код, скорее всего для данной задачи можно обойтись перебором. Меня напрягло, чтотне взбрасывается exception, если в корзине обнаружен item which is null.
Проблема в том, что вы примерно схожего возраста. Поэтому для вас это норм код. Для меня - нет, хоть я себя и чувствую стариком. Приемлемый 30-летний погромист просто блеванет
Мат на форуме запрещен, блдж!
User avatar
major Major Major Major
Уже с Приветом
Posts: 1123
Joined: 10 Jan 2000 10:01
Location: Хьюстон

Re: 55+ в ИТ

Post by major Major Major Major »

АццкоМото wrote: 09 Oct 2018 17:09
major Major Major Major wrote: 09 Oct 2018 16:40 У нас было бы примерно так :)

Code: Select all

private isItemInCart(item: Item): boolean  {
    return this.cart.Items.Any(cartItem => cartItem.Id === item.Id);
}
Items это LINQ обертка над Item[], внутре у нее неонка которая в генерируемом javascript дергает find, fiter и проч.
Проверку аргументов на null в private методах обычно не делаем
Да, это ок, но по сути то же самое. Почему не рассмотреть HashSet<Item> или HashMap<Id, Item> ? Не всегда это лучшее решение, но очень часто
Все зависит от задачи. Если мы про shopping cart то количество предметов в ней не будет того порядка когда разница между hashmap будет существенна и оправданна. Плюс кто сказал что надо будет всегда искать по id? А по категории товара, по количеству, по стоимости?
Я не против быстрого кода, у меня задачи часто такие что без оптимизации просто никуда, но оптимизировать и усложнять там где можно обойтись чем то простым и надежным считаю напрасной тратой времени. То есть если бы речь шла о методе isItemInOrderHistory() то бяда пичалька, а так не особо.
Если не считать что твой старпер не верит в электречество и array.find() не использует, не говоря уже про LINQ. Code review у меня бы по этому не прошел. Читабельность страдает
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: 55+ в ИТ

Post by АццкоМото »

major Major Major Major wrote: 09 Oct 2018 17:18
АццкоМото wrote: 09 Oct 2018 17:09
major Major Major Major wrote: 09 Oct 2018 16:40 У нас было бы примерно так :)

Code: Select all

private isItemInCart(item: Item): boolean  {
    return this.cart.Items.Any(cartItem => cartItem.Id === item.Id);
}
Items это LINQ обертка над Item[], внутре у нее неонка которая в генерируемом javascript дергает find, fiter и проч.
Проверку аргументов на null в private методах обычно не делаем
Да, это ок, но по сути то же самое. Почему не рассмотреть HashSet<Item> или HashMap<Id, Item> ? Не всегда это лучшее решение, но очень часто
Все зависит от задачи. Если мы про shopping cart то количество предметов в ней не будет того порядка когда разница между hashmap будет существенна и оправданна. Плюс кто сказал что надо будет всегда искать по id? А по категории товара, по количеству, по стоимости?
Я не против быстрого кода, у меня задачи часто такие что без оптимизации просто никуда, но оптимизировать и усложнять там где можно обойтись чем то простым и надежным считаю напрасной тратой времени. То есть если бы речь шла о методе isItemInOrderHistory() то бяда пичалька, а так не особо.
Если не считать что твой старпер не верит в электречество и array.find() не использует, не говоря уже про LINQ. Code review у меня бы по этому не прошел. Читабельность страдает
Я там выше в цитате два ключевых момента выделил. Да, не всегда ХэшМап/Таблица это лучшее решение. Но а) их нужно рассмотреть как вариант бэ) даже перебор нужно делать элегантнее
Мат на форуме запрещен, блдж!
User avatar
valchkou
Уже с Приветом
Posts: 3721
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: 55+ в ИТ

Post by valchkou »

АццкоМото wrote: 09 Oct 2018 17:07
valchkou wrote: 08 Oct 2018 23:39
АццкоМото wrote: 08 Oct 2018 23:05 Хотя на самом деле куда интереснее, когда нужно, например, посчитать общую стоимость айтемов в карте в предположении, что их может быть чуть больше 100500 миллионов. Тоже вроде бы не бином ньютона, а мало кто напишет эффективно.
согласен что интереснее, но не согласен что не бином.
добавим сюда вполне ожидаемые требования по high availability, scalability, latency и задача сразу превращается в нетривиальный проект.
я бы сказал, что нетривиально будет все это делать с нуля и самому. но все колеса изобретены до нас и в буквально несколько строк это можно сделать с RxJava или другой подобной "реактивной" бляблятекой. но чтобы высрать эти несколько строк у Интерраптушки уйдет полчаса, у меня - день-два, а у некоторых не выйдет вовсе
если мы говорим про агрегацию 100500 миллионов, то одной блятекой тут не обойтись даже интерапту, не зря же наворотили разных хадупов, спарков и следом распределенных in-memory DB.
сначала нужно все это барахло найти поставить настроить и только потом можно будет немного расслабившись налить чайку и написать несколько строчек работающего кода.
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 12785
Joined: 27 Sep 2007 22:53

Re: 55+ в ИТ

Post by Мальчик-Одуванчик »

major Major Major Major wrote: 09 Oct 2018 17:18 Если не считать что твой старпер не верит в электречество и array.find() не использует, не говоря уже про LINQ. Code review у меня бы по этому не прошел. Читабельность страдает
Ну тогда по идее самое оно параметризовать тип контейнера в реализации и специализировать функцию поиска, если она отличается от тривиального find()
User avatar
Komissar
Уже с Приветом
Posts: 56969
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: 55+ в ИТ

Post by Komissar »

brrdrr wrote: 09 Oct 2018 16:32
Komissar wrote: 09 Oct 2018 07:49 У мужика нормальный читаемый код, скорее всего для данной задачи можно обойтись перебором. Меня напрягло, чтотне взбрасывается exception, если в корзине обнаружен item which is null.
Откуда там null может появиться?
От бага в другом модуле.
Zachet
Уже с Приветом
Posts: 748
Joined: 06 Jul 2016 18:30

Re: 55+ в ИТ

Post by Zachet »

[map][/map]
АццкоМото wrote: 09 Oct 2018 17:11
Komissar wrote: 09 Oct 2018 07:49 У мужика нормальный читаемый код, скорее всего для данной задачи можно обойтись перебором. Меня напрягло, чтотне взбрасывается exception, если в корзине обнаружен item which is null.
Проблема в том, что вы примерно схожего возраста. Поэтому для вас это норм код. Для меня - нет, хоть я себя и чувствую стариком. Приемлемый 30-летний погромист просто блеванет
На самом деле 30-летний погромист учился кодить на питоне, поэтому он выдаст чтото вроде

Code: Select all

 
 
 def isInCart(item, cart):
   return len(filter(lambda x: x.getId() == item.getId(), cart.getItems())) > 0
 
 
Что под капотом тот же обход листа

Return to “Работа и Карьера в IT”