Re[2]: Экземплярные методы расширения.
От: WolfHound  
Дата: 27.03.13 13:02
Оценка: -2
Здравствуйте, Abyx, Вы писали:

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

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

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

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

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

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

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

а если экземплярные можно юзать только внутри реализации классов, это не очень-то интересно.
In Zen We Trust
Re[3]: Экземплярные методы расширения.
От: michael_isu Беларусь  
Дата: 28.03.13 10:38
Оценка: :)
Здравствуйте, WolfHound, Вы писали:

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


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

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

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

Предлагаю положить его в TestExtensions и использовать как экстеншн метод. Если в разных местах нужна разная логика хождения — делаешь 2 разных extensions-класса и подключаешь нужный через namespace по месту.
Экземплярные методы расширения.
От: 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[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: Экземплярные методы расширения.
От: 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
Оценка:
Здравствуйте, 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[5]: Экземплярные методы расширения.
От: michael_isu Беларусь  
Дата: 28.03.13 11:35
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


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

WH>
WH>1)Методы для того и разделяют чтобы убирать лишнюю информацию и беречь людям мозг.

Когда методов становится слишком много (кол-во строк кода > 25.000), одним разделением методов не отделаетесь.

WH>3)Убирание метода в другой класс количество сущностей увеличивает. Появляется новый класс.


Ничего страшного.

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

WH>А то, что мне нужно обращаться к данным, которые лежат в экземпляре класса ты конечно не заметил.

Не заметил.
Вообще пихать в один класс диспетчеризацию и бизнес-логику — дурной тон. Конкретно — Test'у нужен только Bar, все остальное нужно оттуда выпилить. Если это сделать — вопрос и проблемы уйдут сами собой.
Re: Экземплярные методы расширения.
От: Pro100Oleh Украина  
Дата: 29.03.13 16:24
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


Категорически против. Синтаксис foo.AsBar() в C# несет семантику: выполнить метод AsBar на основании состояния переменной foo (плюс глобальное статическое состояние). Статик экстеншионы не меняют эту семантику. Вы же хотите прилепить туда еще this.
Pro
Re[2]: Экземплярные методы расширения.
От: artelk  
Дата: 29.03.13 17:13
Оценка:
Здравствуйте, Pro100Oleh, Вы писали:

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


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


PO>Категорически против. Синтаксис foo.AsBar() в C# несет семантику: выполнить метод AsBar на основании состояния переменной foo (плюс глобальное статическое состояние). Статик экстеншионы не меняют эту семантику. Вы же хотите прилепить туда еще this.


Не вижу проблемы, что будет такое неявное замыкание на this. Для остальных методов же оно есть — нет необходимости всегда писать "this." для доступа к другим методам того же класса.
Re[2]: Экземплярные методы расширения.
От: Ziaw Россия  
Дата: 03.04.13 04:04
Оценка:
Здравствуйте, Pro100Oleh, Вы писали:

PO>Категорически против. Синтаксис foo.AsBar() в C# несет семантику: выполнить метод AsBar на основании состояния переменной foo (плюс глобальное статическое состояние). Статик экстеншионы не меняют эту семантику. Вы же хотите прилепить туда еще this.


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