Языки с "Делегирование=Наследование"
От: Буравчик Россия  
Дата: 20.03.16 14:43
Оценка:
В языках программирования обычно наследование делается просто указанием нового и старого класса.
Этого достаточно, чтобы новый класс обладал методами старого класса.
class NewClass: OldClass


Делегирование очень часто является более подходящим (правильным) паттерном,
но в обычных языка делегирование становится многословным. Приходится явно описывать каждый делегируемый метод
class NewClass
   obj: OldClass
   method1(x) { obj.method1(x) }
   method2(x) { obj.method2(x) }    
   method3(x) { obj.method3(x) }


Вопрос. Есть ли языки, которые позволяют применить делегирование также элегантно (немногословно), как и наследование?
Best regards, Буравчик
Re: Языки с "Делегирование=Наследование"
От: Jack128  
Дата: 20.03.16 15:30
Оценка: 1 (1) +1
Здравствуйте, Буравчик, Вы писали:

Б>Вопрос. Есть ли языки, которые позволяют применить делегирование также элегантно (немногословно), как и наследование?


Delphi, kotlin
Re: Языки с "Делегирование=Наследование"
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.03.16 22:25
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Вопрос. Есть ли языки, которые позволяют применить делегирование также элегантно (немногословно), как и наследование?


В Немерле есть макра делающая делегирование.

https://github.com/rsdn/nemerle/wiki/Design-patterns

Но на практике используется редко.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Языки с "Делегирование=Наследование"
От: anonymouse2 Иностранный Агент
Дата: 21.03.16 06:21
Оценка:
Здравствуйте, Jack128, Вы писали:

Б>>Вопрос. Есть ли языки, которые позволяют применить делегирование также элегантно (немногословно), как и наследование?

J>Delphi, kotlin

Интересно... А на примерах покажете?
Нет такого преступления, на которое не пошло бы суверенное родоплеменное быдло ради продления своего бессмысленного рода и распространения своего бессмысленного генома.
Re[3]: Языки с "Делегирование=Наследование"
От: dr. Acula Украина  
Дата: 21.03.16 06:53
Оценка:
A>Интересно... А на примерах покажете?

class Example {
  var p: String by Delegate()
}
...
class Delegate {
  operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
    return "$thisRef, thank you for delegating '${property.name}' to me!"
  }
 
  operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
    println("$value has been assigned to '${property.name} in $thisRef.'")
  }
...
val e = Example()
println(e.p)

Example@33a17727, thank you for delegating ‘p’ to me!


тута
Re[2]: Языки с "Делегирование=Наследование"
От: Jack128  
Дата: 21.03.16 07:29
Оценка: 5 (2)
Здравствуйте, Jack128, Вы писали:

J>Здравствуйте, Буравчик, Вы писали:


Б>>Вопрос. Есть ли языки, которые позволяют применить делегирование также элегантно (немногословно), как и наследование?


J>Delphi, kotlin


delphi
type
  IWorker = interface
    procedure DoWork();
  end;
  TWorker = class(TInterfacedObject, IWorker)
    procedure DoWork();
  end;

  TBoss = class(TInterfacedObject, IWorker)
    property Subordinate: IWorker read GetSubordinate implements IWorker; //  босс делегирует реализацию IWorker подчиненному 
  end;


kotlin
interface IWorker {
  fun doWork()
}

class Worker() : IWorker {
  override fun doWork() {}
}

class Boss(val subordinate: IWorker) : IWorker by subordinate


ЗЫ
Тут http://rsdn.ru/forum/philosophy/6389711.1
Автор: dr. Acula
Дата: 21.03.16
написано не про делегирование реализации интерфейсов, а про делегирование свойств. Прикольная фича, но не по теме.
Re: Языки с "Делегирование=Наследование"
От: Sinix  
Дата: 21.03.16 09:33
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Вопрос. Есть ли языки, которые позволяют применить делегирование также элегантно (немногословно), как и наследование?


Если понимать вопрос буквально, то я бы добавил яваскрипт
Re: Языки с "Делегирование=Наследование"
От: anonymous Россия http://denis.ibaev.name/
Дата: 22.03.16 07:03
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Делегирование очень часто является более подходящим (правильным) паттерном, но в обычных языка делегирование становится многословным. Приходится явно описывать каждый делегируемый метод

Б>
Б>class NewClass
Б>   obj: OldClass
Б>   method1(x) { obj.method1(x) }
Б>   method2(x) { obj.method2(x) }    
Б>   method3(x) { obj.method3(x) }
Б>


Не обязательно. Используя кодогенерацию можно реализовать более изящное решение. Например, в Perl с помощью фреймворков Moo(se) это будет выглядеть так (все нужные методы будут сгенерированы.):
package NewClass;

