Экземплярные методы расширения.
От: WolfHound  
Дата: 27.03.13 11:14
Оценка:
Про методы расширения в C# наверное все вкурсе.
http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx
В C# они могут быть только static.

Но мне захотелось странного.
class Test
{
  private _someTable : Dictionary[Foo, Bar];
  private AsBar(this foo : Foo) : Bar
  {
    _someTable[foo]
  }
  private DoSome()
  {
    foo.AsBar().SomeBarMethod();
  }
}

Или даже так:
class Test
{
  private _someTable : Dictionary[Foo, Bar];
  private AsBar[this foo : Foo] : Bar
  {
    get { _someTable[foo] }
  }
  private DoSome()
  {
    foo.AsBar.SomeBarMethod();
  }
}

Какие будут мысли насчет данной функциональности?
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Экземплярные методы расширения.
От: Abyx Россия  
Дата: 27.03.13 11:18
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

WH>Про методы расширения в C# наверное все вкурсе.

WH>http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx
WH>В C# они могут быть только static.

WH>Но мне захотелось странного.

WH>
WH>class Test
WH>{
WH>  private _someTable : Dictionary[Foo, Bar];
WH>  private AsBar(this foo : Foo) : Bar
WH>  {
WH>    _someTable[foo]
WH>  }
WH>  private DoSome()
WH>  {
WH>    foo.AsBar().SomeBarMethod();
WH>  }
WH>}
WH>


они будут доступны только внутри Test?
непонятно тогда в чем профит по сравнению с AsBar(foo).SomeBarMethod();
In Zen We Trust
Re[2]: Экземплярные методы расширения.
От: WolfHound  
Дата: 27.03.13 11:22
Оценка:
Здравствуйте, Abyx, Вы писали:

A>они будут доступны только внутри Test?

Да. C# кстати позволяет приватные методы расширения делать.

A>непонятно тогда в чем профит по сравнению с AsBar(foo).SomeBarMethod();

А в чем профит обычных методов расширений?
Ведь всегда можно использовать обычный синтаксис.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Экземплярные методы расширения.
От: Abyx Россия  
Дата: 27.03.13 11:31
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

A>>они будут доступны только внутри Test?

WH>Да. C# кстати позволяет приватные методы расширения делать.

A>>непонятно тогда в чем профит по сравнению с AsBar(foo).SomeBarMethod();

WH>А в чем профит обычных методов расширений?
WH>Ведь всегда можно использовать обычный синтаксис.

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

а если экземплярные можно юзать только внутри реализации классов, это не очень-то интересно.
In Zen We Trust
Re: Экземплярные методы расширения.
От: Abyx Россия  
Дата: 27.03.13 11:58
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Какие будут мысли насчет данной функциональности?


ок, пока я вижу только такое применение:
class Test
{
  private m_;
  private f(this foo : Foo, x : int) : Foo { foo.f(x, m_); return foo; }
  private g(this foo : Foo) : Foo { foo.g(m_); return foo; }
  ...

  private DoSome()
  {
    Foo foo1 = ...;
    foo1.f(1).g();

    Foo foo2 = ...;
    foo2.f(2)...
  }
}


вместо

  private DoSome()
  {
    Foo foo1 = ...;
    foo1.f(1, m_);
    foo1.g(m_);

    Foo foo2 = ...;
    foo2.f(2, m_);
    ...
  }


или

class Test
{
  private m_;
  private f(foo : Foo, x : int) { foo.f(x, m_); }
  private g(foo : Foo) { foo.g(m_); }
  ...

  private DoSome()
  {
    Foo foo1 = ...;
    f(foo1, 1)
    g(foo1);

    Foo foo2 = ...;
    f(foo2, 2);
  }
}
In Zen We Trust
Re: Экземплярные методы расширения.
От: Ziaw Россия  
Дата: 27.03.13 12:00
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Какие будут мысли насчет данной функциональности?


Мне нравится. Часто их не хватает. То, что написать можно и по другому это фигня, когда хочется именно такого синтаксиса. Ограничивать private не стоит, как минимум нужен еще и protected, а то и public, пусть его снаружи вызывают обычным способом, а внутри как метод расширения.
Re[2]: Экземплярные методы расширения.
От: WolfHound  
Дата: 27.03.13 13:02
Оценка: -2
Здравствуйте, Abyx, Вы писали:

A>ок, пока я вижу только такое применение:

Я не понимаю, что ты пытаешься доказать?
То, что без этого можно обойтись?
Да можно.
Но и без обычных методов расширений можно обойтись.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Экземплярные методы расширения.
От: WolfHound  
Дата: 27.03.13 13:02
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Ограничивать private не стоит, как минимум нужен еще и protected, а то и public, пусть его снаружи вызывают обычным способом, а внутри как метод расширения.

А я этого и не предлагал.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Экземплярные методы расширения.
От: Abyx Россия  
Дата: 27.03.13 13:31
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Я не понимаю, что ты пытаешься доказать?

доказывать тут должен только ты.
motivating example и всё такое.
In Zen We Trust
Re[4]: Экземплярные методы расширения.
От: WolfHound  
Дата: 27.03.13 13:41
Оценка:
Здравствуйте, Abyx, Вы писали:

A>доказывать тут должен только ты.

A>motivating example и всё такое.
Так я в первом сообщении показал что хочу.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: Экземплярные методы расширения.
От: Abyx Россия  
Дата: 27.03.13 13:58
Оценка:
Здравствуйте, WolfHound, Вы писали:

A>>доказывать тут должен только ты.

A>>motivating example и всё такое.
WH>Так я в первом сообщении показал что хочу.
да, я понял что ты хочешь, но не понял зачем это надо.

