Re[2]: передача параметра "по ссылке"
От: Michael Ponomarev Россия  
Дата: 21.12.06 07:39
Оценка: 2 (2) +3
Hi, Аноним!

А> Издеваешься? В жаве ВСЯ работа с объектами по ссыкам.


Вся работа по значению.

WBR, Michael Ponomarev.
Posted via RSDN NNTP Server 2.0
Re[2]: передача параметра "по ссылке"
От: Trean Беларусь http://axamit.com/
Дата: 21.12.06 10:00
Оценка: +4
Здравствуйте, Тычеблин, Вы писали:

Т>Здравствуйте, dev_m, Вы писали:


_>>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.

_>>В сях:
_>>
_>>void set(int&n);
_>>

_>> , а как в jave?

Т>это к стати то — чего ужас как нехватает в JAVA...

Т>это первое — что нужно было добавить в язык.

Это неудобство проявляется в основном при математических вычислениях, при попытке использования процедурного подхода в Java (через статические методы к примеру). Не помню, чтобы мне это где-то еще могло пригодиться, но я особо по этому поводу не расстраивался.
Re[7]: передача параметра "по ссылке"
От: fellow.sufferer Россия  
Дата: 21.12.06 08:30
Оценка: 3 (1) +2
Здравствуйте, msqrt84, Вы писали:

M>будет выводится "5"?


1.5 портит людей. попробуй тож самое на 1.4 и узрей косяк.
Re[10]: передача параметра "по ссылке"
От: Аноним  
Дата: 22.12.06 20:19
Оценка: 3 (1) +2
мои пять копеек в тему:
1) Упопянули что введедение pass by ref фукциональности вызовет проблемы совместимости кода. Не вижу как и где. Просто новый код будет требовать соответсвующую версию JVM. Ведь никто же не требует чтоб приложение разработанное для версии n.m работало на версии n.m-1
2) Язык программирования универсальный инструмент и если для одного проекта ООП это good то для другого 5% performance гораздо более важно чем соблюдение канонов ООП. Да можно использовать C# который имеет эту функциональность, но иногда JAVA единственный выбор и разводить зоопарк языков ради такого пустяка никто не хочет. Так что если уж хочешь быть унивесальным то будь добр соотвествуй.
3) Защитники приципов ООП в этой ветке слепо цитируют выдержки из своей "библии ООП" а это уже смахивает на фанатизм. Беспрестрастно оцените ситуацию, очевидно что привильное использование этого функционала добаит универсальности языку. А если быть идиотом то следование канонам ООП не спасет вас от глюков и нечитаемого кода.

PS Такое чуство возникает что разработчики просто поленились добавить эту фичу
Re: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 21.12.06 09:24
Оценка: -3
Здравствуйте, dev_m, Вы писали:

_>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.

_>В сях:
_>
_>void set(int&n);
_>

_> , а как в jave?

это к стати то — чего ужас как нехватает в JAVA...
это первое — что нужно было добавить в язык.

проверенно на практике!
при переписывание кода с JAVA на C# происходит его ощутимое очищение и он становится понятнее.

+ очевидно повышается производительность.
Re[12]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 11:49
Оценка: +1 -2
Здравствуйте, Курилка, Вы писали:

К>И что ты пытаешься этим показать?

Мы пока еще на брудершафт не пи... не курили.

К>Просто Объекты они только в ООП, поэтому при применении других подходов решение будет другим, ты же только про процедурное говоришь.

Вы неправы противопоставляя объектно-ориентированное программирование и функциональное. Есть одна класссификация: функциональный, по-другому декларативный подход (вложенные вызовы функций) и императивный подход (вычисления в виде инструкций). А есть другая классификация: объектно-ориентированный подход и процедурный.
К примеру, Java по умолчанию (!) следует и ООП, и императивному подходу. Так давайте мух с котлетами не будем мешать, да?

К>просто ООП — не единственный подход к решению задач, порой другие варианты более удобны.

Я по-моему не утверждал, что на ООП мир клином сошелся, это вы за меня придумали.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[6]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 22.12.06 05:01
Оценка: +2 :)
Здравствуйте, rsn81, Вы писали:


R>К примеру, с точки зрения ООП правильным считается использование класса Point, который....


только взял боец гитару — сразу видно гармонист.


задачи разные бывают...судя по твоим репликам с проблеммами реализации например, отрисовки векторной графики средствами JAVA, (матрицы, то-сё) тебе сталкиваться не приходилось.

R>.. а зачем тогда ООП вообще?


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

для большинства-же задач сложность которых производительность ООП помеха... вот так.


R>Правильно сказали, если так сложно въехать в ООП,




для тебя это такой предмет гордости. такое ощущение, что процесс въезжания с тобой случилося совсем недавно
Re[9]: передача параметра "по ссылке"
От: fellow.sufferer Россия  
Дата: 21.12.06 08:39
Оценка: 3 (1) +1
Здравствуйте, msqrt84, Вы писали:

M>У меня стоит 1.5 — выводится 0. Я так понимаю, в 1.4 выводится 5?

M>

Не, просто не компилится.
Re[4]: передача параметра "по ссылке"
От: Евгений Коробко  
Дата: 21.12.06 16:45
Оценка: 3 (1) +1
При расчёте разных статистических функций часто нужно вычислять такие вещи, как суммы квадратов, сумма попарных произведений и пр. над двумя массивами.
Как это красиво и эффективно сделать на java?
Вот для корреляции нам надо вычислить суммы квадратов и сумму попарных произведений.
Дано:
double[] x;
double[] y;

нужно:

double sx2,sy2,sxy;

как?

Писать три функции, в каждой делать цикл? Не лучше ли сделать функцию, которая посчитает всё за один проход и вернёт всё сразу?

Далее, допустим, нам нужно посчитать корреляцию массивов и стандартную девиацию каждого из массивов. При расчёте корреляции у нас уже будут готовы суммы квадратов. Зачем нам при расчёте девиации считать их опять? А как сделать возврат (опционально) этих данных из функции корреляции и передачу (опционально) их в функцию расчёта девиаций?

P.S. И не надо говорить, что пример из пальца высосан.
Евгений Коробко
Re[11]: передача параметра "по ссылке"
От: Trean Беларусь http://axamit.com/
Дата: 23.12.06 01:06
Оценка: 2 (2)
Здравствуйте, Аноним, Вы писали:

А>мои пять копеек в тему:

А> 1) Упопянули что введедение pass by ref фукциональности вызовет проблемы совместимости кода. Не вижу как и где. Просто новый код будет требовать соответсвующую версию JVM. Ведь никто же не требует чтоб приложение разработанное для версии n.m работало на версии n.m-1
А> 2) Язык программирования универсальный инструмент и если для одного проекта ООП это good то для другого 5% performance гораздо более важно чем соблюдение канонов ООП. Да можно использовать C# который имеет эту функциональность, но иногда JAVA единственный выбор и разводить зоопарк языков ради такого пустяка никто не хочет. Так что если уж хочешь быть унивесальным то будь добр соотвествуй.


А>PS Такое чуство возникает что разработчики просто поленились добавить эту фичу


There are good reasons that Java excluded the idea of pass-by-reference from its language design, and when writing Java applications it's best to do as Java does. There are elegant solutions to all common problems that may be solved with pass-by-reference in other languages. Before I get there, though, let's look at some of the problems of pass by reference.

Pass by reference mixes inputs and outputs of code. This is the fundamental problem with the technique. In Java, a programmer can assume that variables will not change their value when passed as parameters to a method. In languages with pass by reference semantics, this basic assumption cannot be made.

Pass by reference confuses the interface to a method. Methods written using pass-by-reference semantics can have extremely complex interfaces that are difficult for client programmers to learn and understand. That said, you may be left with a situation where you feel the need to use pass-by-reference in an application. There are two major reasons to use pass by reference, and each has its own solution:

First, pass by reference is used in many languages to reduce the costs of a method call, preventing the copying of large amounts of data. This is a non-issue in Java. The problem is solved by simply realizing that in Java, the values passed to a method are either primitive data or object references, which cannot be large enough to make this a real issue. Objects themselves can be very large, but are never passed to methods.

Second, pass by reference allows the variable to be changed, and the changed value can be seen in client code. The solution here is to refactor the application to use the return value for this purpose. If a parameter is an "in-out" parameter, then its original value should be passed into the method and its result moved to the return value.


http://www.yoda.arachsys.com/java/passing.html

А> 3) Защитники приципов ООП в этой ветке слепо цитируют выдержки из своей "библии ООП" а это уже смахивает на фанатизм. Беспрестрастно оцените ситуацию, очевидно что привильное использование этого функционала добаит универсальности языку. А если быть идиотом то следование канонам ООП не спасет вас от глюков и нечитаемого кода.


А не правильное использование by ref добавит лишних проблем пользователям и разработчикам. С++ вот если правильно использовать, то ведь можно отличные программы писать, только вот что-то почему-то немногие пишут программы на нем без memory leaks, и access violation. Если почитать ветку с++, то можно увидеть, что прогеры вместо решения прикладных проблем воют с языком, бустами, изобретают велосипеды кастомные memory manager'ы. Никому не нужен сложный перегруженный язык, вот generics ввели, так сразу многие начали плеваться. Давайте еще yield введем, потом еще чего-нибудь и в конце концов язык превратится в C++, и правильно на нем писать будут единицы, а остальные плодить код, который только на свалку. В конце концов, кого Java не устраивает в том виде в котором существует, можно написать свой язык под JVM благо исходники для всех открыты.
Re[19]: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 10:15
Оценка: +2
Здравствуйте, aka50, Вы писали:

A>примитивный... ну если тебе легче, есть еще weak .


А ты можешь просто ответить на вопрос, который сам же и вызвал введением новых терминов?
Как же себя ведет при сравнении (==) "не_примитивный" указатель, если "примитивный" ведет себя как int?
Re[4]: передача параметра "по ссылке"
От: Trean Беларусь http://axamit.com/
Дата: 21.12.06 10:25
Оценка: +2
Здравствуйте, Тычеблин, Вы писали:

Т>Здравствуйте, Trean, Вы писали:



T>>Это неудобство проявляется в основном при математических вычислениях, при попытке использования процедурного подхода в Java (через статические методы к примеру). Не помню, чтобы мне это где-то еще могло пригодиться, но я особо по этому поводу не расстраивался.


Т>до момента переписывания кода под C# я тоже особенно — то и не перживал относясь к этой проблемме как к явлению природы...


Т>если аквариумных рыбок вылить в пруд они еще долго будут плавать в периметре уже отсутствующего аквариума...


Я на C/C++ писал в открытом море, и когда, если следовать вашей аналогии меня засунули в аквариум, я даже не расстроился потери int& или int*.

Т>так и я, начав переписывать код, некоторое время, делал это в стиле JAVA ...

Т>прозрение наступило позже...
Т>одним словом, это нужно реально ощутить на практике.
Т>уверяю, контраст разительный.
Т>и дело не только в примитивах. считаю возможность передавать ЛЮБЫЕ переменные byref важнее и полезне чем дженерики.

Гм, позвольте, а где в java проблема с передачей изменяемых в методе объектов? Это только к примитивам относится, или вы хотите чтобы еще и значение передаваемой ссылки на объект можно было менять? Так это такие баги в программе будут, что лучше сразу выпить яду. Буду рад если вы приведете кусочек кода, после которого у меня наступит прозрение чтобы понять, что я теряю сейчас.
Re[6]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 11:20
Оценка: :))
Здравствуйте, Тычеблин, Вы писали:

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

Каков пример, таков и ответ:
Object a = new Object;
Object b = new Object;
// вместо Swap(ref a, ref b)
Object temp = a;
a = b;
b = temp;
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[10]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 12:37
Оценка: +2
Здравствуйте, Курилка, Вы писали:

К>А если функционально?

К>Использовать другие подходы кроме ООП нонче запрещается?

Тогда можно другой язык взять ту же scala.
Re[7]: передача параметра "по ссылке"
От: Евгений Коробко  
Дата: 21.12.06 16:32
Оценка: +2
Представьте — у нас есть большой массив. Надо в нём находить максимальное и минимальное значение.
Было бы здорово сделать функцию, которая ищет их одновременно (это эффективно), но как? Массив возвращать? А как по функции

int[] GetMinMaxValues(int[] values)

понять, сколько значений она возвращает и в каком порядке?

Постоянно встречаю, что функции нужно вернуть несколько значений. Промежуточные результаты могут использоваться повторно в другой функции, что сильно бы повысило эффективность.
Евгений Коробко
Re[5]: передача параметра "по ссылке"
От: Cider Россия  
Дата: 21.12.06 16:51
Оценка: -1 :)
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>При расчёте разных статистических функций часто нужно вычислять такие вещи, как суммы квадратов, сумма попарных произведений и пр. над двумя массивами.