has obj => (
    is      => 'rw',
    isa     => InstanceOf[OldClass],
    handles => [qw(method1 method2 method3)],
);
Re: Языки с "Делегирование=Наследование"
От: FR  
Дата: 23.03.16 15:54
Оценка:
Здравствуйте, Буравчик, Вы писали:


Б>Вопрос. Есть ли языки, которые позволяют применить делегирование также элегантно (немногословно), как и наследование?


Язык D http://dlang.org/spec/class.html#AliasThis

struct Foo
{
    int baz = 4;
    int get() { return 7; }
}

class Bar
{
    Foo foo;
    alias foo this;
}

void main()
{
    auto bar = new Bar;
    int i = bar.baz; // i == 4
    i = bar.get(); // i == 7
}
Re: Языки с "Делегирование=Наследование"
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.03.16 17:58
Оценка: 8 (1)
Здравствуйте, Буравчик, Вы писали:

Б>Вопрос. Есть ли языки, которые позволяют применить делегирование также элегантно (немногословно), как и наследование?


Go.

type Parent struct {
  a, b int
}

type Child {
  Parent
  c, f bool
}


Parent является в структуре Child анонимным полем.
Child наследует содержимое Parent'а и все его методы, если только не оверриайдит их собственными.
Re: Языки с "Делегирование=Наследование"
От: 0BD11A0D  
Дата: 25.03.16 22:55
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Делегирование очень часто является более подходящим (правильным) паттерном,


Это в каких же?

С моей точки зрения, делегирование по сути своей — весьма спорный паттерн и поэтому очень хорошо, что прописывать его надо явно.
Re[2]: Языки с "Делегирование=Наследование"
От: jazzer Россия Skype: enerjazzer
Дата: 26.03.16 02:45
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Здравствуйте, Буравчик, Вы писали:


Б>>Делегирование очень часто является более подходящим (правильным) паттерном,


BDA>Это в каких же?


BDA>С моей точки зрения, делегирование по сути своей — весьма спорный паттерн и поэтому очень хорошо, что прописывать его надо явно.


Если воспринимать его просто как сахар, то вполне нормально (и в том же С++ элементарно реализуется на макросах, кстати)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Языки с "Делегирование=Наследование"
От: AlexRK  
Дата: 26.03.16 06:48
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>С моей точки зрения, делегирование по сути своей — весьма спорный паттерн


А в чем именно он спорный? Мне всегда казалось, что в правильно реализованном делегировании нет мест, где можно случайно наломать дров.
Re[3]: Языки с "Делегирование=Наследование"
От: 0BD11A0D  
Дата: 26.03.16 20:05
Оценка:
Здравствуйте, AlexRK, Вы писали:

BDA>>С моей точки зрения, делегирование по сути своей — весьма спорный паттерн

ARK>А в чем именно он спорный? Мне всегда казалось, что в правильно реализованном делегировании нет мест, где можно случайно наломать дров.

А вы приведите хоть один пример с правильным делегированием, его и разберем.
Re[4]: Языки с "Делегирование=Наследование"
От: AlexRK  
Дата: 27.03.16 15:59
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>>>С моей точки зрения, делегирование по сути своей — весьма спорный паттерн

ARK>>А в чем именно он спорный? Мне всегда казалось, что в правильно реализованном делегировании нет мест, где можно случайно наломать дров.

BDA>А вы приведите хоть один пример с правильным делегированием, его и разберем.


А без моего примера не можете пояснить свои слова про спорный паттерн?

Ну ок, вот выше был пример: http://rsdn.ru/forum/philosophy/6393576.1
Автор: Pzz
Дата: 23.03.16
Re[5]: Языки с "Делегирование=Наследование"
От: 0BD11A0D  
Дата: 27.03.16 17:36
Оценка: -1
Здравствуйте, AlexRK, Вы писали:

ARK>А без моего примера не можете пояснить свои слова про спорный паттерн?


Могу написать общие соображения. Они сводятся к тому, что такой код мало соотносится с жизнью, слишком абстрактен, а поэтому он читается намного хуже.

И как, полегчало? Не думаю.

Жизнь меня научила тому, что надо сразу переходить к примерам. Допустим, вы бы хотели возложить бремя придумывания примеров на меня. Есть одна проблемка: примеры чего, мне, человеку, которому паттерн кажется спорным, следует привести? Того, что он спорен? А вы на это скажете, что это мои примеры плохие (но есть хорошие).

