method(obj) то же самое, что и obj.method() ? Что за бред!
От: LaPerouse  
Дата: 04.07.07 13:20
Оценка: -6 :)))
Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта

ObjectClass::method();

может быть заменен на ObjectClass method(ObjectClass),

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

Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.

class A implements I
{
    int state;
    
    void method() {}
}

class B implements I
{
    int state;
    
    void method() {}
}


В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями. Придется использовать pattern matching, и хорошо еще, что если он поддерживается напрямую языком. Отсюда следует естественный вывод, что высказывания такого рода — низкопробная лажа, не выдерживающая никакой критики.
Кто что думает по этому поводу? Надеюсь, дискусия, если она вообще состоится, не превратится в спор pattern matching vs виртуальные функции.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re: method(obj) то же самое, что и obj.method() ? Что за бре
От: Кодёнок  
Дата: 04.07.07 13:39
Оценка:
Здравствуйте, LaPerouse, Вы писали:

Если речь о реализации языка программирования, то реализовать правильный вызов виртуального метода по интерфейсу очень легко, и многие языки это успешно делают. Это на самом деле упрощает и язык и реализацию, не приходится вводить кучу извращений как в С++ (A::* a.*b a->*b)

Если речь идет о таком стиле кодирования — замене конструкций obj.foo(bar) на foo(obj, bar), то конечно, нет, не надо.
Re[2]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 04.07.07 13:52
Оценка:
Здравствуйте, Кодёнок, Вы писали:

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


Кё>Если речь о реализации языка программирования, то реализовать правильный вызов виртуального метода по интерфейсу очень легко, и многие языки это успешно делают. Это на самом деле упрощает и язык и реализацию, не приходится вводить кучу извращений как в С++ (A::* a.*b a->*b)


Кё>Если речь идет о таком стиле кодирования — замене конструкций obj.foo(bar) на foo(obj, bar), то конечно, нет, не надо.


Да, безусловно нормальному человеку так и должно казаться. Однако вопрос содержал неявно обозначенный подтекст. Дело в том, что подобные "перлы" обычно исходячт от т н "функциональщиков", клеймящих ООП и все, что с ним связано.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re: method(obj) то же самое, что и obj.method() ? Что за бре
От: aka50 Россия  
Дата: 04.07.07 14:07
Оценка: +2
Здравствуйте, LaPerouse, Вы писали:

LP>Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта

Где бытует?

LP>ObjectClass::method();

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

Полиморфизм может достигаться не только наследованием. Наследование, мультиметоды (это как раз то, что ты описал) и type classes — это все позволяет реализовать полиморфизм, только разными способами... http://en.wikipedia.org/wiki/Multiple_dispatch http://nice.sourceforge.net/

// skip


void laugh(String str){
  println("haha, I'm holding an instance of " str);
}

let myString = new String("Andy");
myString.laugh();


LP>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.

Почему это?
(defmethod collide-with ((x asteroid) (y asteroid))
  ;; deal with asteroid hitting asteroid
)
(defmethod collide-with ((x asteroid) (y spaceship))
  ;; deal with asteroid hitting spaceship
)
(defmethod collide-with ((x spaceship) (y asteroid))
  ;; deal with spaceship hitting asteroid
)
(defmethod collide-with ((x spaceship) (y spaceship))
  ;; deal with spaceship hitting spaceship
)
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: aka50 Россия  
Дата: 04.07.07 14:16
Оценка:
Здравствуйте, LaPerouse, Вы писали:

Кё>>Если речь идет о таком стиле кодирования — замене конструкций obj.foo(bar) на foo(obj, bar), то конечно, нет, не надо.

LP>Дело в том, что подобные "перлы" обычно исходячт от т н "функциональщиков", клеймящих ООП и все, что с ним связано.
Функциональщики возвращают _новый_ объект, а не измененный.
Re: method(obj) то же самое, что и obj.method() ? Что за бре
От: IB Австрия http://rsdn.ru
Дата: 04.07.07 14:23
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта

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

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

Угу.

LP> Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.

Если сделать это явно, то уже не полиморфизм?

LP>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.

Хм...
Method(A a)
Method(B b)
Уже отменили? И двойную диспетчерезацию вместе с визиторами?

LP> Отсюда следует естественный вывод, что высказывания такого рода — низкопробная лажа, не выдерживающая никакой критики.