ЕК>Далее, допустим, нам нужно посчитать корреляцию массивов и стандартную девиацию каждого из массивов. При расчёте корреляции у нас уже будут готовы суммы квадратов. Зачем нам при расчёте девиации считать их опять? А как сделать возврат (опционально) этих данных из функции корреляции и передачу (опционально) их в функцию расчёта девиаций?
ЕК>P.S. И не надо говорить, что пример из пальца высосан.

Пример, безусловно, хороший. Но стоит его немного дополнить — данная функиональность вызывается, наприсер, как веб-сервис. После злобной оптимизации с передачей примитивных типов по ссылке производительность функции выросла в 2 раза, теперь она выполняется за 25 миллисекунд. И еще 10 секунд уходит на сборку/разбор XML и транспорт по сети
Cider
Re[8]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 17:57
Оценка: +2
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>Представьте — у нас есть большой массив. Надо в нём находить максимальное и минимальное значение.

ЕК>Было бы здорово сделать функцию, которая ищет их одновременно (это эффективно), но как? Массив возвращать? А как по функции

ЕК>int[] GetMinMaxValues(int[] values)


ЕК>понять, сколько значений она возвращает и в каком порядке?


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

Беря в руки ООЯ научитесь уже думать объектно, а не процедурно:
package ru.rsdn.test;

public class Searcher {
    private int min;

    private int max;

    private int[] array;

    public Searcher(int[] _array) {
        array = _array;
    }

    public void eval() {
        for (int i = 0; i < array.length; i++) {
            if (min > array[i])
                min = array[i];
            if (max < array[i])
                max = array[i];
        }
    }

    public int getMax() {
        return max;
    }

    public int getMin() {
        return min;
    }
}

package ru.rsdn.test;

public class Test {
    public static void main(String[] args) {
        int[] a = { 2, 1, 5, 1, -1 };
        Searcher searcher = new Searcher(a);
        searcher.eval();
        System.out.println("min = " + searcher.getMin());
        System.out.println("max = " + searcher.getMax());
    }
}
Не верите, посмотрите классы java.util.Collection. Наверно Sun можно в этом вопросе доверять?
Re[10]: передача параметра "по ссылке"
От: Michael Ponomarev Россия  
Дата: 21.12.06 09:19
Оценка: 1 (1)
Hi, Аноним!

А> Примитивный указатель — эт что-то новенькое) А как он выглядит?

А> Только не увлекайся с описаниями, что бы мне потом ночью кошмары не
А> снились)

Брюс Эккель: философия JAVA
Приложение А Передача и возврат объектов.

Передача параметров "по значению"
Тут необходимо внести ясность в понимание термина "передача параметров по
значению" и то как он реализуется в программе. Суть метода заключается в
использовании локальных копий параметров, передаваемых вашему методу. Камнем
преткновения является различное отношение к передаваемым параметрам.
Существуют два наиболее распространенных взгляда на параметры:

В Java все параметры передаются по значению. Передавая методу примитивы,
вы получаете локальную копию примитивов, передавая методу ссылку, вы
получаете локальную копию ссылки. Итак, все передается по значениям.
Разумеется, при таком подходе требуется постоянно помнить о том, что вы
работаете лишь с ссылками. Однако Java разработан таким образом, что (в
большинстве случаев) позволяет вам забыть о том что вы работаете лишь с
ссылками и думать о ссылках как об "объектах", но лишь до тех пор, пока вы
не попытаетесь вызвать какой-нибудь метод.
Примитивы в Java передаются по значению, а объекты передаются как
ссылки. Это общепринятый взгляд на ссылки. При таком подходе вам не надо
думать о параметрах как о ссылках. В таком случае вы можете утверждать: "Я
передаю объект". Поскольку при передаче объекта в метод вы не создаете его
локальную копию, нельзя сказать что объекты передаются по значению. Возможно
в будущем компания Sun предложит какое-нибудь решение этой проблемы. В Java
зарезервировано, но пока не использовано ключевое слово byvalue (по
значению), но на сегодняшний день нет никакой официальной информации о том,
будет ли вообще когда-нибудь использовано это ключевое слово.
Итак, рассмотрев обе точки зрения, я скажу так: "Все это зависит лишь от
вашего представления о ссылках." Теперь вернемся к нашей проблеме. В конце
концов, это не так важно, гораздо важнее понимание того, что передача ссылок
в качестве параметров может привести к неожиданным изменениям внешних
объектов.


WBR, Michael Ponomarev.
Posted via RSDN NNTP Server 2.0
Re[7]: передача параметра "по ссылке"
От: Trean Беларусь http://axamit.com/
Дата: 22.12.06 10:17
Оценка: 1 (1)
Здравствуйте, Евгений Коробко, Вы писали:

T>>Создать класс с данными религия не позволяет?

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

T>> Тогда используйте массивы для передачи и возврата значений, от этого еще никто не умирал, красоты мало, зато первоманс высокий.

ЕК>Перформанс высокий на голом С. Java — это решение немного поступиться перпомансом в пользу понятного и надёжного кода.

Пишите на С или хоть на Ассемблере, как вам угодно. Если бы Sun по каждый раз меняла язык, то получилось бы как с .Net, что приложения написанные под первую версию не работают под второй и надо все переписывать, вы себе представляете как можно переписать банковскую систему, работающую и отлаженную и во что это выльется. Не видели создатели большой необходимости, и не добавили, и я с ними в этом согласен. Есть гораздо более насущные проблемы, чем охота за наносекундами.

ЕК>Ну так вот, использование массивов — это отказ от статической (т.е. средставим компилятора) проверки числа аргументов, их порядка и, зачастую, пита. К каким опасностям это ведёт, думаю, очевидно. И чем это лучше передачи объектов byref, единственным минусом которого, как тут уже отмечалось, является то, что кто-то может написать byref там, где он не нужен, а пользователям этого кода потом будет плохо. (Аналогичная ситуация возникает, если метод в С++ забыли обозначить как const, хотя реально он таковым является).


Не нравятся массивы используйте parameter template, как тут уже писали. Вы из мухи делаете слона. Поищите в сети тесты на FFT на Java.

http://citeseer.ist.psu.edu/698408.html

Резюме — скорость программ на java достигает 50-70% от скорости программ на C. Причем это для тестов на версии jdk 1.3. Я лично готов пожертвовать процентами первоманса в угоду надежности.
Re[8]: передача параметра "по ссылке"
От: Cyberax Марс  
Дата: 23.12.06 12:47
Оценка: 1 (1)
Евгений Коробко wrote:
> int[] GetMinMaxValues(int[] values)
> понять, сколько значений она возвращает и в каком порядке?
Варианты:
public class Holder<T>
{
    T var;
    Holder(){}
    Holder(T var){this.var=var;}
    T get(){return var;}
    void set(T var){this.var=var;}
}

...
public void getMinMaxValues(int []values,Holder<int> min, Holder<int> max)
...


public static class MinMaxRes
{
    int min,max;
};
public MinMaxRes getMinMaxValues(int []values)


А вообще, ХАЧУ ТУПЛЫ!
Posted via RSDN NNTP Server 2.1 beta
Sapienti sat!
Re[13]: передача параметра "по ссылке"
От: Trean Беларусь http://axamit.com/
Дата: 23.12.06 16:19
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Продолжим продуктивную дискуссию


Ок. Хотя тут все вроде как остались при своем мнении

А>Тут вы уже лукавите сравниваем не c++ и Java а .NET (c#, ...) и Java. Давайте всетаки сравнивать языки более или менее одной весовой категории.


http://msdn2.microsoft.com/en-us/library/x53a06bb.aspx

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html

С# (83 ключевых слов) vs Java (50 ключевых)

Мне C#-вский зоопарк кейвордов в Java не нужен, только чтобы получать дополнительно 5% первоманса

А>А так совершенно верно, универсальность достается ценой производительности. И вообще этот спор больше похож на спор тупоконечников и остроконечников. У каждой стороны есть свои аргументы. Решать кто прав кто виноват будет время, то что необходимо останется, то что ненужно отомрет в ходе эволюции. Я лично использую C# и пользуюсь pass by ref. Не считаю что это делает мой код менее читаемым.


Вопрос не только и не столько в читаемости, а в усложнении разработки, трудности вхождения новичков и переобучения, а это все деньги. Часть из того, что в C# достигается через языковые конструкции в Java достигается через JNI, а там можно писать на чем угодно. Тащить в язык, все что может пригодиться в 1% случаев — оверхед, проще использовать для этого специальные тулы. В качестве примера сошлюсь на JAI (Java Advanced Imaging), в котором код всякого рода копирований, свертки, корреляции написан на C/Asm и оптимизирован под возможности и simd расширения различных платформ (mmx, 3dnow). И ведь работает и вполне быстро. Почему-то разработчиков Red5 (открытый потоковый сервер видео) Java вполне устроил, надо видео конвертнуть в другой формат — подключай кроссплатформенный ffmpeg написанный на С и будет тебе первоманс. На Java отлично реализуется бизнес логика, управление объектами, для низкоуровневых вещей есть лучше средства, хотя не всегда их применение даст огромный выигрыш по сравнению с pure java.

А>Если уж подходить с точки зрения читаемости кода то запоминать лишние обертки под простые типы или типы созданные специально для возврата значений (которые будут разные от проекта к проекту так как их пишут разные люди) для меня сложнее чем выучить одно ключевое слово ref(стандарт языка и он неизменен от проекта к проекту).


А сколько еще случаев будет, когда вам захочется, чтобы добавили новое ключевое слово? И только для того, чтобы использовать его в 1% своего кода.
Re[5]: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 08:02
Оценка: -1
Здравствуйте, dev_m, Вы писали:

_>Ну в данном та случае вопрос стоит как получить int, неужели нельзя так делать??


Обворачивай в объект и вперёд. Или ретурнь результат. Это уж от как красифше по задаче будет )
Re[11]: передача параметра "по ссылке"
От: fellow.sufferer Россия  
Дата: 21.12.06 09:10
Оценка: -1
Здравствуйте, aka50, Вы писали:

A>
A>    MyObject obj = new MyObject();
A>    obj = new MyObject();
A>

A>Что есть obj?

Какой ужас!

1. MyObject obj — создал ссылку на MyObject
2. new MyObject(); — создал объект MyObject
3. obj = new MyObject(); — создал объект и установил ссылку.
Re[12]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 09:31
Оценка: -1
Здравствуйте, fellow.sufferer, Вы писали:

FS>Здравствуйте, aka50, Вы писали:


A>>
A>>    MyObject obj = new MyObject();
A>>    obj = new MyObject();
A>>

A>>Что есть obj?

FS>Какой ужас!

Как раз твои коменты — это ужас... Ты что-то кроме java и
дельфи в своей жизни видел?

В терминах С++:
FS>1. MyObject obj — создал ссылку на MyObject
Кто на ком стоял? Создан указатель, который равен null, т.е. он указывает в никуда...
FS>2. new MyObject(); — создал объект MyObject
угу, и присвоил указателю адрес объекта myobject.
FS>3. obj = new MyObject(); — создал объект и установил ссылку.
изменил значение указателя

Ссылка — это указатель контролируемый gc. Ничего волшебного
в слове "ссылка" нет. То, что мы в java не можем так просто
получить реальный адрес — это условности jvm (в частности
из-за возможности изменения адреса при дефрагментации gc),
например в .Net слышал есть понятние fixed, что дает
возможность работать с адресом в памяти.

Вот доходчиво: http://rsdn.ru/Forum/Message.aspx?mid=2274247&amp;only=1
Автор: Michael Ponomarev
Дата: 21.12.06
Re[4]: передача параметра "по ссылке"
От: Blazkowicz Россия  
Дата: 21.12.06 10:23
Оценка: +1
Здравствуйте, Тычеблин, Вы писали:

Т>считаю возможность передавать ЛЮБЫЕ переменные byref важнее и полезне чем дженерики.


Аргументов кроме "я попробовал — мне понравилось", мы пока не слышали.
Re[7]: передача параметра "по ссылке"
От: msqrt84 Россия  
Дата: 21.12.06 10:30
Оценка: +1
Здравствуйте, dev_m, Вы писали:

А>>Обворачивай в объект и вперёд. Или ретурнь результат. Это уж от как красифше по задаче будет )

_>Return не покатит, так как возвращаемый параметр не один, ну разве хоть массив несвязаных параметров возвращай.

_>Как его в объект обернуть, так чтобы помогло я не понял. У меня пример с Integer тоже не работает.

_>Насчет обсуждений о правильности с точки зрения ООП, обсуждаемой ниже.
_>Я тут привел код, который написал прямо в ответнике, чтобы иллюстрировать свою проблему — не знание, как получить объект/обычную переменную из функции(чем я раньше регулярно пользовался в с++), кроме как через return. Насчет того, что n должно быть полем класса — ну, в данный момент я хочу изменять и получать состояния вообще другого класса...
_>Да, горячая получилось темка, совсем не ожидал....
_>Я так понимаю я не понял самой сути проблемы. Читая посты у меня сложилось впечатление что мое желание вообще с точки зрения java неправильно. Если так, то не могли бы вы мне объяснить почему...

