Текущий архив: 2014.09.21;
Скачать: CL | DM;
Вниз
Возвращать значения переменных в Java Найти похожие ветки
← →
Jeer © (2014-02-13 14:24) [40]P.S.
Если хочется чего-то поновее - переходите на Scala, предполагаемый преемник Java:)
http://habrahabr.ru/post/99347/
← →
Kerk © (2014-02-13 14:27) [41]
> jack128_ (13.02.14 14:11) [37]
>
> > Вообще, для возврата из функции нескольких значений в более
> > развитых языках придумали тип tuple.
>
> ИМХО туплы в "более развитых языках" - это спорный момент.
> у туплов нет имен, а это сказывается на читабельности.
Что-то более читаемое, чем туплы сложно придумать :)int X, int Y;
(X,Y) = widget.GetLocation();
← →
Юрий Зотов © (2014-02-13 14:31) [42]> Kerk © (13.02.14 11:32) [30]
> Если сделать подобные классы мутабельными, то любая функция сможет
> изменять значения своих параметров. То есть передачи параметров по
> значению уже не будет существовать.
Еще как будет. Достаточно лишь передавать клон объекта. Правда, это уже отдельная тема.
← →
Kerk © (2014-02-13 14:35) [43]
> Юрий Зотов © (13.02.14 14:31) [42]
Так это надо будет или каждый раз самому делать этот клон или изобрести какой-то синтаксис, чтобы компилятор сам вставлял код создания клона в нужных местах. И все ради чего, ради мутабельности всех объектов? Нет уж, лучше уж var-параметры :)
Мутабельность - зло, ее должно быть как можно меньше.
← →
Kerk © (2014-02-13 14:37) [44]К Скале я делал несколько подходов. Мне этот язык кажется несколько over-engineered (как это по-русски?). Слишком дофига всего. Невероятными усилиями разработчикам удалось сделать не элегантный и не компактный язык. То есть избавить Скалу от традиционных качеств функциональных языков :)
← →
Jeer © (2014-02-13 14:39) [45]Или наделить, в отличие от Джавы, функциональным окрасом:)
← →
Kerk © (2014-02-13 14:43) [46]
> Jeer © (13.02.14 14:39) [45]
Ну, как я вижу, многим нравится. Возможно и правда что-то в нем есть.
В конце концов это единственный более-менее популярный функциональный язык со статической типизацией. Всякие Ruby/Python/Clojure типизируются динамически, а у меня к такому некоторое предубеждение есть.
P.S. Да, я знаю, что все перечисленные языки можно назвать функциональными лишь с натяжкой, но чистая функциональщина в мейнстрим так и не смогла пролезть.
← →
jack128_ (2014-02-13 14:53) [47]
> int X, int Y;
> (X,Y) = widget.GetLocation();
посмотрим на сигнатуру метода GetLocation при использовании туплов.
Tuple<int, int> GetLocation();
как ты узнал, что первым компонентом тупла является x, а вторым y? В моем коде - это очевидно.
← →
Jeer © (2014-02-13 15:21) [48]На Scala:
def func(x: Int, d: Double): (Int, Double) = (x + 1, d * 7.1)
val (x, d) = func(1, 2)
print(s"x = $x, d = $d")
← →
Kerk © (2014-02-13 15:25) [49]
> jack128_ (13.02.14 14:53) [47]
Понял о чем ты. Да, есть смысл.
Но все же считаю, что tuple - это такой компромисс между простотой и функциональностью. Это элементарный тип, не надо многого от него ждать.
Но его можно легко передать в другую функцию, не заморачиваясь названиями его элементов. А документация и всплывающие подсказки в IDE помогут не ошибиться. Ну и в конце концов, если возвращается не (int,int), а хотя бы (bool, string), то проблема исчезает сама собой.
В любом случае в языках без нормального паттерн-матчинга от туплов толку мало, одна имитация.
← →
jack128_ (2014-02-13 17:20) [50]
> Но все же считаю, что tuple - это такой компромисс между
> простотой и функциональностью.
объясни, чем туплы лучше, чем мой вариант?
← →
Kerk © (2014-02-13 17:56) [51]
> jack128_ (13.02.14 17:20) [50]
> объясни, чем туплы лучше, чем мой вариант?
Ничем, это просто разные типы данных. Твой обеспечивает более строгую типизацию, туплы (кортежи наверно правильно по-русски) больше гибкости. В более другие языки кортежи давно и органично встроены. Тот же паттерн-матчинг на порядок элементов тоже завязан.
Ну не знаю, короче. Может быть, дело привычки. Что если мне не нужен результат целиком?int X;
(X,_) = widget.GetLocation();
// Более того, это тоже будет работать:
(X,_) = widget.GetSomeUnknownTupleThatStartsWithInt();
Что если у меня есть функции, принимающие кортеж с координатами? Это будет работать вообще без проблем. А результаты работы вот этих двух функций не получится так легко использовать единообразно.public {int X, int Y} GetLocation()
public {int Width, int Height} GetSize()
Можно конечно, но не так легко.
Там где поддержка кортежей встроена в язык, их использовать легко и приятно. В языках вроде C# это больше похоже на спуск по пожарной лестнице на инвалидной коляске :)
← →
jack128_ (2014-02-13 18:13) [52]
> А результаты работы вот этих двух функций не получится так
> легко использовать единообразно.
>
> public {int X, int Y} GetLocation()
> public {int Width, int Height} GetSize()
легко получится, если для них тоже реализовать pattern matching.
> Там где поддержка кортежей встроена в язык, их использовать
> легко и приятно. В языках вроде C# это больше похоже на
> спуск по пожарной лестнице на инвалидной коляске :)
их легко использовать только потому что есть PM. Будет PM для таких анонимных типов, будет и их легко использовать
← →
Kerk © (2014-02-13 18:33) [53]
> легко получится, если для них тоже реализовать pattern matching.
И работать с ними как будто это обычный кортеж? Можно конечно, почему нет :)
← →
Компромисс1 © (2014-02-13 18:35) [54]
> а вообще такие вот кренделя с абсолютно базовым функционалом
> - когда для какой-то фички я должен найти другой класс ее
> реализующий - очень напоминает шарп. Там тоже надо не мозгом
> шевелить, а тупо знать 5000 всяких классов и классиков для
> того чтобы собрать то, что я хочу. Не мозг включить на пол
> часа, а документацию почитать пол дня чтобы использовать
> лишь то, что мне предложил производитель. Быдлокодинг какой-
> то...
Нет, быдло кодинг - это когда в класс (например, ArrayList) добавляются методы sort, binarySearch, copy, disjoint, frequency и еще 100500 методов, которые когда-то кому-то могут понадобиться.
И в LinkedList добавляются такие же метoды, и даже в HashSet, и т.д. А если нам нужен logging, пусть каждый класс тоже его изобретает, и еще каждый класс должен иметь метод saveToDatabase и loadFromRestService. Вообще, пусть каждый класс будет маленьким, но вполне законченным приложением :)
← →
antonn © (2014-02-13 18:37) [55]
> Компромисс1 © (13.02.14 18:35) [54]
покидаемся в крайности...
← →
Компромисс1 © (2014-02-13 18:44) [56]Никаких крайностей, это и есть разделение обязанностей и OOП. Если метод Collections.sort сортирует любые Collection (и List, и Set), то в какой класс его вставлять? В AbstractCollection? А если я свою реализацию Set напишу, которая вообще только от Object наследуется? Мне надо будет копировать все методы из ArrayList себе?
← →
RWolf © (2014-02-13 18:50) [57]
> Компромисс1 © (13.02.14 18:44) [56]
Достаточно реализовать в ней интерфейс Comparable.
← →
antonn © (2014-02-13 18:56) [58]
> Если метод Collections.sort сортирует любые Collection
забудь про сортировку, я не инвалид и сам смогу отсортировать. Мой вопрос был почему нет метода move()/exch()?
← →
Компромисс1 © (2014-02-13 19:21) [59]
> Достаточно реализовать в ней интерфейс Comparable.
Это если есть Collections класс. Тут предлагалось, чтобы каждая реализация Collection должна была иметь метод для сортировки, а то неудобно другие классы использовать
>
> Мой вопрос был почему нет метода move()/exch()?
Наверное, потому же, почему метод remove является необязательным.
Есть
http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#swap(java.util.List, int, int)
http://docs.oracle.com/javase/6/docs/api/java/util/List.html#subList(int, int)
http://docs.oracle.com/javase/6/docs/api/java/util/List.html#toArray(T[])
Только выбирай.
При сложных операциях все равно обычно работают с массивами, для ускорения.
← →
antonn © (2014-02-13 19:28) [60]
> Только выбирай.
ну тогда я остаюсь при [21], особенно где жирненьким выделено
добавлю так же, что в наличии insert, хотя и зачем его сделали? оставили бы лишь add()/clear() да и делов-то...
← →
Компромисс1 © (2014-02-13 20:39) [61]У тебя какая-то другая java, в моей у ArrayList нет insert ;)
Или ты про add c 2 параметрами?
Я думаю, дело в том, что реализация Collections.swap отлично работает с ArrayList, поэтому и не было смысла делать swap в ArrayList.
public class Collections {
public static void swap(List<?> list, int i, int j) {
final List l = list;
l.set(i, l.set(j, l.get(i)));
}
}
public class ArrayList {
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
E elementData(int index) {
return (E) elementData[index];
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
}
← →
Компромисс1 © (2014-02-13 20:48) [62]А насчет [21]
а вообще такие вот кренделя с абсолютно базовым функционалом - когда для какой-то фички я должен найти другой класс ее реализующий - очень напоминает шарп. Там тоже надо не мозгом шевелить, а тупо знать 5000 всяких классов и классиков для того чтобы собрать то, что я хочу. Не мозг включить на пол часа, а документацию почитать пол дня чтобы использовать лишь то, что мне предложил производитель. Быдлокодинг какой-то...
Это называется "изобретать велосипед". Начинающий программист начинает напрягать мозг полчаса и писать свою сортировку, опытный сначала подумает, что наверное он не первый, кому такая задача поставлена и начнет искать в интернете http://lmgtfy.com/?q=java+sort+arraylist (если сразу не знает про Collections2). Хотя у меня и самого такое было много раз, что вроде бы ничего не нашел, приходится самому написать, а потом оказывается, что оно уже кем-то написано, просто искать надо было заковыристо или оно на 15 странице было. Потому что классов гораздо больше, чем 5000 :(
← →
antonn © (2014-02-13 22:30) [63]
> Или ты про add c 2 параметрами?
да, про нее
> опытный сначала подумает, что наверное он не первый
опытный ее может написать куда быстрее чем пойдет по пути "я хочу готовое": начнет знакомиться с миром 100500 "готовых реализаций", их нюансов и примеров использования, подводными камнями, вкрячиванием в код. Да чтобы оно через два года deprecated не стало. Опять же, мне нужна была простейшая сортировка, и "пузырек" я бы сделал минут за 15 при наличии обычных возможностей типа move. Одним компактным методом у листа. А в случае коллекшенов придется воротить код (CompareTo у item и искать замену своему списку на тот, что имеет sort).
← →
Компромисс1 © (2014-02-13 22:52) [64]Как раз основное преимущество использования чужого - отсутствие ошибок. Знакомиться с нмиром все равно придется, иначе только велосипеды и будешь изобретать. чтобы deprecated не стало, надо open source использовать, иногда даже делаем усовершенствования для себя.
Я насчет сортировки так и не понял, чем компаратор не подходит?
← →
Компромисс1 © (2014-02-13 22:55) [65]
> А в случае коллекшенов придется воротить код (CompareTo
> у item и искать замену своему списку на тот, что имеет sort).
>
Конкретно мне вот это совсем непонятно. Если ты написал свой список (implements List), то почему бы просто не вызвать Collection.sort(твой_список,...)?
← →
antonn © (2014-02-13 22:56) [66]
> Если ты написал свой список
я ничего не писал, у меня arraylist, другого не дано
← →
Компромисс1 © (2014-02-13 23:03) [67]Меня вот это запутало "искать замену своему списку на тот, что имеет sort". Ладно, вроде понятно, что Collections решает все основные проблемы. В javadoc List даже есть ссылки на Collections, правда, про сортировку не упомянуто.
This method eliminates the need for explicit range operations (of the sort that commonly exist for arrays). Any operation that expects a list can be used as a range operation by passing a subList view instead of a whole list. For example, the following idiom removes a range of elements from a list:
list.subList(from, to).clear();
Similar idioms may be constructed for indexOf and lastIndexOf, and all of the algorithms in the Collections class can be applied to a subList.
← →
Юрий Зотов © (2014-02-14 00:13) [68]> Компромисс1 © (13.02.14 22:52) [64]
> основное преимущество использования чужого - отсутствие ошибок.
Э, нет, дружище, не скажите. Несколько раз натыкался. Свой велосипед я хотя бы отдебажить могу, а вот чужой - не всегда есть исходники. Даже когда они есть, то их еще и поизучать надо.
Нет, я, конечно, не призываю велосипеды изобретать. Но если мне нужно что-то простое и мелкое, то снова поддержу Антона - гораздо быстрее написать самому, чем рыться в Инете.
← →
Компромисс1 © (2014-02-14 00:40) [69]
> а вот чужой - не всегда есть исходники
В яве так не принято. Либо есть исходники, либо мы не используем.
> Но если мне нужно что-то простое и мелкое, то снова поддержу
> Антона - гораздо быстрее написать самому, чем рыться в Инете.
>
Смотря о чем речь. Как правило, все действительно нужное простое уже кем-то написано и хорошо известно или быстро находится. Можете навскидку привести пример того, что "быстрее написали сами"?
← →
Юрий Зотов © (2014-02-14 01:28) [70]> Компромисс1 © (14.02.14 00:40) [69]
> Либо есть исходники, либо мы не используем.
А если деваться некуда? Живой пример - есть шибко специализированный и шибко низкоуровневый пакет, без которого нам не обойтись. Исходников его нет, а есть только джавадок. Вот по нему и действуем.
> пример того, что "быстрее написали сами"?
Например, разные мелкие утилитки, объединенные в один класс в виде статических методов. Скажем, strToDate(), который автоматом распознает несколько форматов даты на входе. Эти 10-15 строк пишутся за столько же минут и настолько просты, что уже после первого теста вероятность невыловленной ошибки становится ничтожной.
← →
Компромисс1 © (2014-02-14 03:59) [71]Юрий Зотов,
Понятно, спасибо. У нас тоже есть свой strToDate в одном из проектов, точно с таким же функционалом :)
← →
antonn © (2014-02-14 09:16) [72]
> Как раз основное преимущество использования чужого - отсутствие
> ошибок.
в чужом могут быть ошибки (вот в дельфи 7 в модуле jpeg было обращение к scanline[0] и scanline[1], в результате чего попытка работы с картинкой высотой 1 пиксель была невозможна, модуль от производителя), чужое может быть написано неоптимально (мне сразу не понравилось что для простой операции приходится пересоздавать объекты), чужое нужно изучать и на это тратится время.
а свои велосипеды могут быть уже написаны, отлажены, и понятны
← →
картман © (2014-02-15 14:50) [73]интересно, бывают ли jpeg"и размером 1х1?
← →
antonn © (2014-02-16 11:20) [74]
> картман © (15.02.14 14:50) [73]
>
> интересно, бывают ли jpeg"и размером 1х1?
в вебе - сплошь и рядом
← →
картман © (2014-02-16 12:10) [75]
> antonn © (16.02.14 11:20) [74]
обалдеть, а в чем у него выигрыш по сравнению с bmp?
← →
antonn © (2014-02-16 12:14) [76]привычный content-type, не сжатия ради ведь
хотя чаще gif можно встретить
Страницы: 1 2 вся ветка
Текущий архив: 2014.09.21;
Скачать: CL | DM;
Память: 0.64 MB
Время: 0.012 c