LP>Кто что думает по этому поводу? Надеюсь, дискусия, если она вообще состоится, не превратится в спор pattern matching vs виртуальные функции.
Ты точно на дискуссию надеялся, когда это писал?
На самом деле, крайности вредны, меру надо знать. Но при проектировании, прежде чем делать функцию методом класса, надо три раза подумать — действительно ли она там нужна.
Объяснение очень простое и логичное — каждый метод-член класса, который можно вынести во внешнюю функцию, уменьшает инкапсуляцию и увеличивает связность, что, в свою очередь, увеличивает стоимость поддержки.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re: method(obj) то же самое, что и obj.method() ? Что за бре
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 04.07.07 17:32
Оценка: +1
Здравствуйте, LaPerouse, Вы писали:

LP>Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.


Это, а в чём преимущество точечной нотации перед функциональной, в плане организации полиморфизма. В Хаскелле вон полиморфизм покруче будет, чем во всяких Явах.

[skip]

LP>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.


Это кто тебе сказал? Почему-то в Хаскелле я могу делать перегрузку, причём даже на по одному параметру, а по нескольким. Там есть такие возможности, что Java и не снились.

LP> Придется использовать pattern matching, и хорошо еще, что если он поддерживается напрямую языком. Отсюда следует естественный вывод, что высказывания такого рода — низкопробная лажа, не выдерживающая никакой критики.


А при чём тут pattern matchin?

LP>Кто что думает по этому поводу? Надеюсь, дискусия, если она вообще состоится, не превратится в спор pattern matching vs виртуальные функции.


Нет, не превратится, т.к. это вообще разные вещи, предназначенные для разных вещей.
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re: method(obj) то же самое, что и obj.method() ? Что за бре
От: deniok Россия  
Дата: 04.07.07 18:14
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта


LP>ObjectClass::method();


LP>может быть заменен на ObjectClass method(ObjectClass),


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


LP>Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.


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

-- для любого типа a функция f имеет тип a -> a, 
-- то есть принимает объект типа a и возвращает объект типа a
forall a. f :: a -> a

А дальше все ограничения на полиморфизм накладываются реализацией этой функции
-- опс, появилась операция +, значит x должен выставлять "интерфейс", в котором определён оператор +
f x = x + 1

В Хаскелле оператор + определён в "интерфейсе" Num (на самом деле это называется класс типа, штука довольно сильно обобщающая понятие интерфейса). Таким образом, тип функции f ограничивается этим интерфейсом
-- в том контексте, что a принадлежит классу типа Num,
-- функция f имеет тип a -> a
f :: Num a => a -> a

Добавляем ещё операции, получаем дополнительные контексты:
-- Оператор > определён в классе типа Ord
f :: (Ord a, Num a) => a -> a
f x = if x>0 then x+1 else x-1

Одна из фишек в том, что, поскольку типы выводятся, их указывать необязательно.
Re[4]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 04.07.07 18:25
Оценка:
Здравствуйте, aka50, Вы писали:

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


Кё>>>Если речь идет о таком стиле кодирования — замене конструкций obj.foo(bar) на foo(obj, bar), то конечно, нет, не надо.

LP>>Дело в том, что подобные "перлы" обычно исходячт от т н "функциональщиков", клеймящих ООП и все, что с ним связано.
A>Функциональщики возвращают _новый_ объект, а не измененный.

Под измененным объектом имеется ввиду измененная КОПИЯ объекта.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 04.07.07 18:25
Оценка:
Здравствуйте, aka50, Вы писали:

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


LP>>Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта

A>Где бытует?

Да хотя бы здесь. На этом форуме. Хотите — потрачу время и найду?

LP>>ObjectClass::method();

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

A>Полиморфизм может достигаться не только наследованием. Наследование, мультиметоды (это как раз то, что ты описал) и type classes — это все позволяет реализовать полиморфизм, только разными способами... http://en.wikipedia.org/wiki/Multiple_dispatch http://nice.sourceforge.net/


A>
A>// skip
A>


A>
A>void laugh(String str){
A>  println("haha, I'm holding an instance of " str);
A>}

A>let myString = new String("Andy");
A>myString.laugh();
A>


LP>>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.

A>Почему это?
A>
A>;(defmethod collide-with ((x asteroid) (y asteroid))
A>;  ;; deal with asteroid hitting asteroid
A>;)
A>;(defmethod collide-with ((x asteroid) (y spaceship))
A>;  ;; deal with asteroid hitting spaceship
A>;)
A>;(defmethod collide-with ((x spaceship) (y asteroid))
A>;  ;; deal with spaceship hitting asteroid
A>;)
A>;(defmethod collide-with ((x spaceship) (y spaceship))
A>;  ;; deal with spaceship hitting spaceship
A>;)
A>;