Тут уже так много объясняли, что я даже боюсь начинать!


Если очень хочется можно создать свой класс обёртку (чтоб и в Java 1.4 и 1.5 прокатило, в 1.5 работает точно ):

public class MyIntWrapper
{
    private int intTypeField;

    public MyIntWrapper() {}

    public MyIntWrapper(int intTypeParam)
    {
        this.intTypeField = intTypeParam;
    }

    public void setInt(int intTypeParam)
    {
        this.intTypeField = intTypeParam;
    }

    public int getInt()
    {
        return this.intTypeField;
    }
}



public class Test1
{
    public static void change(MyIntWrapper n)
    {
        n.setInt(5);
    }

    public static void main(String[] args)
    {
        MyIntWrapper n = new MyIntWrapper();
        System.out.println(n.getInt());
        change(n);
        System.out.println(n.getInt());
    }
}
Re[2]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 21.12.06 10:36
Оценка: +1
Здравствуйте, dshe, Вы писали:


D>Сошлюсь на себя Re: Pass Integer by reference
Автор: dshe
Дата: 23.12.05


D>Добавлю еще один вариант: в jakarta commons-lang есть Mutable типы Class MutableInt. Можно использовать их.


можно, верно. а для чего такие страдания? берем в руки C# и смотрим насколько все оказываца может проще и понятнее.

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


было бы понятно если бы добавление возможности передачи параметров byref было бы чем либо невероятно сложным, но в C# сделали ведь.

прошу обратить внимание, что передачи параметров byref дает возможность изменять не только внешние примитивные типы но и ССЫЛОЧНЫЕ.
Re[6]: передача параметра "по ссылке"
От: Trean Беларусь http://axamit.com/
Дата: 21.12.06 11:38
Оценка: +1
Здравствуйте, Тычеблин, Вы писали:

T>>Гм, позвольте, а где в java проблема с передачей изменяемых в методе объектов? Это только к примитивам относится, или вы хотите чтобы еще и значение передаваемой ссылки на объект можно было менять?


Т>да, обязательно, именно так. причем в объявлении параметров функции обязательно большими буквами BYREF !!!!!


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


Т>не пользуйся и баги будут все те же...неслышал чтобы программрование на C# более трудоемкое чем на JAVA.


T>>Буду рад если вы приведете кусочек кода, после которого у меня наступит прозрение чтобы понять, что я теряю сейчас.



Т>
Т>   public static void Swap(ref Object a, ref Object b)
Т>    {
Т>        Object temp = a;
Т>        a = b;
Т>        b = temp;
Т>    }
Т>.......

Т>// использование...где то в коде
Т>Object a=new Object;
Т>Object b=new Object;

Т>Swap(ref a, ref b)

Т>


Т>все.


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


Понятно, что на Java так же не напишешь, но я не вижу того, чтобы у меня прозрение наступило. Надо постоянно следить, как объявлена функция (особенно касается сторонних библиотек) и что она делает с переданными параметрами, чтобы не получилось сайд эффектов. Вот допустим, мне дали библиотеку в которой разработчик просто так написал (ref Object a, ref Object b) хотя их и не меняет (может быть), а мне надо чтобы ссылки после вызова метода ссылки гарантированно остались не изменными, мне надо где-то дописать const или вызывать надо Swap(a, b) или самому сохранять их? C# на мой взгляд уже перегружен кейвордами по самое не могу, скоро в C++ превратится для меня ref это усложнение с рассчетом, что разработчик будет очень внимательным.

Указанное выше поведение мне понадобилось считанное число раз, так что меня константность ссылок вполе устраивает
Re[13]: передача параметра "по ссылке"
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.12.06 12:01
Оценка: +1
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Курилка, Вы писали:


К>>И что ты пытаешься этим показать?

R>Мы пока еще на брудершафт не пи... не курили.
РСДН — демократичная среда, извините, если я Вас задел
Но имхо тут принято особо не "выкать", что формирует более простую манеру общения.

К>>Просто Объекты они только в ООП, поэтому при применении других подходов решение будет другим, ты же только про процедурное говоришь.

R>Вы неправы противопоставляя объектно-ориентированное программирование и функциональное. Есть одна класссификация: функциональный, по-другому декларативный подход (вложенные вызовы функций) и императивный подход (вычисления в виде инструкций). А есть другая классификация: объектно-ориентированный подход и процедурный.
R>К примеру, Java по умолчанию (!) следует и ООП, и императивному подходу. Так давайте мух с котлетами не будем мешать, да?
Только вот приведённая классификация и есть мешания мух с котлетами. Противопоставление декларативного и императивного, не есть противопоставление ООП и ФП. Вложенные вызовы функций не есть ФП, с другой стороны функциональное программирование вполне может сочетаться с императивным. Помимо всего этого есть, к примеру ещё и логическое программирование.
Но это уже какой-то глупый флейм выходит
Просто основной момент был — проме ООП и процедурного программирования существуют и другие подходы, причём их применять можно и в Java, причём и процедурное в том числе (e.g. static-методы по сути и являются теми самыми "процедурам")
Re[8]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 12:41
Оценка: -1
Здравствуйте, Тычеблин, Вы писали:

Т>документацию всегда нужно внимательно читать.

Железный аргумент, чтобы сделать людям жизнь посложнее.

Т>ref — однозначно указывает на определенное поведение. точка

Совсем неоднозначно: или ссылка измениться, или нет — сиди в debug и гадай, а если нет, то в определенный момент жди лавины необъяснимых глюков. dixi

Т>скорее всего пользоваться другой библиотекой.

Скорее всего? А поточнее можно? Ведь чтобы выбрать такую библиотеку, нужно будет все известные перебрать руками.

Т>представляю каким шоком было появление дженериков.

Очень неуместная попытка передернуть.
MS действительно постепено все сильнее и сильнее перегружает C# все новыми и новыми конструкциями, яркий пример постоянно привожу с непонятным богатством зоопарка модификаторов virtual-override-new-abstract. А C# 3.0 видели, добавление SQL в лексику языка — это такая остроумная шутка от MS?

Т>ок...как и предполагал — все свелось к вопросам вкусов ( о которых как известно не спорят)...

Не совсем. Полностью формализованная парадигма исключает адекватность вкусов. Любить делать криво можно, но за это придется платить. ООП не предполагает, что это правильно, значит в рамках ООП такого вкуса быть не может.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[6]: передача параметра "по ссылке"
От: Cider Россия  
Дата: 21.12.06 16:39
Оценка: +1
Здравствуйте, Тычеблин, Вы писали:

T>>Буду рад если вы приведете кусочек кода, после которого у меня наступит прозрение чтобы понять, что я теряю сейчас.

Т>
Т>   public static void Swap(ref Object a, ref Object b)
Т>    {
Т>        Object temp = a;
Т>        a = b;
Т>        b = temp;
Т>    }
Т>.......
Т>// использование...где то в коде
Т>Object a=new Object;
Т>Object b=new Object;

Т>Swap(ref a, ref b)

Т>

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

Остается за кадром вопрос — а на фига собственно нужна эта функция?
Cider
Re[8]: передача параметра "по ссылке"
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 21.12.06 16:56
Оценка: +1
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>Представьте — у нас есть большой массив. Надо в нём находить максимальное и минимальное значение.

ЕК>Было бы здорово сделать функцию, которая ищет их одновременно (это эффективно), но как? Массив возвращать? А как по функции

ЕК>int[] GetMinMaxValues(int[] values)


ЕК>понять, сколько значений она возвращает и в каком порядке?


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


Introduce Parameter Object refactoring.
http://denis-zhdanov.blogspot.com
Re[8]: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 17:57
Оценка: +1
Здравствуйте, Тычеблин, Вы писали:

Т>Здравствуйте, rsn81, Вы писали:



R>>В ООП по определению метод должен осуществлять обработку самого объекта, а не передаваемого ему.


Т> откуда такое определение?


Т>скажу мягко...это утверждение несоответствует действительности


Тогда отправляйся RTFM, как тут уже сказали. В основе ООП лежит канон Tell Don't Ask Поэтому если бы автор написал класс так:

class New 
{
    int n = 0;
    public static void change(int m)
    {
        n = m;
    }
    
    public static void main(String[]args)
    {

        change(m);
        System.out.print(n);
    }
}

у него и вопросов бы не было.

>Я так понимаю я не понял самой сути проблемы. Читая посты у меня сложилось впечатление что мое желание вообще с точки зрения java неправильно. Если так, то не могли бы вы мне объяснить почему...


Именно неправильно. Гугли по слову "инкапсуляция". Ты не должен лезть в другие объекты и менять их свойства в своих методах, свойства должны быть private, а ты должен дергать методы этих объектов и "просить" их менять свое свойство. Так правильно. Если у тебя программки не сложные и хочется писать процедурно, пиши на C, зачем себя мучать?
Re[9]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 19:56
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>у него и вопросов бы не было.

Не совсем, один принципиальный вопрос остался: как вы из статического метода change получили доступ к полю класса n? Компилироваться будет вот такой вариант:
package ru.rsdn.test;

class New {
  int n;

  void change(int m) {
    n = m;
  }

  public static void main(String[] args) {
    New _new = new New();
    _new.change(1);
    System.out.println(_new.n);
  }
}
Re[9]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 22.12.06 04:41
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Тычеблин, Вы писали:


Т>>Здравствуйте, rsn81, Вы писали:



R>>>В ООП по определению метод должен осуществлять обработку самого объекта, а не передаваемого ему.


Т>> откуда такое определение?


Т>>скажу мягко...это утверждение несоответствует действительности


А>Тогда отправляйся RTFM, как тут уже сказали. В основе ООП лежит канон Tell Don't Ask


рекомендую познакомиться с Visitor Design Pattern

А>
class New 
А>{
А>    int n = 0;
А>    public static void change(int m)
А>    {
А>        n = m;
А>    }
    
А>    public static void main(String[]args)
А>    {

А>        change(m);
А>        System.out.print(n);
А>    }
А>}


..а это небудет компилироваться.....
Re[6]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 22.12.06 04:45
Оценка: +1
Здравствуйте, Cider, Вы писали:

C>Здравствуйте, Евгений Коробко, Вы писали:


C>Пример, безусловно, хороший. Но стоит его немного дополнить — данная функиональность вызывается, наприсер, как веб-сервис.



... а если бы он вез патроны.....


....а если эта функциональность отрисовщика трехмерной векторной графики?
Re[7]: передача параметра "по ссылке"
От: Turtle.BAZON.Group  
Дата: 22.12.06 06:36
Оценка: +1
Здравствуйте, msqrt84, Вы писали:

M>Вы хотите сказать, что если сделать вот так

[...]
M>будет выводится "5"?

Не будет. В 1.4 и в 1.5 и предыдущих версиях классы Integer, Double и иже с ним дубли примитивов все немутабельные (нет методов-мутаторов, типа setЧегоТоТам). Поэтому при передаче по ссылке стандартного завертыша в Integer(int) получим точно такой же результат 0.

Почему так происходит (пример для java 1.4, для java 1.5 будет то же самое, только без оборачиваний, например Integer n = 0, работать будет одинаково).

 private static void change(Integer ch) // ch содержит ссылку на объект Integer со значением 0
 {
  // при этом ch находится в контексте функции change и имеет совсем разное значение, нежели n внутри main.
    // то есть по сути это две разные ссылки, указывающие на один объект на данном этапе
    ch = new Integer(6); // ch теперь содержит ссылку на объект Integer со значением 6, а n внутри main продолжает содержать ссылку на объект Integer со значением 0
 }
 
 public static void main(String[] args)
 {
    Integer n = new Integer(0); // переменной n устанавливается ссылка на объект Integer со значением 0
    change(n);
    System.out.println(n);
 }


То есть если хочется поменять, то необходимо оборачивать не в стандартный Integer, а какой-нибудь свой, у которого будет метод-мутатор для изменения его состояния, например, setValue. Как — было показано ниже.
... << RSDN@Home 1.2.0 alpha rev. 669>>
Re[6]: передача параметра "по ссылке"
От: Евгений Коробко  
Дата: 22.12.06 06:57
Оценка: +1
T>Создать класс с данными религия не позволяет?
Т.е. сделать класс "пара массивов даблов для расчёта корреляции и девиации"? Промолчу насчёт лезвия Оккама, хотелось бы просто поинтересоваться, как вы это себе представляете? Хранить в нём помимо массивов ещё поля для хранения промежуточных значений и флаги, что они уже посчитаны или нет? Вот красивое решение.

T> Тогда используйте массивы для передачи и возврата значений, от этого еще никто не умирал, красоты мало, зато первоманс высокий.

