55+ в ИТ

User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 15477
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: 15477
Joined: 27 Sep 2007 22:53

Re: 55+ в ИТ

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

Komissar wrote: 09 Oct 2018 00:18 народ, неужели сборщики мусора по-прежнему куются вручную?!
Да, так же как и аллокаторы для определенных типов данных. Не так давно на Хабре хороший пример на эту тему приводился.
User avatar
Komissar
Уже с Приветом
Posts: 65198
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: 1385
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: 1385
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: 4185
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: 15477
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: 65198
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: 818
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
 
 
Что под капотом тот же обход листа
User avatar
M. Ridcully
Уже с Приветом
Posts: 12003
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: 55+ в ИТ

Post by M. Ridcully »

Zachet wrote: 10 Oct 2018 02:45 [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
 
 
Что под капотом тот же обход листа
Уж больно коряво, если вы про Питон.
Лучше уж

Code: Select all

def is_in_cart(item, cart):
    return item.getId() in (it.getId() for it in cart.getItems())
Или даже так, если объекты по-людски написаны:

Code: Select all

def is_in_cart(item, cart):
    return item in cart.getItems()
User avatar
Komissar
Уже с Приветом
Posts: 65198
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: 55+ в ИТ

Post by Komissar »

“A вы друзья, как ни садитесь...”
Zachet
Уже с Приветом
Posts: 818
Joined: 06 Jul 2016 18:30

Re: 55+ в ИТ

Post by Zachet »

M. Ridcully wrote: 10 Oct 2018 05:13
Zachet wrote: 10 Oct 2018 02:45 [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
 
 
Что под капотом тот же обход листа
Уж больно коряво, если вы про Питон.
Лучше уж

Code: Select all

def is_in_cart(item, cart):
    return item.getId() in (it.getId() for it in cart.getItems())
Или даже так, если объекты по-людски написаны:

Code: Select all

def is_in_cart(item, cart):
    return item in cart.getItems()
Не принципиально. Суть в том что 30-летний погромист напишет на питоне обход листа в одну строчку, и забудет. Пока Комиссар будет выяснять, не подменили-ли инопланетяне у него в карте один айтем на нулл.
KinDzaDza
Уже с Приветом
Posts: 2307
Joined: 29 Jul 2005 17:39
Location: Калифорнийский Мухосранск

Re: 55+ в ИТ

Post by KinDzaDza »

Zachet wrote: 10 Oct 2018 16:08
M. Ridcully wrote: 10 Oct 2018 05:13
Zachet wrote: 10 Oct 2018 02:45 [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
 
 
Что под капотом тот же обход листа
Уж больно коряво, если вы про Питон.
Лучше уж

Code: Select all

def is_in_cart(item, cart):
    return item.getId() in (it.getId() for it in cart.getItems())
Или даже так, если объекты по-людски написаны:

Code: Select all

def is_in_cart(item, cart):
    return item in cart.getItems()
Не принципиально. Суть в том что 30-летний погромист напишет на питоне обход листа в одну строчку, и забудет. Пока Комиссар будет выяснять, не подменили-ли инопланетяне у него в карте один айтем на нулл.
Зато у Комиссара приложение не начнёт падать в продакшн с нуль пойнтер эксепшен когда какое-нибудь другое молодое дарование внезапно(tm) поменяет код по добавлению айтемов в эту корзину.
Хотя, конечно, мы ту обсуждаем сферического коня в вакууме. Без знаний как за кадром устроен этот cart из примера, что там с айтемами (как там например имплементирован метод equal() и т.п.) - все остальное гадание на кофейной гуще. Фреймворки тоже не боги писали, как мне помнится классный библиотечный binary search в Java как раз на 100500 классно гнал фуфло.
User avatar
M. Ridcully
Уже с Приветом
Posts: 12003
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: 55+ в ИТ

Post by M. Ridcully »

KinDzaDza wrote: 10 Oct 2018 16:50
Хотя, конечно, мы ту обсуждаем сферического коня в вакууме.
Дык, чисто потрындеть да своей гениальностью блеснуть, как водится. :mrgreen:
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: 55+ в ИТ

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

KinDzaDza wrote: 10 Oct 2018 16:50 Зато у Комиссара приложение не начнёт падать в продакшн с нуль пойнтер эксепшен когда какое-нибудь другое молодое дарование внезапно(tm) поменяет код по добавлению айтемов в эту корзину.
сюрпрайз: для этого придуманы не только аннотации типа @NonNull, которые решают проблему частично, но и йызыки тиипа Котлина, которые решают проблему полностью. И молодое дарование наверняка умеет этим пользоваться, а старперы будут и дальше надувать щеки "а вот если вдруг"

На всякий случай напомню, что идея Комми - проверять на нуль и кидать эксепшн. Не NPE, а другой. Т.е. по факту у неопытного писюка будет код такой, что нарушить null-safety будет невозможно, а у Комми - такой, что не падает со стыдным NPE, но падает с KommyVerifiedThatHereWeHaveANullPointerInCollectionAndYouAllSuckException :umnik1:
Мат на форуме запрещен, блдж!
User avatar
M. Ridcully
Уже с Приветом
Posts: 12003
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: 55+ в ИТ

Post by M. Ridcully »

А вообще всех за пояс заткнет Кумар Дипшитович, который честно поймает null pointer и в обработчике сделает молчаливый возврат безо всякой диагностики. И подумает: "у меня ничего не падает, а вы поебитесь отлаживать".
User avatar
Komissar
Уже с Приветом
Posts: 65198
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: 55+ в ИТ

Post by Komissar »

АццкоМото wrote: 10 Oct 2018 17:46
KinDzaDza wrote: 10 Oct 2018 16:50 Зато у Комиссара приложение не начнёт падать в продакшн с нуль пойнтер эксепшен когда какое-нибудь другое молодое дарование внезапно(tm) поменяет код по добавлению айтемов в эту корзину.
сюрпрайз: для этого придуманы не только аннотации типа @NonNull, которые решают проблему частично, но и йызыки тиипа Котлина, которые решают проблему полностью. И молодое дарование наверняка умеет этим пользоваться, а старперы будут и дальше надувать щеки "а вот если вдруг"

На всякий случай напомню, что идея Комми - проверять на нуль и кидать эксепшн. Не NPE, а другой. Т.е. по факту у неопытного писюка будет код такой, что нарушить null-safety будет невозможно, а у Комми - такой, что не падает со стыдным NPE, но падает с KommyVerifiedThatHereWeHaveANullPointerInCollectionAndYouAllSuckException :umnik1:
Мои эксепшны выводятся на экран PM со словами "ЗА ВАМИ УЖЕ ВЫЕХАЛИ"
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: 55+ в ИТ

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

Komissar wrote: 10 Oct 2018 18:33
АццкоМото wrote: 10 Oct 2018 17:46
KinDzaDza wrote: 10 Oct 2018 16:50 Зато у Комиссара приложение не начнёт падать в продакшн с нуль пойнтер эксепшен когда какое-нибудь другое молодое дарование внезапно(tm) поменяет код по добавлению айтемов в эту корзину.
сюрпрайз: для этого придуманы не только аннотации типа @NonNull, которые решают проблему частично, но и йызыки тиипа Котлина, которые решают проблему полностью. И молодое дарование наверняка умеет этим пользоваться, а старперы будут и дальше надувать щеки "а вот если вдруг"

На всякий случай напомню, что идея Комми - проверять на нуль и кидать эксепшн. Не NPE, а другой. Т.е. по факту у неопытного писюка будет код такой, что нарушить null-safety будет невозможно, а у Комми - такой, что не падает со стыдным NPE, но падает с KommyVerifiedThatHereWeHaveANullPointerInCollectionAndYouAllSuckException :umnik1:
Мои эксепшны выводятся на экран PM со словами "ЗА ВАМИ УЖЕ ВЫЕХАЛИ"
Ага. А когда мой код не работает, фиксят компилятор. Продолжим?
Мат на форуме запрещен, блдж!

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