Ну это же, черт возьми в Лиспе. Я же говорил про языки класса C++/Java. Там, придется ограничиться if-ами, хотя есть паттерны, которые позволяют это дело сгладить.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 04.07.07 18:25
Оценка:
Здравствуйте, IB, Вы писали:

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


LP>>Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта

IB>Не любой... А только тот, который не имеет доступа к закрытым методам и полям объекта. То есть тот, функционал которого можно реализовать пользуясь только публичным контрактом объекта.

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

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

IB>Угу.

LP>> Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.

IB>Если сделать это явно, то уже не полиморфизм?

Если это сделать явно, то это уже не полиморфизм, а х з что.

if (obj instanceof A)
//
else if (obj instnceof B)
//..


LP>>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.

IB>Хм...
IB>Method(A a)
IB>Method(B b)

Это вообще к чему?
В данном случае вам придется делать ЯВНОЕ преобразование типа, те с помощью рантаймовой инфы узнавать тип объекта, делать нужный каст и вызывать нужную функцию, либо ловить ClassCastException Какой к черту полиморфизм?


LP>> Отсюда следует естественный вывод, что высказывания такого рода — низкопробная лажа, не выдерживающая никакой критики.

LP>>Кто что думает по этому поводу? Надеюсь, дискусия, если она вообще состоится, не превратится в спор pattern matching vs виртуальные функции.
IB>Ты точно на дискуссию надеялся, когда это писал?
IB>На самом деле, крайности вредны, меру надо знать. Но при проектировании, прежде чем делать функцию методом класса, надо три раза подумать — действительно ли она там нужна.

Я это не отрицаю

IB>Объяснение очень простое и логичное — каждый метод-член класса, который можно вынести во внешнюю функцию, уменьшает инкапсуляцию и увеличивает связность, что, в свою очередь, увеличивает стоимость поддержки.


Чертовски верно сказано. Так я о том же.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 04.07.07 18:34
Оценка:
Здесь и далее — LaPerouse — это Perseus, а Perseus — это LaPerouse. То есть я на работе я LaPerouse, дома — Perseus
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 04.07.07 18:57
Оценка:
Здравствуйте, konsoletyper, Вы писали:

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


LP>>Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.


K>Это, а в чём преимущество точечной нотации перед функциональной, в плане организации полиморфизма. В Хаскелле вон полиморфизм покруче будет, чем во всяких Явах.


О черт, опять этот Хаскель. И тут Хаскель, и там Хаскель, такое ощущение, что это — образец трепетного поклонения.


LP>> Придется использовать pattern matching, и хорошо еще, что если он поддерживается напрямую языком. Отсюда следует естественный вывод, что высказывания такого рода — низкопробная лажа, не выдерживающая никакой критики.


K>А при чём тут pattern matchin?


При том, что один из способов реализовать некое подобие полиморфизма — это pattern matching. Другой — мультиметоды. Ни того, ни другого нет ни в Java, ни в С++. Я имею ввиду. конечно, нпсредственную поддержку языка.

LP>>Кто что думает по этому поводу? Надеюсь, дискусия, если она вообще состоится, не превратится в спор pattern matching vs виртуальные функции.


K>Нет, не превратится, т.к. это вообще разные вещи, предназначенные для разных вещей.


Это, как вы выразились, "вещи", предназначенные для других вещей, но позволяющие, пусть и разными способами, реализовать одно и то же — полиморфизм на основе типов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 04.07.07 19:06
Оценка:
Здравствуйте, Perseus, Вы писали:

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


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


LP>>>Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.


K>>Это, а в чём преимущество точечной нотации перед функциональной, в плане организации полиморфизма. В Хаскелле вон полиморфизм покруче будет, чем во всяких Явах.


P>О черт, опять этот Хаскель. И тут Хаскель, и там Хаскель, такое ощущение, что это — образец трепетного поклонения.


Ну извини, просто ты постишь в философию тему про ФП-подход, полиморфизм и интерфейсы, а Хаскелл как раз тот язык, где эти понятия были соеденины на высоком и строго формализованном уровне абстракции.