Перформанс высокий на голом С. Java — это решение немного поступиться перпомансом в пользу понятного и надёжного кода. Ну так вот, использование массивов — это отказ от статической (т.е. средставим компилятора) проверки числа аргументов, их порядка и, зачастую, пита. К каким опасностям это ведёт, думаю, очевидно. И чем это лучше передачи объектов byref, единственным минусом которого, как тут уже отмечалось, является то, что кто-то может написать byref там, где он не нужен, а пользователям этого кода потом будет плохо. (Аналогичная ситуация возникает, если метод в С++ забыли обозначить как const, хотя реально он таковым является).
Евгений Коробко
Re[9]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 22.12.06 11:50
Оценка: +1
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>В .NET изначально продумали этот момент и ничего не мешает иметь на одном компьютере столько версий .NET, сколько нужно.

Прошу прощения за offtop, но IIS v5.1 + (ASP.NET 2.0.50727 + ASP.NET 1.1.4322) имеет серьезную проблему: два сайта на разный фреймворках не могут работать в одном пуле приложений — в IIS v6 (Windows 2003 Server) эта проблема решена, а как там быть.

А JRE на одном хосте может быть столько, сколько копий каталога JRE: скопировал каталог JRE в текущий путь с исполняемой программой — готово. Тем более это разрешено лицензией Sun... как таким образом поступать с .NET, гм... он же куда только не кладет себя.

Так что вроде бы все совсем наоборот в действительности.
... << RSDN@Home 1.2.0 alpha rev. 655>>
передача параметра "по ссылке"
От: dev_m  
Дата: 21.12.06 06:34
Оценка:
Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.
В сях:
void set(int&n);

, а как в jave?
Re: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 07:24
Оценка:
Здравствуйте, dev_m, Вы писали:

_>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.

_>В сях:
_>
_>void set(int&n);
_>

_> , а как в jave?

Издеваешься? В жаве ВСЯ работа с объектами по ссыкам.
Re[2]: передача параметра "по ссылке"
От: dev_m  
Дата: 21.12.06 07:27
Оценка:
А>Издеваешься? В жаве ВСЯ работа с объектами по ссыкам.
Ну я честно не знаю.
Вот пишу и выводится 0:

class New 
{
    public static void change(int n)
    {
        n = 5;
    }
    
    public static void main(String[]args)
    {
        int n = 0;
        change(n);
        System.out.print(n);
    }
}
Re[3]: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 07:30
Оценка:
Здравствуйте, dev_m, Вы писали:

_>
_>class New 
_>{
_>    public static void change(int n)
_>    {
_>        n = 5;
_>    }
    
_>    public static void main(String[]args)
_>    {
_>        int n = 0;
_>        change(n);
_>        System.out.print(n);
_>    }
_>}
_>


так int — это не объект, а примитв.
Если посморишь на метоты Integer-а, то поймешь в чем прикол.
Re[4]: передача параметра "по ссылке"
От: dev_m  
Дата: 21.12.06 07:54
Оценка:
А>так int — это не объект, а примитв.
А>Если посморишь на метоты Integer-а, то поймешь в чем прикол.
Ну в данном та случае вопрос стоит как получить int, неужели нельзя так делать??
Re[3]: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 07:57
Оценка:
When Java passes an argument into a method call, a copy of the argument is actually passed.
Consider the following code fragment:

double radians = 1.2345;
System.out.println("Sine of " + radians + " = " + Math.sin(radians));


The variable radians contains a pattern of bits that represents the number 1.2345. On line 2,
a copy of this bit pattern is passed into the method-calling apparatus of the JVM.
When an argument is passed into a method, changes to the argument value by the method
do not affect the original data. Consider the following method:

public void bumper(int bumpMe) {
bumpMe += 15;
}


Line 2 modifies a copy of the parameter passed by the caller. For example

int xx = 12345;
bumper(xx);
System.out.println(“Now xx is “ + xx);


On line 2, the caller’s xx variable is copied; the copy is passed into the bumper() method and
incremented by 15. Because the original xx is untouched, line 3 will report that xx is still
12345.
This is also true when the argument to be passed is an object rather than a primitive. However,
it is crucial for you to understand that the effect is very different. In order to understand
the process, you have to understand the concept of the object reference.
Java programs do not deal directly with objects. When an object is constructed, the constructor
returns a value—a bit pattern—that uniquely identifies the object. This value is known as a
reference to the object. For example, consider the following code:

1. Button btn;
2. btn = new Button("Ok");


In line 2, the Button constructor returns a reference to the just-constructed button—not the
actual button object or a copy of the button object. This reference is stored in the variable btn.
In some implementations of the JVM, a reference is simply the address of the object; however,
the JVM specification gives wide latitude as to how references can be implemented. You can
think of a reference as simply a pattern of bits that uniquely identifies an individual object.
Re[3]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 08:02
Оценка:
Здравствуйте, dev_m, Вы писали:

_>
_>class New 
_>{
_>    public static void change(int n)
_>    {
_>        n = 5;
_>    }
    
_>    public static void main(String[]args)
_>    {
_>        int n = 0;
_>        change(n);
_>        System.out.print(n);
_>    }
_>}
_>

Даже если бы этот код, работал так, как вы хотите — в чем его философский смысл?

Только вчера знакомый сетовал, что "в Java примитивные типы нельзя передать по ссылке". Мы посмотрели его пример. В объекте был метод, выполняющий некоторое вычисление, результат которого — два коэффициента, которые он пытался по старой привычке передать наружу по ссылке.

В итоге... я спросил его:
1) Почему, раз метод не обращается ни к каким членам объекта, он не объявлен как статичный?
2) Если кроме этого метода (по сути статичного) в классе ничего нет, зачем этот класс?

Пришли к выводу, что он пытается писать на ООП-языке процедурно. На самом деле нестатичный метод объекта должен обрабатывать некоторое внутреннее состояние объекта, которое характеризуется полями класса. То есть его коэффициенты должны быть полями класса, которые метод после вычисления должен инициализировать.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[4]: передача параметра "по ссылке"
От: Michael Ponomarev Россия  
Дата: 21.12.06 08:07
Оценка:
Hi, Аноним!

public class ObjectTest {

public static void byValue(String s) {
String newS = new String("newS");
s = newS;
System.out.println("newS in byValue = " + newS);
System.out.println("s in byValue = " + s);
}
public static void main(String[] args) {
String s = "s";
System.out.println("s in main = " + s);
byValue(s);
System.out.println("s in main = " + s);
}
}


WBR, Michael Ponomarev.
Posted via RSDN NNTP Server 2.0
Re[6]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 08:10
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Обворачивай в объект и вперёд.

-1
Бред.

В ООП по определению метод должен осуществлять обработку самого объекта, а не передаваемого ему. То есть правильно в вашей терминологии сказать: "Оборачивай в объект New" — то есть делай n — полем класса New, который содержит метод change.

Не верите мне, читайте Глава из книги “ Объектно-ориентированные методы. Принципы и практика”
Автор(ы): Иан Грэхем
Дата: 10.11.2006
Глава из книги "Объектно-ориентированные методы. Принципы и практика".

Материал предоставлен издательством Вильямс.
:

В данном же контексте метод (method) определяется как процедура или функция, которая изменяет состояние объекта или заставляет объект отправить сообщение.


А> Или ретурнь результат. Это уж от как красифше по задаче будет )

+1
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[7]: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 08:17
Оценка:
Здравствуйте, rsn81, Вы писали:

R>В ООП по определению метод должен осуществлять обработку самого объекта, а не передаваемого ему. То есть правильно в вашей терминологии сказать: "Оборачивай в объект New" — то есть делай n — полем класса New, который содержит метод change.


А он тебе сказал в чем его задача?
Может этот примитив и есть элемент состояния объекта класса, который он еще не создал?
Вобщем задачи бывают разные и не стоит так умничать не выяснив подробностей.
Re[6]: передача параметра "по ссылке"
От: msqrt84 Россия  
Дата: 21.12.06 08:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, dev_m, Вы писали:


_>>Ну в данном та случае вопрос стоит как получить int, неужели нельзя так делать??


А>Обворачивай в объект и вперёд. Или ретурнь результат. Это уж от как красифше по задаче будет )


Вы хотите сказать, что если сделать вот так
public class Test
{
    public static void change(Integer n)
    {
        n = 5;
    }

    public static void main(String[] args)
    {
        Integer n = 0;        
        change(n);
        System.out.print(n);
    }
}


будет выводится "5"?
Re[5]: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 08:27
Оценка:
public class Test
{

    public static void main(String[] args)
    {
        T t = new T();
        System.out.println("s in main = " + t.s);
        
        t.s = "2";
        System.out.println("s in main = " + t.s);
    }
}

class T
{
    public String s = "1";
}


s in main = 1
s in main = 2

Гы. В классе String заметна защита от дураков = нет методов изменения самого объекта строки )
Re[5]: передача параметра "по ссылке"
От: SmaLL75 Россия http://smallweb.narod.ru
Дата: 21.12.06 08:27
Оценка:
Здравствуйте, dev_m, Вы писали:

А>>так int — это не объект, а примитв.

А>>Если посморишь на метоты Integer-а, то поймешь в чем прикол.
_>Ну в данном та случае вопрос стоит как получить int, неужели нельзя так делать??

Java не C !!! Смирись либо умри!
Что ни делается, всЁ к лучшему
Re[8]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 08:28
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А он тебе сказал в чем его задача?

Да, у него был тупой с точки зрения ООП и сложный с точки зрения математики вычислитель. Посоветовал переписать его на Matlab, то есть процедурном (!) m-языке.

А>Может этот примитив и есть элемент состояния объекта класса, который он еще не создал?

Вы внимательно прочли процитированное? Метод должен обрабатывать внутренее состояние самого (!) объекта, содержащего данный метод (!).

А>Вобщем задачи бывают разные и не стоит так умничать не выяснив подробностей.

Пример такой задачи в подробностях?
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[6]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 08:30
Оценка:
Здравствуйте, SmaLL75, Вы писали:

SLL>Java не C !!! Смирись либо умри!

И не C#, кстати — там такой бред тоже возможен.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[8]: передача параметра "по ссылке"
От: msqrt84 Россия  
Дата: 21.12.06 08:34
Оценка:
Здравствуйте, fellow.sufferer, Вы писали:

FS>Здравствуйте, msqrt84, Вы писали:


M>>будет выводится "5"?


FS>1.5 портит людей. попробуй тож самое на 1.4 и узрей косяк.


У меня стоит 1.5 — выводится 0. Я так понимаю, в 1.4 выводится 5?
Re[6]: передача параметра "по ссылке"
От: Michael Ponomarev Россия  
Дата: 21.12.06 08:44
Оценка:
Hi, Аноним!

public class ObjectTest {

    public static void byValue(Test t) {
        Test anotherT = new Test();
        anotherT.i = 2;
        t = anotherT;
        System.out.println("anotherT.i in byValue = " + anotherT.i);
        System.out.println("t.i in byValue = " + t.i);
    }
    public static void main(String[] args) {
        Test t = new Test();
        t.i = 1;
        System.out.println("t.i in main = " + t.i);
        byValue(t);
        System.out.println("t.i in main = " + t.i);
    }
}

class Test {
    public int i;
}


Ну и где здесь по ссылке?
Другое дело, конечно если внутри метода byValue мы напишем t.i = 5;

WBR, Michael Ponomarev.
Posted via RSDN NNTP Server 2.0
Re[7]: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 08:49
Оценка:
Ну ты прочитай еще раз внимательно:
http://rsdn.ru/Forum/Message.aspx?mid=2274017&amp;only=1
Автор:
Дата: 21.12.06


примытивам копируются значения
объекты передаются по ссылке
Re[8]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 08:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>примытивам копируются значения

А>объекты передаются по ссылке
передается "примитивный" указатель на объект by-value.
Семантически — по ссылке, фактически — по значению.
Re[2]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 21.12.06 08:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, dev_m, Вы писали:


_>>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.

_>>В сях:
_>>
_>>void set(int&n);
_>>

_>> , а как в jave?

А>Издеваешься? В жаве ВСЯ работа с объектами по ссыкам.


издеваешься ? где ты увидел передачу объекта?
Re[9]: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 09:01
Оценка:
Здравствуйте, aka50, Вы писали:

A>передается "примитивный" указатель на объект by-value.

A>Семантически — по ссылке, фактически — по значению.

Примитивный указатель — эт что-то новенькое) А как он выглядит?
Только не увлекайся с описаниями, что бы мне потом ночью кошмары не снились)
Re[3]: передача параметра "по ссылке"
От: fellow.sufferer Россия  
Дата: 21.12.06 09:02
Оценка:
Здравствуйте, Тычеблин, Вы писали:

Т>издеваешься ? где ты увидел передачу объекта?


А что еще, извините, можна "по ссылке" передавать?
Re[10]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 09:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, aka50, Вы писали:


A>>передается "примитивный" указатель на объект by-value.