Вот это все я мысленно опустил и предложил: давайте вы сразу приведете пример хорошего кода с делегированием. Где делегирование улучшает читаемость или мешает совершению ошибок. (Другие критерии я не думаю, что есть смысл рассматривать, но готов, если убедительно покажете). А я перепишу его без делегирования или признаю, что оно уместно. Так мы сможем быстро разобрать все случаи. К игре приглашаются все желающие.

ARK>Ну ок, вот выше был пример: http://rsdn.ru/forum/philosophy/6393576.1
Автор: Pzz
Дата: 23.03.16


И чего это пример? Бессмысленного и бесполезного учебного кода? Пожалуйста, давайте не будем замусоривать обсуждение такими примерами.
Отредактировано 27.03.2016 17:37 0BD11A0D . Предыдущая версия .
Re[6]: Языки с "Делегирование=Наследование"
От: Кодт Россия  
Дата: 29.03.16 10:08
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Вот это все я мысленно опустил и предложил: давайте вы сразу приведете пример хорошего кода с делегированием. Где делегирование улучшает читаемость или мешает совершению ошибок. (Другие критерии я не думаю, что есть смысл рассматривать, но готов, если убедительно покажете). А я перепишу его без делегирования или признаю, что оно уместно. Так мы сможем быстро разобрать все случаи. К игре приглашаются все желающие.


Возьмём старый добрый COM. И его ярчайших представителей — VB, Delphi, C++/ATL.
В васике наследования вообще не было. Так что переписывать на нём без делегирования просто не получится.
Компонентная модель вообще предполагает, что кастомизация поведения объектов происходит только через предоставление интерфейсов друг другу, а делегирование — просто немножко сахара над этим.

Чем делегирование лучше наследования:
Наследование создаёт россыпь интерфейсов толщиной в одну функцию (поскольку каждую функцию можно переопределить).
И эти интерфейсы доступны как наружу, так и внутри реализации — интерфейсы наследников к предку (механизм, который эксплуатируется в паттерне "шаблонный метод", например).
Для каждого интерфейса мысленно прописывается контракт. А если несколько функций выступают в связке, то этот контракт расползается, его легче нарушить.
При делегировании каждый класс отвечает за соблюдение своей части контракта.

Чем делегирование хуже: оно дороже по памяти, по скорости, ну и по писанине тоже.
Перекуём баги на фичи!
Re[7]: Языки с "Делегирование=Наследование"
От: vsb Казахстан  
Дата: 29.03.16 10:12
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Чем делегирование хуже: оно дороже по памяти, по скорости, ну и по писанине тоже.


Речь о ручном делегировании? Если язык поддерживает делегирование на уровне синтаксиса, почему оно дороже?
Re[8]: Языки с "Делегирование=Наследование"
От: Кодт Россия  
Дата: 29.03.16 10:58
Оценка:
Здравствуйте, vsb, Вы писали:

К>>Чем делегирование хуже: оно дороже по памяти, по скорости, ну и по писанине тоже.

vsb>Речь о ручном делегировании? Если язык поддерживает делегирование на уровне синтаксиса, почему оно дороже?

Синтаксис уменьшает писанину, но ненамного. В ATL делегирование интерфейса агрегату (и, одновременно, предоставление ему своих интерфейсов) займёт ровно одну строчку.
Плюс пару строк обвязки в коклассах главного объекта и агрегата, — но они так и этак добавятся.

А память и скорость — это почти неизбежная расплата.
Только если синтаксическими макросами сделать облако связанных объектов с минимальной косвенностью вызовов (немерле, шаблоны C++ — правда, именно шаблоны в нынешней редакции не могут сделать это бесплатно и изящно).
Хотя, если C++, препроцессор плюс CRTP, наверно, можно сделать инфраструктуру...
Перекуём баги на фичи!
Re[7]: Языки с "Делегирование=Наследование"
От: 0BD11A0D  
Дата: 30.03.16 03:43
Оценка:
Здравствуйте, Кодт, Вы писали:

BDA>>Вот это все я мысленно опустил и предложил: давайте вы сразу приведете пример хорошего кода с делегированием. Где делегирование улучшает читаемость или мешает совершению ошибок. (Другие критерии я не думаю, что есть смысл рассматривать, но готов, если убедительно покажете). А я перепишу его без делегирования или признаю, что оно уместно. Так мы сможем быстро разобрать все случаи. К игре приглашаются все желающие.


К>Возьмём старый добрый COM. И его ярчайших представителей — VB, Delphi, C++/ATL.

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

Ну хорошо: если его нечем заменить (из языка убраны другие средства), тогда, конечно.

К>Чем делегирование лучше наследования:

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

К>Чем делегирование хуже: оно дороже по памяти, по скорости, ну и по писанине тоже.


А вот это хотелось бы в виде кода, поскольку там вероятны какие-то проблемы с декомпозицией.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.