В Яве принципиально другой подход к типам, поэтому там идея эквивалентности o.m(p) и o <- m(o,p) действительно не очень плодотворна. Но ты же спрашивал вообще, а не конкретно про Яву.
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 04.07.07 19:13
Оценка:
Здравствуйте, Perseus, Вы писали:

K>>Это, а в чём преимущество точечной нотации перед функциональной, в плане организации полиморфизма. В Хаскелле вон полиморфизм покруче будет, чем во всяких Явах.


P>О черт, опять этот Хаскель. И тут Хаскель, и там Хаскель, такое ощущение, что это — образец трепетного поклонения.


Чем переходить к неконструктиву, лучше бы ответил на первый вопрос. Хаскель я привёл не потому, что в нём не используется точечная нотация, но он вполне себе полиморфный; но никак не потому, что Хаскель — объект поклонения, мне вот Nemerle больше нравится. А так могу привести ещё пример — ADA95. Причём ещё в ADA83 был полиморфизм типов (aka generics), который совершенно нормально уживался с функциональной нотацией. В 95-м году были добавлены tagged types, а не точечная нотация, и эти tagged types позволили организовывать полиморфизм, про который ты говоришь.

P>При том, что один из способов реализовать некое подобие полиморфизма — это pattern matching. Другой — мультиметоды. Ни того, ни другого нет ни в Java, ни в С++. Я имею ввиду. конечно, нпсредственную поддержку языка.


Никакой полиморфизм pattern matching реализовывать не умеет. Он вообще нужен для сопоставления алгебраических типов данных.

K>>Нет, не превратится, т.к. это вообще разные вещи, предназначенные для разных вещей.


P>Это, как вы выразились, "вещи", предназначенные для других вещей, но позволяющие, пусть и разными способами, реализовать одно и то же — полиморфизм на основе типов.


... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[5]: method(obj) то же самое, что и obj.method() ? Что за
От: aka50 Россия  
Дата: 04.07.07 19:25
Оценка:
Здравствуйте, Perseus, Вы писали:

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


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


Кё>>>>Если речь идет о таком стиле кодирования — замене конструкций obj.foo(bar) на foo(obj, bar), то конечно, нет, не надо.

LP>>>Дело в том, что подобные "перлы" обычно исходячт от т н "функциональщиков", клеймящих ООП и все, что с ним связано.
A>>Функциональщики возвращают _новый_ объект, а не измененный.

P>Под измененным объектом имеется ввиду измененная КОПИЯ объекта.

Слова копия в оригинале не было.
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: aka50 Россия  
Дата: 04.07.07 19:29
Оценка:
Здравствуйте, Perseus, Вы писали:

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


Зачем же так много цитировать...

P>Ну это же, черт возьми в Лиспе. Я же говорил про языки класса C++/Java. Там, придется ограничиться if-ами, хотя есть паттерны, которые позволяют это дело сгладить.

В вопросе этого не звучало. Был просто вопрос: почему так? Я и ответил, что это вопрос языка. Тот же nice (работает на jvm) это умеет делать. Далее выше написали, что нужно хорошо думать, прежде чем пихать кучу методов в класс, если эти методы работают только с public api этого класса.
Re[5]: method(obj) то же самое, что и obj.method() ? Что за
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 04.07.07 19:42
Оценка:
Здравствуйте, Perseus, Вы писали:

P>Под измененным объектом имеется ввиду измененная КОПИЯ объекта.


Вопрос, какие могут быть копии в ФП? Вообще, какие там могут быть объекты?
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[6]: method(obj) то же самое, что и obj.method() ? Что за
От: aka50 Россия  
Дата: 04.07.07 19:50
Оценка:
Здравствуйте, konsoletyper, Вы писали:

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


P>>Под измененным объектом имеется ввиду измененная КОПИЯ объекта.


K>Вопрос, какие могут быть копии в ФП? Вообще, какие там могут быть объекты?

Ну если это jvm/net то вполне себе будут объекты . immutable, но объекты...
Re[7]: method(obj) то же самое, что и obj.method() ? Что за
От: WolfHound  
Дата: 04.07.07 22:23
Оценка:
Здравствуйте, aka50, Вы писали:

K>>Вопрос, какие могут быть копии в ФП? Вообще, какие там могут быть объекты?

A>Ну если это jvm/net то вполне себе будут объекты . immutable, но объекты...
Детали реализации однако. Если мы конечно говорим о чистом ФЯ.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.