A>>Семантически — по ссылке, фактически — по значению.

А>Примитивный указатель — эт что-то новенькое) А как он выглядит?

А>Только не увлекайся с описаниями, что бы мне потом ночью кошмары не снились)

    MyObject obj = new MyObject();
    obj = new MyObject();

Что есть obj?
Re: передача параметра "по ссылке"
От: tavr  
Дата: 21.12.06 09:18
Оценка:
Здравствуйте, dev_m, Вы писали:

_>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.

можно передать объект, содержащий примитив, например int[]{1}
но делать так без крайних случаев не рекомендуется

существует даже практика делать ссылки на передаваемые объекты неизменяемыми с помощью final
public String convert(final String source)
{
    String dest = new String(source);
    ...
    return dest;
}
Re[4]: передача параметра "по ссылке"
От: Trean Беларусь http://axamit.com/
Дата: 21.12.06 09:20
Оценка:
Здравствуйте, fellow.sufferer, Вы писали:

FS>Здравствуйте, Тычеблин, Вы писали:


Т>>издеваешься ? где ты увидел передачу объекта?


FS>А что еще, извините, можна "по ссылке" передавать?


Можно саму ссылку по значению передать Значение ссылки не можем изменить в методе, так чтобы снаружи оно поменялось, там где ее передали.
Re[5]: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 09:25
Оценка:
Здравствуйте, Trean, Вы писали:

T>Можно саму ссылку по значению передать Значение ссылки не можем изменить в методе, так чтобы снаружи оно поменялось, там где ее передали.


Ну так и надо было спрашивать — "передача ссылки по ссылке".
Re[11]: передача параметра "по ссылке"
От: fellow.sufferer Россия  
Дата: 21.12.06 09:29
Оценка:
Здравствуйте, Michael Ponomarev, Вы писали:

MP>В конце концов, это не так важно, гораздо важнее понимание того, что передача ссылок

MP>в качестве параметров может привести к неожиданным изменениям внешних
MP>объектов.

Раз тебе не важно, чо ты паришь-то меня?
Re[13]: передача параметра "по ссылке"
От: fellow.sufferer Россия  
Дата: 21.12.06 09:35
Оценка:
То есть ты щас повторил, то что я написал от своего имени и этим типа избежал ответа на вопрос)
Хорошая попытка)
Re[6]: передача параметра "по ссылке"
От: dev_m  
Дата: 21.12.06 09:44
Оценка:
А>Обворачивай в объект и вперёд. Или ретурнь результат. Это уж от как красифше по задаче будет )
Return не покатит, так как возвращаемый параметр не один, ну разве хоть массив несвязаных параметров возвращай.

Как его в объект обернуть, так чтобы помогло я не понял. У меня пример с Integer тоже не работает.
Насчет обсуждений о правильности с точки зрения ООП, обсуждаемой ниже.
Я тут привел код, который написал прямо в ответнике, чтобы иллюстрировать свою проблему — не знание, как получить объект/обычную переменную из функции(чем я раньше регулярно пользовался в с++), кроме как через return. Насчет того, что n должно быть полем класса — ну, в данный момент я хочу изменять и получать состояния вообще другого класса...
Да, горячая получилось темка, совсем не ожидал....
Я так понимаю я не понял самой сути проблемы. Читая посты у меня сложилось впечатление что мое желание вообще с точки зрения java неправильно. Если так, то не могли бы вы мне объяснить почему...
Re[14]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 09:48
Оценка:
Здравствуйте, fellow.sufferer, Вы писали:

FS>То есть ты щас повторил, то что я написал от своего имени и этим типа избежал ответа на вопрос)

FS>Хорошая попытка)

чтоб было понятнее... основная твоя ошибка здесь:
FS>3. obj = new MyObject(); — создал объект и установил ссылку.
изменил значение указателя

Правильное слово будет "изменил", и тогда становится понятно что
есть "примитивный" указатель... он в кавычках, т.к. что int, что
ссылка передаются по значению...
Re[15]: передача параметра "по ссылке"
От: fellow.sufferer Россия  
Дата: 21.12.06 09:51
Оценка:
Здравствуйте, aka50, Вы писали:

A>Правильное слово будет "изменил", и тогда становится понятно что

A>есть "примитивный" указатель... он в кавычках, т.к. что int, что
A>ссылка передаются по значению...

Ну так чем же "примитивный" указатель отличается от указателя?
Re[14]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 09:52
Оценка:
Здравствуйте, fellow.sufferer, Вы писали:

FS>То есть ты щас повторил, то что я написал от своего имени и этим типа избежал ответа на вопрос)

FS>Хорошая попытка)

К стати, поясни еще такой код, что с чем сравниваем?
Только пожалуйста без сферических "ссылок", а что конкретно
происходит...

   Integer obj = new Integer(1);
   Integer obj2 = new Integer(1);
   if (obj == obj2) {
         
   }
Re[16]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 09:54
Оценка:
Здравствуйте, fellow.sufferer, Вы писали:

FS>Здравствуйте, aka50, Вы писали:


A>>Правильное слово будет "изменил", и тогда становится понятно что

A>>есть "примитивный" указатель... он в кавычках, т.к. что int, что
A>>ссылка передаются по значению...

FS>Ну так чем же "примитивный" указатель отличается от указателя?


В том, что (ну и например при ==) ведет себя как
любой примитивный тип (примерно как int).
Re[15]: передача параметра "по ссылке"
От: Аноним  
Дата: 21.12.06 09:54
Оценка:
Тебе не проще в спеке поискать ответ?
Или те прост ов кайф вопросы задавать?
Re[7]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 09:57
Оценка:
Здравствуйте, dev_m, Вы писали:

_>Я так понимаю я не понял самой сути проблемы. Читая посты у меня сложилось впечатление что мое желание вообще с точки зрения java неправильно. Если так, то не могли бы вы мне объяснить почему...

Вот именно. Прочтите сообщение Re[6]: передача параметра "по ссылке"
Автор: rsn81
Дата: 21.12.06
(там ссылка есть полезная) и сообщение Re[10]: передача параметра "по ссылке"
Автор: Michael Ponomarev
Дата: 21.12.06
.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[17]: передача параметра "по ссылке"
От: fellow.sufferer Россия  
Дата: 21.12.06 09:57
Оценка:
Здравствуйте, aka50, Вы писали:

FS>>Ну так чем же "примитивный" указатель отличается от указателя?


A>В том, что (ну и например при ==) ведет себя как

A>любой примитивный тип (примерно как int).

То есть "примитивный" указатель ведёт себя как int, а указатель как кто себя ведёт?)))
Re[12]: передача параметра "по ссылке"
От: Michael Ponomarev Россия  
Дата: 21.12.06 10:03
Оценка:
Hi, fellow.sufferer!

fs> Раз тебе не важно, чо ты паришь-то меня?


Я тебя не "парю".
это все слова Эккеля.

WBR, Michael Ponomarev.
Posted via RSDN NNTP Server 2.0
Re[7]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 10:05
Оценка:
Здравствуйте, dev_m, Вы писали:

А>>Обворачивай в объект и вперёд. Или ретурнь результат. Это уж от как красифше по задаче будет )

_>Return не покатит, так как возвращаемый параметр не один, ну разве хоть массив несвязаных параметров возвращай.
Не понял... ведь если ты передаешь ссылку на объект, внутри функции ты этот объект можешь менять (
блин, чего вот в жаве нет, так это старого доброго const )
Если ты оперируешь примитивными типами... тут действительно overhead, ибо придется извращаться...

_>Я тут привел код, который написал прямо в ответнике, чтобы иллюстрировать свою проблему — не знание, как получить объект/обычную переменную из функции(чем я раньше регулярно пользовался в с++), кроме как через return. Насчет того, что n должно быть полем класса — ну, в данный момент я хочу изменять и получать состояния вообще другого класса...

А почему у другого класса не сделать пропертю типа getMySuperState1, getMySuperState2? Есть большая вероятность inline jit-ом,
что уберет вызовы функции вообще?

_>Я так понимаю я не понял самой сути проблемы. Читая посты у меня сложилось впечатление что мое желание вообще с точки зрения java неправильно. Если так, то не могли бы вы мне объяснить почему...


В java все есть объект, и нужно привыкнуть к тому, что все простые операции типа =, == оперируют над простыми типами
и ссылками на объекты (т.е. new Integer(1) != new Integer(1), т.к. это два разных объекта, правильно
new Integer(1).equals(new Integer(1)).

По этому если тебе страсть как надо передать объект для модификации придется либо поступить
правильно, т.е. вернуть новое значение (n = someFunction(n)) либо обернуть это дело в объект
(типа класса Test выше), либо изспользовать массив (изврат) int [] = new int[1] = {1};
Re[18]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 10:09
Оценка:
Здравствуйте, fellow.sufferer, Вы писали:

FS>Здравствуйте, aka50, Вы писали:


FS>>>Ну так чем же "примитивный" указатель отличается от указателя?


A>>В том, что (ну и например при ==) ведет себя как

A>>любой примитивный тип (примерно как int).

FS>То есть "примитивный" указатель ведёт себя как int, а указатель как кто себя ведёт?)))


"Поздравляю Шарик — ты балбес" (с) Матроскин

примитивный... ну если тебе легче, есть еще weak .
Re: передача параметра "по ссылке"
От: dshe  
Дата: 21.12.06 10:11
Оценка:
Здравствуйте, dev_m, Вы писали:

_>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.

_>В сях:
_>
_>void set(int&n);
_>

_> , а как в jave?

Сошлюсь на себя Re: Pass Integer by reference
Автор: dshe
Дата: 23.12.05


Добавлю еще один вариант: в jakarta commons-lang есть Mutable типы Class MutableInt. Можно использовать их.
--
Дмитро
Re[3]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 21.12.06 10:14
Оценка:
Здравствуйте, Trean, Вы писали:


T>Это неудобство проявляется в основном при математических вычислениях, при попытке использования процедурного подхода в Java (через статические методы к примеру). Не помню, чтобы мне это где-то еще могло пригодиться, но я особо по этому поводу не расстраивался.


до момента переписывания кода под C# я тоже особенно — то и не перживал относясь к этой проблемме как к явлению природы...

если аквариумных рыбок вылить в пруд они еще долго будут плавать в периметре уже отсутствующего аквариума...

так и я, начав переписывать код, некоторое время, делал это в стиле JAVA ...
прозрение наступило позже...
одним словом, это нужно реально ощутить на практике.
уверяю, контраст разительный.
и дело не только в примитивах. считаю возможность передавать ЛЮБЫЕ переменные byref важнее и полезне чем дженерики.
Re[8]: передача параметра "по ссылке"
От: Trean Беларусь http://axamit.com/
Дата: 21.12.06 10:15
Оценка:
Здравствуйте, aka50, Вы писали:

A>Здравствуйте, dev_m, Вы писали:


А>>>Обворачивай в объект и вперёд. Или ретурнь результат. Это уж от как красифше по задаче будет )

_>>Return не покатит, так как возвращаемый параметр не один, ну разве хоть массив несвязаных параметров возвращай.
A>Не понял... ведь если ты передаешь ссылку на объект, внутри функции ты этот объект можешь менять (
A>блин, чего вот в жаве нет, так это старого доброго const )

А в чем проблема сделать интерфейс только с get методами, типа:
MyInterface {

Object getValue();

}

MyImpl implements MyInterface {

Object getValue() {...}

setValue(Object obj)

}

...
method(MyInterface obj) {

...

}


Конечно, это не 100% защита, но вполне хватает, чтобы избежать случайных изменений объекта. Или вообще сделать immutable.
Re[19]: передача параметра "по ссылке"
От: Blazkowicz Россия  
Дата: 21.12.06 10:20
Оценка:
Здравствуйте, aka50, Вы писали:

A>"Поздравляю Шарик — ты балбес" (с) Матроскин

Зарываешься.

A>примитивный... ну если тебе легче, есть еще weak .

Ок. Есть Weak, Soft, Strong, Phantom. "Примитивный" это какой?
Re[7]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 21.12.06 10:21
Оценка:
Здравствуйте, rsn81, Вы писали:


R>В ООП по определению метод должен осуществлять обработку самого объекта, а не передаваемого ему.


откуда такое определение?

скажу мягко...это утверждение несоответствует действительности
Re[13]: передача параметра "по ссылке"
От: Blazkowicz Россия  
Дата: 21.12.06 10:21
Оценка:
Здравствуйте, Michael Ponomarev, Вы писали:

MP>Я тебя не "парю".

MP>это все слова Эккеля.

Во избежание подобных недоразумений цитаты рекомендуется оформлять как цитаты.
Re[8]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 10:45
Оценка:
Здравствуйте, Тычеблин, Вы писали:

Т> откуда такое определение?

Re[6]: передача параметра "по ссылке"
Автор: rsn81
Дата: 21.12.06
(ссылка в сообщении)