вот представь, есть операция деления "a / b",
а ты пишешь, "хочу чтоб можно было писать `b \ a` вместо `a / b`".
всем понятно *что* ты хочешь, непонятно *зачем*.
In Zen We Trust
Re[5]: Экземплярные методы расширения.
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.03.13 14:50
Оценка:
Здравствуйте, WolfHound, Вы писали:

A>>доказывать тут должен только ты.

A>>motivating example и всё такое.
WH>Так я в первом сообщении показал что хочу.

Мотивация нигде не раскрыта, ты просто показал "что", а мотивация это "для чего".
Re: Экземплярные методы расширения.
От: nau  
Дата: 27.03.13 15:18
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Про методы расширения в C# наверное все вкурсе.

WH>http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx
WH>В C# они могут быть только static.

WH>Какие будут мысли насчет данной функциональности?


Правильно ли я понимаю, что тебе хочется Scala implicit conversions?

Можно такое делать:

class Test {
  private _someTable : Map[Foo, Bar];
  implicit def foo2Bar(foo: Foo): Bar = _someTable(foo)

  private DoSome() {
    foo.SomeBarMethod()
  }
}



Очень мощная штука, только нужно быть с ней очень осторожным. В Scala 2.10 это фичу даже нужно включать специальным импортом (import language.implicitConversions)
В теории практика не отличается от теории, но на практике — отличается
Re: Экземплярные методы расширения.
От: hi_octane Беларусь  
Дата: 27.03.13 15:20
Оценка:
WH>Какие будут мысли насчет данной функциональности?

Было бы — применял бы. Главное чтоб go to definition работал
Re: Экземплярные методы расширения.
От: maxkar  
Дата: 27.03.13 15:31
Оценка:
Да вроде бы имеет право на жизнь. В Scala похожее можно делать:

import scala.collection.mutable.HashMap
import scala.language.implicitConversions

case class Test1(str: String)

class Test3(v: String) {
  def getV(): String = { v };
}

class Test2 {
  private val map = new HashMap[Test1, Test3]

  implicit private def asBar(test1: Test1): Test3 = {
    map.get(test1).get
  }

  private def doSome(test1: Test1): String = {
    test1.getV()
  }
}


Да, синтаксис другой. И методы через обертку обычно добавляются (keywords: pimp my library pattern). Хотя в 2.10 сделали инлайнинг оберток для случаев, поэтому обычные extension methods теперь будут без оверхеда.
Re: Экземплярные методы расширения.
От: michael_isu Беларусь  
Дата: 28.03.13 07:06
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Про методы расширения в C# наверное все вкурсе.

WH>http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx
WH>В C# они могут быть только static.

WH>Какие будут мысли насчет данной функциональности?


Захламил класс Test методом AsBar. Зачем?
Re[2]: Экземплярные методы расширения.
От: WolfHound  
Дата: 28.03.13 09:43
Оценка:
Здравствуйте, michael_isu, Вы писали:

_>Захламил класс Test методом AsBar. Зачем?

Что значит захламил? Что ты предлагаешь? Напрямую в someTable ходить? А если логика чуть сложнее?
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Экземплярные методы расширения.
От: WolfHound  
Дата: 28.03.13 09:43
Оценка:
Здравствуйте, nau, Вы писали:

nau>Правильно ли я понимаю, что тебе хочется Scala implicit conversions?

Что-то типа того. Только явное.

nau>Очень мощная штука, только нужно быть с ней очень осторожным. В Scala 2.10 это фичу даже нужно включать специальным импортом (import language.implicitConversions)

В немерле обычное дело синтаксис импортами подключать.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Экземплярные методы расширения.
От: michael_isu Беларусь  
Дата: 28.03.13 10:38
Оценка: :)
Здравствуйте, WolfHound, Вы писали:

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


_>>Захламил класс Test методом AsBar. Зачем?

WH>Что значит захламил? Что ты предлагаешь? Напрямую в someTable ходить? А если логика чуть сложнее?

Значит добавил "деревьев", за которыми не видно "леса". Т.е. добавил технических малозначительных методов, которые среди значимых методов DoSome и прочих как бельмо на глазу. Зачем загружать мозг читателя этого кода лишней информацией? (7+-2, ага) Ему скорее всего совершенно не интересен будет этот метод, а его наличием заставляешь загружать его в мозг волей-неволей, а мозги стоит беречь, не только того кто залезет в этот код, но и свои тоже.

Предлагаю положить его в TestExtensions и использовать как экстеншн метод. Если в разных местах нужна разная логика хождения — делаешь 2 разных extensions-класса и подключаешь нужный через namespace по месту.
Re[4]: Экземплярные методы расширения.
От: WolfHound  
Дата: 28.03.13 10:51
Оценка: +2
Здравствуйте, michael_isu, Вы писали:

_>Значит добавил "деревьев", за которыми не видно "леса". Т.е. добавил технических малозначительных методов, которые среди значимых методов DoSome и прочих как бельмо на глазу. Зачем загружать мозг читателя этого кода лишней информацией? (7+-2, ага) Ему скорее всего совершенно не интересен будет этот метод, а его наличием заставляешь загружать его в мозг волей-неволей, а мозги стоит беречь, не только того кто залезет в этот код, но и свои тоже.


1)Методы для того и разделяют чтобы убирать лишнюю информацию и беречь людям мозг.
2)Приватные методы для того и придумали чтобы убирать туда код который нужен только в данном классе.
3)Убирание метода в другой класс количество сущностей увеличивает. Появляется новый класс.

_>Предлагаю положить его в TestExtensions и использовать как экстеншн метод. Если в разных местах нужна разная логика хождения — делаешь 2 разных extensions-класса и подключаешь нужный через namespace по месту.

А то, что мне нужно обращаться к данным, которые лежат в экземпляре класса ты конечно не заметил.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.