Т>скажу мягко...это утверждение несоответствует действительности

Скажу твердо: RTFM! В рамках ООП — соответствует. Конечно, если вы пишете процедурно, то...
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[9]: передача параметра "по ссылке"
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.12.06 10:54
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Тычеблин, Вы писали:


Т>> откуда такое определение?

R>Re[6]: передача параметра "по ссылке"
Автор: rsn81
Дата: 21.12.06
(ссылка в сообщении)


Т>>скажу мягко...это утверждение несоответствует действительности

R>Скажу твердо: RTFM! В рамках ООП — соответствует. Конечно, если вы пишете процедурно, то...
А если функционально?
Использовать другие подходы кроме ООП нонче запрещается?
Re[5]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 21.12.06 11:04
Оценка:
Здравствуйте, Trean, Вы писали:

T>Здравствуйте, Тычеблин, Вы писали:


T>Я на C/C++ писал в открытом море, и когда, если следовать вашей аналогии меня засунули в аквариум, я даже не расстроился потери int& или int*.






Т>>так и я, начав переписывать код, некоторое время, делал это в стиле JAVA ...

Т>>прозрение наступило позже...
Т>>одним словом, это нужно реально ощутить на практике.
Т>>уверяю, контраст разительный.
Т>>и дело не только в примитивах. считаю возможность передавать ЛЮБЫЕ переменные byref важнее и полезне чем дженерики.

T>Гм, позвольте, а где в java проблема с передачей изменяемых в методе объектов? Это только к примитивам относится, или вы хотите чтобы еще и значение передаваемой ссылки на объект можно было менять?


да, обязательно, именно так. причем в объявлении параметров функции обязательно большими буквами BYREF !!!!!

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


не пользуйся и баги будут все те же...неслышал чтобы программрование на C# более трудоемкое чем на JAVA.

T>Буду рад если вы приведете кусочек кода, после которого у меня наступит прозрение чтобы понять, что я теряю сейчас.



   public static void Swap(ref Object a, ref Object b)
    {
        Object temp = a;
        a = b;
        b = temp;
    }
.......

// использование...где то в коде
Object a=new Object;
Object b=new Object;

Swap(ref a, ref b)


все.

как это сделать на JAVA я знаю...но можешь написать для усугубления осчущения.
Re[9]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 21.12.06 11:07
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Тычеблин, Вы писали:


Т>> откуда такое определение?

R>Re[6]: передача параметра "по ссылке"
Автор: rsn81
Дата: 21.12.06
(ссылка в сообщении)


Т>>скажу мягко...это утверждение несоответствует действительности

R>Скажу твердо: RTFM! В рамках ООП — соответствует. Конечно, если вы пишете процедурно, то...

ну натыкал бы меня носом...мне ж интересно где в ООП такое написано.

(приведеную ссылку прочел, просветления не наступило )
Re[10]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 11:16
Оценка:
Здравствуйте, Курилка, Вы писали:

К>А если функционально?

А вы пробовали? Попробуйте, к примеру, в XSLT-преобразовании такое сделать...

К>Использовать другие подходы кроме ООП нонче запрещается?

Не понял шутку юмора.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[11]: передача параметра "по ссылке"
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.12.06 11:29
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Курилка, Вы писали:


К>>А если функционально?

R>А вы пробовали? Попробуйте, к примеру, в XSLT-преобразовании такое сделать...
И что ты пытаешься этим показать?
Просто Объекты они только в ООП, поэтому при применении других подходов решение будет другим, ты же только про процедурное говоришь.

К>>Использовать другие подходы кроме ООП нонче запрещается?

R>Не понял шутку юмора.

просто ООП — не единственный подход к решению задач, порой другие варианты более удобны.
Re[15]: передача параметра "по ссылке"
От: JITM  
Дата: 21.12.06 11:30
Оценка:
Здравствуйте, aka50, Вы писали:

A>Здравствуйте, fellow.sufferer, Вы писали:


FS>>То есть ты щас повторил, то что я написал от своего имени и этим типа избежал ответа на вопрос)

FS>>Хорошая попытка)

A>чтоб было понятнее... основная твоя ошибка здесь:

FS>>3. obj = new MyObject(); — создал объект и установил ссылку.
A>изменил значение указателя

А что если ипользуеться слово установил то этио значит что ничего не изменилось . .??? По-моему если что -то кто -то установил, то по-любому над чем происходила эта операция было изменено!!!!

A>Правильное слово будет "изменил", и тогда становится понятно что

A>есть "примитивный" указатель... он в кавычках, т.к. что int, что
A>ссылка передаются по значению...
Re[7]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 21.12.06 12:15
Оценка:
Здравствуйте, Trean, Вы писали:

T>Понятно, что на Java так же не напишешь, но я не вижу того, чтобы у меня прозрение наступило.


...мы такие разные....

T>Надо постоянно следить, как объявлена функция (особенно касается сторонних библиотек) и что она делает с переданными параметрами, чтобы не получилось сайд эффектов. Вот допустим, мне дали библиотеку в которой разработчик просто так написал (ref Object a, ref Object b) хотя их и не меняет (может быть),


документацию всегда нужно внимательно читать.
ref — однозначно указывает на определенное поведение. точка

T> а мне надо чтобы ссылки после вызова метода ссылки гарантированно остались не изменными, мне надо где-то дописать const или вызывать надо Swap(a, b) или самому сохранять их?


скорее всего пользоваться другой библиотекой.

T>C# на мой взгляд уже перегружен кейвордами по самое не могу, скоро в C++ превратится для меня ref это усложнение с рассчетом, что разработчик будет очень внимательным.


представляю каким шоком было появление дженериков.

T>Указанное выше поведение мне понадобилось считанное число раз, так что меня константность ссылок вполе устраивает


ок...как и предполагал — все свелось к вопросам вкусов ( о которых как известно не спорят)...

ну да ладно, я просто хотел донести свое вИдение. надеюсь был понятен.
Re[14]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 21.12.06 12:21
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, rsn81, Вы писали:



К>Но это уже какой-то глупый флейм выходит

К>Просто основной момент был — проме ООП и процедурного программирования существуют и другие подходы,

может я чего не понимаю, но всё начилось с утверждения

rsn81> В ООП по определению метод должен осуществлять обработку самого объекта, а не передаваемого ему.


чему я например был ....удивлен.
Re[14]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 21.12.06 12:23
Оценка:
Здравствуйте, Курилка, Вы писали:

И в чем спор-то? Вы и я — говорим одно и тоже за одним исключением: вы мне пытаетесь что-то доказать. Да, я как раз и начал писать, что раз классификации разные, значит возможны пересечения. Про то, что static-программирование в Java есть не что иное, как процедурное программирование, тоже вроде озвучивал выше.

Так о чем вы, в чем хотите меня переубедить?
В том, что если писать на Java функционально, то понадобиться передать параметр по ссылке, пример приведете — поверю.

И потом по умолчанию Java ООЯ, это подразумевает удобство и достижение максимальной эффективности именно с использованием ООП, так что по-моему в этой теме такой разговор действительно флейм.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[7]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 21.12.06 12:25
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Тычеблин, Вы писали:


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

R>Каков пример, таков и ответ:
Object a = new Object;
R>Object b = new Object;
R>// вместо Swap(ref a, ref b)
R>Object temp = a;
R>a = b;
R>b = temp;


верно, так оно и есть...
Яркий пример виртуозного владения технологией Copy&Paste.
Re[20]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 12:30
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, aka50, Вы писали:


A>>"Поздравляю Шарик — ты балбес" (с) Матроскин

B>Зарываешься.
Упс... согласен.

A>>примитивный... ну если тебе легче, есть еще weak .

B>Ок. Есть Weak, Soft, Strong, Phantom. "Примитивный" это какой?
Пусть будет Strong. Я не про это говорил, а про принцип
передачи byvalue ccылки в функицию... или ты хочешь
сказать что это происходит иначе?
Re[20]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 12:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, aka50, Вы писали:


A>>примитивный... ну если тебе легче, есть еще weak .


А>А ты можешь просто ответить на вопрос, который сам же и вызвал введением новых терминов?

А>Как же себя ведет при сравнении (==) "не_примитивный" указатель, если "примитивный" ведет себя как int?

Еще раз... "примитивный" == с семантикой примитивного типа. Все. Точка.
Он указатель, ссылается на объект и при передаче в функцию копируется,
как примитивный тип, т.е. поменять внутри функции этот указатель можно
(если не final), но это не повлияет на указатель вне функции.

Я объяснял человеку из c++, там есть понятие указатель. Вот и использовал
этот термин. В java суть ссылка = сложный объект с семантикой примитивного
типа. Усе.
Re[16]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 12:52
Оценка:
Здравствуйте, JITM, Вы писали:

JIT>Здравствуйте, aka50, Вы писали:


A>>чтоб было понятнее... основная твоя ошибка здесь:

FS>>>3. obj = new MyObject(); — создал объект и установил ссылку.
A>>изменил значение указателя

JIT>А что если ипользуеться слово установил то этио значит что ничего не изменилось . .??? По-моему если что -то кто -то установил, то по-любому над чем происходила эта операция было изменено!!!!


Если уж докапываться до слов, по по полной.

"Куда он установил ссылку?".
Изменить можно что-то (т.е. ссылку как некий объект, по этому я испльзовал слово указатель,
как понятное тем, кто работал в С++, т.к. это некая переменная значением которой является
ссылка на объект). Установить можно что-то куда-то... дык вот вопрос, куда установлена ссылка?
Я понял как установлена на объект. Но она должна где-то хранится, вот в переменной типа "указатель"
она и хранится.

И вообще, это все в любой более менее толстой книжке расписано и цитату выше приводили...
Re[9]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 21.12.06 13:13
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Тычеблин, Вы писали:


Т>>документацию всегда нужно внимательно читать.

R>Железный аргумент, чтобы сделать людям жизнь посложнее.

вообщето это я тебя
Автор: rsn81
Дата: 21.12.06
цитировал

Скажу твердо: RTFM!



Т>>ref — однозначно указывает на определенное поведение. точка

R>Совсем неоднозначно: или ссылка измениться, или нет — сиди в debug и гадай, а если нет, то в определенный момент жди лавины необъяснимых глюков. dixi

ref — утверждает ненужно надеятся что ссылка не изменится...все.какие гадания?
ты ведь не гадаешь что вернет функция ноль или 338.

было бы полезнее услышать твой комментарий на предмет тебе известный.
Re[17]: передача параметра "по ссылке"
От: JITM  
Дата: 21.12.06 13:30
Оценка:
Здравствуйте, aka50, Вы писали:

A>Здравствуйте, JITM, Вы писали:


A>Если уж докапываться до слов, по по полной.


A>"Куда он установил ссылку?".

A>Изменить можно что-то (т.е. ссылку как некий объект, по этому я испльзовал слово указатель,
A>как понятное тем, кто работал в С++, т.к. это некая переменная значением которой является
A>ссылка на объект). Установить можно что-то куда-то... дык вот вопрос, куда установлена ссылка?
A>Я понял как установлена на объект. Но она должна где-то хранится, вот в переменной типа "указатель"
A>она и хранится.

A>И вообще, это все в любой более менее толстой книжке расписано и цитату выше приводили...

Я всё это прекрасно понимаю и те толстые книги читал, но вы либо сами запутались в своих рассуждениях либо не правильные слова выбираете для выражения своих мыслей!!!!
Ссылка это не обьект а значение обекта, ключевое слово значение!!! Да действительно в памяти она храниться как указательна некий созданый обьект.., но это по -моему понятно и ребёнку, так что зачем такой флейм было разводить что есть что не пойму , и при этом всём ещё и некоректно описано суть!!! Возможно вы и понимаете правильно, но раз так то и соизвольте так же писать а не то как написано выше!

Вот цытата из той толстой книги и так Еккель указывает что есть обьект и что есть ссылка, что бы вы больше не писали

т.е. ссылку как некий объект

:

Не бывает локальных объектов, бывают только локальные ссылки.
У ссылок есть "границы видимости", а у объектов их нет.
В Java программист не может управлять временем жизни объектов.
В Java нет средств (таких, как константы) для защиты объекта от изменений (например для защиты от негативных последствий использования дублирующих ссылок).

Re[18]: передача параметра "по ссылке"
От: aka50 Россия  
Дата: 21.12.06 14:08
Оценка:
Здравствуйте, JITM, Вы писали:

JIT>Здравствуйте, aka50, Вы писали:


A>>Здравствуйте, JITM, Вы писали:


JIT>либо не правильные слова выбираете для выражения своих мыслей!!!!

Скорее всего. Попытался скрестить понятие "ссылка" из java, с понятием "указатель"
из С++ и еще это притянуть к понятию "примитивный". Согласен. Вышло криво.
Но выражения типа "установил ссылку" говорят либо опять же о неверно подобраных
словах либо о не полном понимании что есть ссылка.
Т.к. разговор шел в контексте того, что же передается "объект по ссылке" или
"ссылка на объект как значение", то думаю тут стоило написать не установил,
а "изменил ссылку", тогда и вопросов бы не было, т.к. понятно, что
было изменено _значение_ ссылки (как некого... некоей... в общем переменной).

JIT>Ссылка это не обьект а значение обекта, ключевое слово значение!!!

Простите, значение какого объекта? Integer myval = new Integer(1) — _значением_
чего является myval? (серьезно не понимаю, то ли тупой, то ли мы на разных языках
разговариваем)

Собственно вот, гуглопамять поможет нам, более правильным языком:
http://javadude.com/articles/passbyvalue.htm

In Java, Objects are passed by reference, and primitives are passed by value.
This is half incorrect. Everyone can easily agree that primitives are passed by value; there's no such thing in Java as a pointer/reference to a primitive.
However, Objects are not passed by reference. A correct statement would be Object references are passed by value.

The use of the word "reference" in Java was an incredibly poor choice (in my not-so-humble opinion...) Java has pointers, plain and simple. The designers of Java wanted to try to make a distinction between C/C++ pointers and Java pointers, so they picked another term. Under the covers, pointers are implemented very differently in Java and C/C++, and Java protects the pointer values, disallowing operations such as pointer arithmetic and invalid runtime casting.


Т.е. мой background в виде С++ мешает иногда общаться в java мире, т.к. скатываюсь на уровень реализации...
Re[19]: передача параметра "по ссылке"
От: JITM  
Дата: 21.12.06 14:42
Оценка:
Здравствуйте, aka50, Вы писали:

A>Здравствуйте, JITM, Вы писали:


JIT>>Здравствуйте, aka50, Вы писали:


A>>>Здравствуйте, JITM, Вы писали:


JIT>>либо не правильные слова выбираете для выражения своих мыслей!!!!

A>Скорее всего. Попытался скрестить понятие "ссылка" из java, с понятием "указатель"
A>из С++ и еще это притянуть к понятию "примитивный". Согласен. Вышло криво.
A>Но выражения типа "установил ссылку" говорят либо опять же о неверно подобраных
A>словах либо о не полном понимании что есть ссылка.
A>Т.к. разговор шел в контексте того, что же передается "объект по ссылке" или
A>"ссылка на объект как значение", то думаю тут стоило написать не установил,
A>а "изменил ссылку", тогда и вопросов бы не было, т.к. понятно, что
A>было изменено _значение_ ссылки (как некого... некоей... в общем переменной).

+1 Вот сейчас совсем другое дело а ведь можем когда захочем ..

A>Простите, значение какого объекта? Integer myval = new Integer(1) — _значением_

A>чего является myval? (серьезно не понимаю, то ли тупой, то ли мы на разных языках
A>разговариваем)

Навенрое на разных . .. Как пишут ,ещё раз упомяну толстые книги , в джаве мы спокойно можем говорить что оперируем обьектами не боясь о последствиях но на самом деле мы оперируем ссылками на них, а обьекты они одини(ну есть возможность дубликации, клонгирования , копирования или как то ещё это можно назвать) так вот вот эта операция new Integer(1) создала в памяти обьект Интеджер, а вот эта Integer myval = присвоила значение ссылки на обьект переменной myval.

PS. Блин мне кажеться что это уже не нужный флейм .
Re[5]: передача параметра "по ссылке"
От: Trean Беларусь http://axamit.com/
Дата: 21.12.06 16:59
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>При расчёте разных статистических функций часто нужно вычислять такие вещи, как суммы квадратов, сумма попарных произведений и пр. над двумя массивами.

ЕК>Как это красиво и эффективно сделать на java?
ЕК>Вот для корреляции нам надо вычислить суммы квадратов и сумму попарных произведений.
ЕК>Дано:
ЕК>double[] x;
ЕК>double[] y;

ЕК>нужно:


ЕК>double sx2,sy2,sxy;


ЕК>как?


ЕК>Писать три функции, в каждой делать цикл? Не лучше ли сделать функцию, которая посчитает всё за один проход и вернёт всё сразу?


ЕК>Далее, допустим, нам нужно посчитать корреляцию массивов и стандартную девиацию каждого из массивов. При расчёте корреляции у нас уже будут готовы суммы квадратов. Зачем нам при расчёте девиации считать их опять? А как сделать возврат (опционально) этих данных из функции корреляции и передачу (опционально) их в функцию расчёта девиаций?


ЕК>P.S. И не надо говорить, что пример из пальца высосан.


Создать класс с данными религия не позволяет? Тогда используйте массивы для передачи и возврата значений, от этого еще никто не умирал, красоты мало, зато первоманс высокий.
Re[5]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 22.12.06 04:32
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>Писать три функции, в каждой делать цикл?

Забавно, только при процедурном мышлении мог возникнуть вариант такого решения!

ЕК> Не лучше ли сделать функцию, которая посчитает всё за один проход

Безусловно лучше.

ЕК> и вернёт всё сразу?

Можно и так в виде композитного объекта, но через return-value!
К примеру, с точки зрения ООП правильным считается использование класса Point, который инкапсулирует все координаты точки, при процедурном подходе вас все подзуживает координаты вернуть как отдельные значения — а зачем тогда ООП вообще?

Правильно сказали, если так сложно въехать в ООП, берешь C — и не мучаешься. Ничего плохого в том, чтобы работать так, как удобно — нет. Вот только эффективнее делать все инструментами предназначенными для того.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[6]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 22.12.06 04:47
Оценка:
Здравствуйте, Trean, Вы писали:


ЕК>>P.S. И не надо говорить, что пример из пальца высосан.


T>Создать класс с данными религия не позволяет? Тогда используйте массивы для передачи и возврата значений, от этого еще никто не умирал, красоты мало, зато первоманс высокий.


есть такое прилагательное — коряво...именно оно.

а может просто добавить возможность и не парица.
Re[7]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 22.12.06 05:05
Оценка:
Здравствуйте, Cider, Вы писали:

C>Здравствуйте, Тычеблин, Вы писали:


C>Остается за кадром вопрос — а на фига собственно нужна эта функция?


как вариант quick sort. Ы?
Re[7]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 22.12.06 05:37
Оценка:
Здравствуйте, Тычеблин, Вы писали:

Т>задачи разные бывают...судя по твоим репликам с проблеммами реализации например, отрисовки векторной графики средствами JAVA, (матрицы, то-сё) тебе сталкиваться не приходилось.

Да, не сталкивался.
1. Слышал о проекте Java 3D, надеюсь, кто-нибудь компетентно прокомментирует это.
2. Откровенно непонятно, зачем писать именно и позарез на Java, если, насколько понял, по вашим рассуждениям о производительности, что вы против объектов по определению и все собираетесь гонять примитивными типами?

Утрированный пример, но разговор получается в стиле диалога прикладника и системщика о том, почему и как именно системщик драйвер видеокарты собрался писать на Java.

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

Т>для большинства-же задач сложность которых производительность ООП помеха... вот так.
1. Смотрю, все же соглашение о том, что изменение примитивных типов по ссылке не укладывается в ООП все же произошло. Вопрос только в том, зачем было так долго упираться и спорить?
2. Вы придумали, я не утверждал, что ООП — единственно эффективная парадигма. Кроме флейма, речь шла конкретно о том, почему разработчики Sun не сделали то, о чем данная тема: ООЯ Java следует ООП — все.

Т>для тебя это такой предмет гордости. такое ощущение, что процесс въезжания с тобой случилося совсем недавно

Прекратите, пожалуйста, юродствовать.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[8]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 22.12.06 06:19
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Тычеблин, Вы писали:


R>Да, не сталкивался.

R>1. Слышал о проекте Java 3D, надеюсь, кто-нибудь компетентно прокомментирует это.

именно к Java 3D это никакого отношения не имеет

R>2. Откровенно непонятно, зачем писать именно и позарез на Java,


например здесь
о приимуществах векторной графики надеюсь рассказывать ненужно

R>2если, насколько понял, по вашим рассуждениям о производительности, что вы против объектов по определению и все собираетесь гонять примитивными типами?


это кто-то в вашем воображении так рассуждает...успешной борьбы

R>Утрированный пример, но разговор получается в стиле диалога прикладника и системщика о том, почему и как именно системщик драйвер видеокарты собрался писать на Java.


для мобильных телефонов ты похоже тоже ничего не писал.
Re[9]: передача параметра "по ссылке"
От: Евгений Коробко  
Дата: 22.12.06 07:04
Оценка:
R>Беря в руки ООЯ научитесь уже думать объектно, а не процедурно:
package ru.rsdn.test;
И какую же сущность инкапсулирует этот класс?

R>}
Не верите, посмотрите классы java.util.Collection. Наверно Sun можно в этом вопросе доверять?


Да верю. Только вот интерфейс у класса получается странный. Если раньше у нас получение значений было атомарной операцией, то теперь нет. И имея объект класса невозможно узнать, посчитаны ли уже минимумы и максимумы или нет.
И вообще, я не согласен, что если у нас два или более значения, связынных между собой, то нужно обязательно их в класс объединять.
Евгений Коробко
Re[10]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 22.12.06 07:24
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>И какую же сущность инкапсулирует этот класс?

По сути это коллекция с возможностью поиска максимального и минимального элемента. По уму лучше наверно наследоваться от какой-либо готовой коллекции пакета java.util.* и дописать нужный функционал.
Можно также посмотреть в сторону рефлексии — java.lang.reflect.Array.

ЕК>Да верю. Только вот интерфейс у класса получается странный. Если раньше у нас получение значений было атомарной операцией, то теперь нет. И имея объект класса невозможно узнать, посчитаны ли уже минимумы и максимумы или нет.

Согласен, все зависит от ТЗ на такой класс. К примеру, метод eval может вызываться автоматически в конструкторе и при изменении содержимого массива, а не только по требованию извне.

ЕК>И вообще, я не согласен, что если у нас два или более значения, связынных между собой, то нужно обязательно их в класс объединять.

Объектный и абстрактный подход родили такой столп ООП, как инкапсуляция. Против него быть невозможно, можно или следовать ему, а значит ООП, или не следовать, а значит следовать какой-либо другой парадигме.
PS Есть такой мультфильм "Баба-яга против!".
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[11]: передача параметра "по ссылке"
От: Евгений Коробко  
Дата: 22.12.06 08:23
Оценка:
R>Объектный и абстрактный подход родили такой столп ООП, как инкапсуляция. Против него быть невозможно, можно или следовать ему, а значит ООП, или не следовать, а значит следовать какой-либо другой парадигме.

Не вижу, как это связано с необходимостью создавать класс, чтобы хранить минимальное и максимальное значение коллекции. И уж тем более странно выглядит предложение унаследоваться от коллекции. От какой именно? Ото всех? И это вместо функции, которая, по идее, примнимает интерфейс IEnumerable?

В то время, как тенденция современного программирования постепенно уходит от идеи создания разветвлёных деревьев наследования в сторону интерфейсно-ориентированного подхода и всевозможных патернов по "склейке" независимых классов по тем или иным схемам, вы предлагаете откровенно злоупотребялть наследование, за уши его притягивая туда, куда не надо? Ведь есть класс java.util.Arrays, который как раз сделан так, как я и предлагаю. В С++ есть модуль algorithm. Это что, по-вашему, нарушение ООП?
Евгений Коробко
Re[12]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 22.12.06 08:47
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>В то время, как тенденция современного программирования постепенно уходит от идеи создания разветвлёных деревьев наследования в сторону интерфейсно-ориентированного подхода и всевозможных патернов по "склейке" независимых классов по тем или иным схемам, вы предлагаете откровенно злоупотребялть наследование, за уши его притягивая туда, куда не надо?

Нет, вы превратно меня поняли.
Вы привели словесное описание и попросили привести пример, как это реализуется на объектах, вам был дан ответ. Но (!) я не говорил, что любой другой (не объектный) вариант реализации неверен.

ЕК> Ведь есть класс java.util.Arrays, который как раз сделан так, как я и предлагаю. В С++ есть модуль algorithm. Это что, по-вашему, нарушение ООП?

Класс Arrays полностью статичный — не противоречит, просто из другой оперы.
Вот интересная цитата:

Традиционная компьютерная система, основанная на так называемой аппаратной архитектуре фон Неймана (Von Neumann architecture), может рассматриваться как множество функций или процессов, работающих с набором данных, хранимых либо в памяти, либо на диске — это не принципиально. Эта статическая архитектурная модель показана на рис. 1.1. Из рисунка видно, что в процессе работы системы динамика состоит в вызове некоторой функции f(1), которая считывает соответствующие данные A, преобразовывает их и записывает в B. Потом вызывается некоторая другая функция f(2), которая тоже считывает некоторые данные (возможно, те же), использует их по назначению и записывает в C. Подобный перекрывающийся доступ к данным порождает проблемы параллельной обработки и целостности, которые могут быть разрешены с помощью систем управлениябазами данных. Перед тем как двигаться дальше, стоит рассмотреть вопрос, что нужно сделать, чтобы изменить часть структуры данных.

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

На рис. 1.2 показан совершенно иной архитектурный подход к системам. Все данные, доступ к которым нужен функции, инкапсулируются в один пакет с этой функцией — так называемый объект (object) — таким образом, чтобы другой объект не имел доступа к этим данным. Используя аналогию, предложенную Стивом Куком (Steve Cook), можно рассматривать эти объекты как яйца. Желток — это структура данных, белки состоят из функций, которые имеют доступ к этим данным, а скорлупа представляет сигнатуру общедоступных операций. Оболочка интерфейса скрывает реализацию и самих функций, и структур данных. Предположим, что в яйце, изображенном “в разрезе” на рис. 1.2, изменилась структура данных. Тогда специалисты по сопровождению должны проверить только факт влияния изменений на белок этого яйца; сфера вмешательства локализована. Изменение реализации одного объекта не может затронуть “внутренность” другого. В этом и состоит инкапсуляция: данные и процессы объединяются и скрываются за интерфейсом.

(c) ссылка на источник уже есть в теме
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[13]: передача параметра "по ссылке"
От: Тычеблин Китай  
Дата: 22.12.06 09:02
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Евгений Коробко, Вы писали:



ЕК>> Ведь есть класс java.util.Arrays, который как раз сделан так, как я и предлагаю. В С++ есть модуль algorithm. Это что, по-вашему, нарушение ООП?

R>Класс Arrays полностью статичный — не противоречит, просто из другой оперы.
R>Вот интересная цитата:

браво, дальше идет цитата, которая полностью противоречит устройству java.util.Arrays

где там у java.util.Arrays "желток" ?

PS ну и сравнения в этой статье
Re[14]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 22.12.06 09:43
Оценка:
Здравствуйте, Тычеблин, Вы писали:

Т>где там у java.util.Arrays "желток" ?

1. Вы разницу между терминами класс и объект знаете?
2. Вообще с самого начала темы говорилось
Re[3]: передача параметра "по ссылке"
Автор: rsn81
Дата: 21.12.06

, что в Java static само по себе (!), то есть, к примеру, класс, содержащий только статичные члены — процедурное программирование, неужто это нужно еще повторить n-ый раз повторить?
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[8]: передача параметра "по ссылке"
От: Евгений Коробко  
Дата: 22.12.06 11:40
Оценка:
T>Если бы Sun по каждый раз меняла язык, то получилось бы как с .Net, что приложения написанные под первую версию не работают под второй

В .NET изначально продумали этот момент и ничего не мешает иметь на одном компьютере столько версий .NET, сколько нужно.
Евгений Коробко
Re[11]: передача параметра "по ссылке"
От: Trean Беларусь http://axamit.com/
Дата: 23.12.06 01:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>мои пять копеек в тему:

А> 1) Упопянули что введедение pass by ref фукциональности вызовет проблемы совместимости кода. Не вижу как и где. Просто новый код будет требовать соответсвующую версию JVM. Ведь никто же не требует чтоб приложение разработанное для версии n.m работало на версии n.m-1
А> 2) Язык программирования универсальный инструмент и если для одного проекта ООП это good то для другого 5% performance гораздо более важно чем соблюдение канонов ООП. Да можно использовать C# который имеет эту функциональность, но иногда JAVA единственный выбор и разводить зоопарк языков ради такого пустяка никто не хочет. Так что если уж хочешь быть унивесальным то будь добр соотвествуй.

В догонку, универсальные средства никогда не дадут того выигрыша в конкретном применение, как средства ускоспециализированные. Никто не пишет большие распределенные системы на бейсике или ассемблере, а драйвера — на java. Причем проблема универсальность vs ускозаточенность свойствена не только языкам. Иначе бы, к примеру, многоборцы часто завоевывали места в отдельных дисциплинах. Так что использовать надо те средства, которые лучше всего подходят для решения конкретной задачи либо идти на осознанный компромисс.
Java достаточно универсальный язык, но требовать, чтобы он везде был лучше остальных. Это из разряда: и с ёлки съехать, и ж... не обколоть. Так не бывает!
Re[12]: передача параметра "по ссылке"
От: Аноним  
Дата: 23.12.06 08:02
Оценка:
Продолжим продуктивную дискуссию

Здравствуйте, Trean, Вы писали:

T>А не правильное использование by ref добавит лишних проблем пользователям и разработчикам. С++ вот если правильно использовать,.....


T>В догонку, универсальные средства никогда не дадут того выигрыша в конкретном применение, как средства ускоспециализированные. Никто не пишет большие распределенные системы на бейсике или ассемблере,...



Тут вы уже лукавите сравниваем не c++ и Java а .NET (c#, ...) и Java. Давайте всетаки сравнивать языки более или менее одной весовой категории.
А так совершенно верно, универсальность достается ценой производительности. И вообще этот спор больше похож на спор тупоконечников и остроконечников. У каждой стороны есть свои аргументы. Решать кто прав кто виноват будет время, то что необходимо останется, то что ненужно отомрет в ходе эволюции. Я лично использую C# и пользуюсь pass by ref. Не считаю что это делает мой код менее читаемым.

Если уж подходить с точки зрения читаемости кода то запоминать лишние обертки под простые типы или типы созданные специально для возврата значений (которые будут разные от проекта к проекту так как их пишут разные люди) для меня сложнее чем выучить одно ключевое слово ref(стандарт языка и он неизменен от проекта к проекту).
Re[11]: передача параметра "по ссылке"
От: Аноним  
Дата: 23.12.06 15:15
Оценка:
Здравствуйте, Аноним, Вы писали:


А> 2) Язык программирования универсальный инструмент и если для одного проекта ООП это good то для другого 5% performance гораздо более важно чем соблюдение канонов ООП. Да можно использовать C# который имеет эту функциональность, но иногда JAVA единственный выбор и разводить зоопарк языков ради такого пустяка никто не хочет. Так что если уж хочешь быть унивесальным то будь добр соотвествуй.


Я бы сказал, что тащить в язык все г..но, которое реализовано в библиотеках, ради пары идиотов, которые

по другому не могут

и превращать язык в очередной C# это идиотизм. Кому надо, вернее, кто по другому не может, пусть идет на Nemerle.org и C#. Или соответственно, учится нормально программировать, а то так недолго и в дворники попасть по сокращению штатов
Re[14]: передача параметра "по ссылке"
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 23.12.06 17:51
Оценка:
Здравствуйте, Trean, Вы писали:

T>Вопрос не только и не столько в читаемости, а в усложнении разработки, трудности вхождения новичков и переобучения, а это все деньги. Часть из того, что в C# достигается через языковые конструкции в Java достигается через JNI, а там можно писать на чем угодно. Тащить в язык, все что может пригодиться в 1% случаев — оверхед, проще использовать для этого специальные тулы. В качестве примера сошлюсь на JAI (Java Advanced Imaging), в котором код всякого рода копирований, свертки, корреляции написан на C/Asm и оптимизирован под возможности и simd расширения различных платформ (mmx, 3dnow). И ведь работает и вполне быстро. Почему-то разработчиков Red5 (открытый потоковый сервер видео) Java вполне устроил, надо видео конвертнуть в другой формат — подключай кроссплатформенный ffmpeg написанный на С и будет тебе первоманс. На Java отлично реализуется бизнес логика, управление объектами, для низкоуровневых вещей есть лучше средства, хотя не всегда их применение даст огромный выигрыш по сравнению с pure java.

Описывал совсем аналогичное ощущение: http://rsdn.ru/Forum/Message.aspx?mid=2248849
Автор: rsn81
Дата: 05.12.06
Re: передача параметра "по ссылке"
От: alexanderfedin США http://alexander-fedin.pixels.com/
Дата: 08.02.07 05:08
Оценка:
Здравствуйте, dev_m, Вы писали:

_>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.


Как в старом анекдоте: и жопу показывал, и унитаз приносил, а туалетную бумагу так и не дали...

static void set(int[] nByRef)
{
    nByRef[0] = 5;
}

public static void main(String[] args)
{
    int[] nRef = { 1 };
    System.out.print(nRef[0]);
    set(nRef);
    System.out.print(nRef[0]);
}


или

class Ref<T> {
    public T v;

    Ref(T v) {
        this.v = v;
    }
}

public class Main {
    static void main(String[] args) {
        Ref<String> ref = new Ref<String>("1");
        System.out.print(ref.v);
        set(ref);
        System.out.print(ref.v);
    }

    static void set(Ref<String> ref) {
        ref.v = "5";
    }
    
}
Respectfully,
Alexander Fedin.
Re[5]: передача параметра "по ссылке"
От: Eugeny__ Украина  
Дата: 20.02.07 15:03
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>При расчёте разных статистических функций часто нужно вычислять такие вещи, как суммы квадратов, сумма попарных произведений и пр. над двумя массивами.

ЕК>Как это красиво и эффективно сделать на java?
ЕК>Вот для корреляции нам надо вычислить суммы квадратов и сумму попарных произведений.
ЕК>Дано:
ЕК>double[] x;
ЕК>double[] y;

ЕК>нужно:


ЕК>double sx2,sy2,sxy;



class XXXXXReturnValue {
double sx2,sy2,sxy;
... // getters, setters
}


public static XXXXXReturnValue calculateXXXXX(double[] x, double[] y) {
///calculating
return new XXXXXReturnValue(sx2,sy2,sxy);
}

Просто и понятно. И с таким результатом очень удобно работать.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[12]: передача параметра "по ссылке"
От: Eugeny__ Украина  
Дата: 20.02.07 15:21
Оценка:
Здравствуйте, Trean, Вы писали:



T>В догонку, универсальные средства никогда не дадут того выигрыша в конкретном применение, как средства ускоспециализированные. Никто не пишет большие распределенные системы на бейсике или ассемблере, а драйвера — на java.


Хм.. Пишу драйвера на java. Уже третью неделю. Под принтер и купюроприемник. Pure java, так как надо, чтобы работало и под win, и под lin. Почти закончил.
Так что всякое бывает
Кстати, под любые, подключаемые к ком порту девайсы писать можно на чем угодно. Понятно, что с девайсами, подключаемыми другим образом, выйдет облом. Но все-таки факт остается фактом .
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[7]: передача параметра "по ссылке"
От: Аноним  
Дата: 20.02.07 15:49
Оценка:
R>В ООП по определению метод должен осуществлять обработку самого объекта, а не передаваемого ему.


Это утверждение не соответствует ни теории (паттерны Visitor, IoC и др.), ни практике ООП
(модели данных отнюдь не сами себя конструируют).
Re: передача параметра "по ссылке"
От: Аноним  
Дата: 20.02.07 16:02
Оценка:
_>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.
_>В сях:
_>
_>void set(int&n);
_>

_> , а как в jave?

Вам тут изрядно протрахали мозг, хотя ответ очень простой. Можно возвращать результат в специальном объекте:
/**
 * Calculation example
 */
public class Calculation {
    public static class Result {
       int foo;
       double bar;
    }

    public Result calculate(double[] values, int magicParam) {
        Result result = new Result();
        // put calculation results in result object
        result.foo = magicParam + values.length;
        result.bar = average(values);
        return result;
    }
}

...А может быть и так, что набор классов совместно подготавливает результат:
/**
 * The contributors enhance the model creation process by adding plug-in specific information to the model.
 */
public interface Contributor {
     void contribute(Model model);
}

/**
 * This contributor adds ConcreteExtension to the model.
 */
public class ConcreteContributor implements Contributor {
    public void contribute(Model model) {
        model.addExtension(new ConcreteExtension("foo"));
        model.addMetadata(new ConcreteMetadata("alice","bob",1));
    }
}

/**
 * The builder collects contributors from application plug-ins and creates the model with all available extensions.
 */
public class Builder {
    public Model createModel() {
          Model model = new Model();
          for (Contributor contributor : contributors) {
             contributor.contribute(model);
          }
    }
}
Re: передача параметра "по ссылке"
От: Аноним  
Дата: 01.03.07 20:10
Оценка:
Здравствуйте, dev_m, Вы писали:

_>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.

_>В сях:
_>
_>void set(int&n);
_>

_> , а как в jave?


void set(int[] mas);


int[] my_var=new int[1];
set(my_var);
Re[2]: передача параметра "по ссылке"
От: Аноним  
Дата: 06.04.07 06:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, dev_m, Вы писали:


_>>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.

_>>В сях:
_>>
_>>void set(int&n);
_>>

_>> , а как в jave?


А>void set(int[] mas);



А>int[] my_var=new int[1];

А>set(my_var);

Именно таким образом организована передача in-out параметров между java и PL/SQL в Oracle.
Может быть скоро станет стандартом для in-out параметров?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.