Re[8]: Синтаксический оверхед в C# / Java
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.07.05 09:52
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Что-то я глубоко сомневаюсь, что IntelliSense когда-нибудь сможет предложить `Some.Namespace.daFunction(new System.Drawing.Point(30,5))` в качестве правой части


Где именно? Если после new, то без проблем, если саму функцию, то тоже проблем особых нет.
... << RSDN@Home 1.2.0 alpha rev. 508>>
AVK Blog
Re[8]: Синтаксический оверхед в C# / Java
От: WolfHound  
Дата: 05.07.05 09:53
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Что-то я глубоко сомневаюсь, что IntelliSense когда-нибудь сможет предложить `Some.Namespace.daFunction(new System.Drawing.Point(30,5))` в качестве правой части

ReSharper поставь.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: PS
От: WFrag США  
Дата: 05.07.05 10:10
Оценка:
Здравствуйте, Oyster, Вы писали:

WF>>Советую обратить внимание на языки с системой типов Хиндлей-Миллнера (с выведением типов, естественно). Сдается мне, это то, что вы тут неявно обсуждаете.


O>Не совсем (или совсем не). В C#-то уже другая система типов.


Не знаю, не знаю. Очень похоже.

Тоже есть квантор A, также только на самом внешнем уровне (дженерики). Типовые переменные также могут принимать значения только типов без кванторов (т.е параметром дженерика нельзя передать дженерик). Вводится два способа создания подтипов — наследование классов и абстракция.

По-моему, оно. Или нет?
Re[7]: Синтаксический оверхед в C# / Java
От: L.C.R. Россия lj://_lcr_
Дата: 05.07.05 10:16
Оценка:
AndrewVK,

AVK>Лучше наоборот — по левой части предлагать соответствующие подсказки длоя правой. Кстати о new — современные редакторы после new предлагают список конструкторов в соответствии с типом левой части выражения, так что напрактике его (new) отмена приведет только к большей трудоемкости набора кода.


Кстати, эти интеллектуальные подсказчики используют то, что слово new входит в язык. При отсутствии ключевого слова new подсказчикам просто нужно смотреть по-другому, чтобы вывести такие подсказки. Более того, даже не нужно выяснять, можно ли в данном конкретном месте программы создавать экземпляры объектов. Достаточно выяснить, возможен ли идентификатор типа в данном месте, и какие ограничения на этот тип.

Например:
MyClass c = a + <подсказка>;


В месте обозначенном <подсказка> возможен идентификатор типа. Какого типа? Любого типа, который фигурирует в перегруженном операторе "+" для класса объекта a в качестве второго параметра.

Ну или на худой конец, создание объекта повесить на отдельный шорткат.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[7]: PS
От: Oyster Украина https://github.com/devoyster
Дата: 05.07.05 10:23
Оценка:
Здравствуйте, WFrag, Вы писали:

O>>Не совсем (или совсем не). В C#-то уже другая система типов.


WF>Не знаю, не знаю. Очень похоже.


WF>Тоже есть квантор A, также только на самом внешнем уровне (дженерики). Типовые переменные также могут принимать значения только типов без кванторов (т.е параметром дженерика нельзя передать дженерик). Вводится два способа создания подтипов — наследование классов и абстракция.


WF>По-моему, оно. Или нет?


А как быть с интерфейсами? Имхо множественное наследование и явная реализация интерфейсов в C# не дают возможности всегда вывести тип. Та же фигня с ключёвым словом new для члена в наследнике (прерывание наследования).
Re[8]: Синтаксический оверхед в C# / Java
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.07.05 10:34
Оценка:
Здравствуйте, L.C.R., Вы писали:

LCR>Кстати, эти интеллектуальные подсказчики используют то, что слово new входит в язык. При отсутствии ключевого слова new подсказчикам просто нужно смотреть по-другому, чтобы вывести такие подсказки.


Точно такие не получится. К примеру когда я пишу MyClass mc = new и нажимаю пробел, то мне вываливается список всех доступных конструкторов MyClass (если он конечно не абстрактный или не является интерфейсом). А вот в варианте с опущенным new однозначно определить, что речь идет о конструкторе, можно только после того как наберешь MyClass mc = MyClass(, а в таком разе уже и подсказывать нечего. Итого — вариант без new в современном IDE требует больше ручной работы.

LCR> Более того, даже не нужно выяснять, можно ли в данном конкретном месте программы создавать экземпляры объектов. Достаточно выяснить, возможен ли идентификатор типа в данном месте, и какие ограничения на этот тип.


LCR>Например:

LCR>
LCR>MyClass c = a + <подсказка>;
LCR>


LCR>В месте обозначенном <подсказка> возможен идентификатор типа. Какого типа? Любого типа, который фигурирует в перегруженном операторе "+" для класса объекта a в качестве второго параметра.


Бесполезная подсказка. Сложение с вызовом конструктора используется довольно редко, чаще это константа или другая переменная.

LCR>Ну или на худой конец, создание объекта повесить на отдельный шорткат.


Неудобно и нелогично.
... << RSDN@Home 1.2.0 alpha rev. 508>>
AVK Blog
Re[8]: PS
От: WFrag США  
Дата: 05.07.05 10:48
Оценка:
Здравствуйте, Oyster, Вы писали:

O>А как быть с интерфейсами? Имхо множественное наследование и явная реализация интерфейсов в C# не дают возможности всегда вывести тип.


O>Та же фигня с ключёвым словом new для члена в наследнике (прерывание наследования).


Да, наверное, ты прав.
Re[3]: Синтаксический оверхед в C# / Java
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.05 12:26
Оценка: +1
Здравствуйте, Александр Сергеевич, Вы писали:

АС>Этим. Тем что обычная функция(конструктор ведь тоже функция) не может совпадать с именем класса...

Вот полностью рабочий пример:
class Test { }

class Program
{
    static Test Test() { return new Test(); }
    
    static void Main(string[] args)
    {
        Test test = Test();
    }
}
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Синтаксический оверхед в C# / Java
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.05 12:26
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>А зачем их различать?


1. Чтобы обеспечить различие между вызовом конструктора и функции.
2. Чтобы сократить количество мест где может возникнуть перегрузка.

Если уж говорить об улучшении синтаксиса... то я бы скорее подумал о том, чтобы заменить С-ишное приведение типов на функциональный вид. Вот тут действительно разница не велика, а функциональный вид удобнее.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Синтаксический оверхед в C# / Java
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.05 12:26
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>нет, несогласны. Что здесь действительно избыточно — так это двойное повторение MyClass


Согласен. Намного было бы удобнее если бы язык сильнее пользовался бы выводом типов. Например, можно было бы ввести конструкцию def. Тогда объявление переменной можно было бы сделать так:
def myVariable = new SomeVeryLongNamespace.SomeVeryBigType();
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Синтаксический оверхед в C# / Java
От: Александр Сергеевич Россия  
Дата: 05.07.05 12:49
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Александр Сергеевич, Вы писали:


АС>>Этим. Тем что обычная функция(конструктор ведь тоже функция) не может совпадать с именем класса...

VD>Вот полностью рабочий пример:
VD>
VD>class Test { }

VD>class Program
VD>{
VD>    static Test Test() { return new Test(); }
    
VD>    static void Main(string[] args)
VD>    {
VD>        Test test = Test();
VD>    }
VD>}
VD>

Да... жеска, не думал что так можно
Ну значит запретить такую ситуацию надо при отключении new.
<<Winamp играет: silent>>
Re[5]: Синтаксический оверхед в C# / Java
От: Александр Сергеевич Россия  
Дата: 05.07.05 12:58
Оценка:
В принципе, если честно, то мне больше нравится такой синтаксис (это если без new, который меня вполне устраивает):

MyObject myObj;
myObj.Create();


Ну или так:
Create(myObj);


Понятно, что тут тогда пойдет речь о резервировании одного слова.

Так что при всех вариантах оверхед с new оправдан.
<<Winamp играет: silent>>
Re[5]: Синтаксический оверхед в C# / Java
От: Oyster Украина https://github.com/devoyster
Дата: 05.07.05 13:01
Оценка: +1
Здравствуйте, Александр Сергеевич, Вы писали:

[... skipped ...]

АС>Да... жеска, не думал что так можно

АС>Ну значит запретить такую ситуацию надо при отключении new.

И как ты себе это представляешь? Запретить давать мемберу класса такое же имя, как имя любого другого класса из любой сборки в references? Или обязательно обращаться к статическим мемберам класса через имя класса, а к мемберам инстанса — через this (гемморой не меньше)?
Re[3]: Синтаксический оверхед в C# / Java
От: Александр Сергеевич Россия  
Дата: 05.07.05 13:04
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Дарней, Вы писали:


Д>>нет, несогласны. Что здесь действительно избыточно — так это двойное повторение MyClass


VD>Согласен. Намного было бы удобнее если бы язык сильнее пользовался бы выводом типов. Например, можно было бы ввести конструкцию def. Тогда объявление переменной можно было бы сделать так:

VD>
VD>def myVariable = new SomeVeryLongNamespace.SomeVeryBigType();
VD>

Тогда лучше если есть дефолтный конструктор, вместо = new SomeVeryLongNamespace.SomeVeryBigType(); писать так:
def myVariable;
myVariable.DoSmth();

Кстати в случае def myVariable = new SomeVeryLongNamespace.SomeVeryBigType(), myVariable будет иметь тип SomeVeryLongNamespace.SomeVeryBigType.
А если надо так:
public class MyClass: BaseClass
{}

BaseClass bc = new MyClass();
<<Winamp играет: silent>>
Re[6]: Синтаксический оверхед в C# / Java
От: Александр Сергеевич Россия  
Дата: 05.07.05 13:09
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Здравствуйте, Александр Сергеевич, Вы писали:


O>[... skipped ...]


АС>>Да... жеска, не думал что так можно

АС>>Ну значит запретить такую ситуацию надо при отключении new.

O>И как ты себе это представляешь? Запретить давать мемберу класса такое же имя, как имя любого другого класса из любой сборки в references?

Угу
<<Winamp играет: silent>>
Re[5]: Синтаксический оверхед в C# / Java
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.05 13:11
Оценка:
Здравствуйте, Александр Сергеевич, Вы писали:

АС>Да... жеска, не думал что так можно

АС>Ну значит запретить такую ситуацию надо при отключении new.

Лучше пусть будет new. По жизни он не мешает. Вот что действительно нужно было бы добавить, так это упрощенную инициаилизацию массивов и вывод типо. Это бы действительно сделало бы код короче и проще.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Синтаксический оверхед в C# / Java
От: L.C.R. Россия lj://_lcr_
Дата: 05.07.05 13:12
Оценка:
AndrewVK,

AVK>Точно такие не получится. К примеру когда я пишу MyClass mc = new и нажимаю пробел, то мне вываливается список всех доступных конструкторов MyClass (если он конечно не абстрактный или не является интерфейсом). А вот в варианте с опущенным new однозначно определить, что речь идет о конструкторе, можно только после того как наберешь MyClass mc = MyClass(, а в таком разе уже и подсказывать нечего. Итого — вариант без new в современном IDE требует больше ручной работы.


(По-прежнему в предположении, что отсутствует new). Я набираю =, мне вываливается список типов и объектов, которые подходят сюда. Из типов — это:
1. Тип в левой части или его производный
2. Типы, содержащие статические методы, которые возвращают тип в левой части или его производный.
Второй пункт можно не реализовывать — пользы ноль, а тормоза будут хорошие.

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

Что не так?

AVK>Бесполезная подсказка. Сложение с вызовом конструктора используется довольно редко, чаще это константа или другая переменная.


Я этот пример привёл как демонстрацию того, где может появиться идентификатор типа (у нас как бы new уже нет ). То есть я, говоря "возможен", подразумеваю, "да, существующие объекты, константы, но ещё возможен и конструктор подходящего типа".

LCR>>Ну или на худой конец, создание объекта повесить на отдельный шорткат.

AVK>Неудобно и нелогично.
Удобство — реальность субъективная, относительная, и неоднородна во времени.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[4]: Синтаксический оверхед в C# / Java
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.05 13:24
Оценка:
Здравствуйте, Александр Сергеевич, Вы писали:


АС>Тогда лучше если есть дефолтный конструктор, вместо = new SomeVeryLongNamespace.SomeVeryBigType(); писать так:

АС>
АС>def myVariable;
АС>myVariable.DoSmth();
АС>


Так лучше не писать. Все же намерения лучше выражать явно. У тебя не указан тип переменный. Вывести его в данном случае не откуда. Я же привел пример вывода типа. Когда тип одного выражения выводится из другого. Информации при этом не теряется и язык меняется незначительно.

АС>Кстати в случае def myVariable = new SomeVeryLongNamespace.SomeVeryBigType(), myVariable будет иметь тип SomeVeryLongNamespace.SomeVeryBigType.

АС>А если надо так:
АС>
АС>public class MyClass: BaseClass
АС>{}

АС>BaseClass bc = new MyClass();
АС>


Если надо так, то так и пиши. def — это возможность не писать информации которая уже есть. Если информации нехватает, то ее нужно задать явно.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Синтаксический оверхед в C# / Java
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.07.05 13:34
Оценка:
Здравствуйте, L.C.R., Вы писали:

LCR>(По-прежнему в предположении, что отсутствует new). Я набираю =, мне вываливается список типов и объектов, которые подходят сюда. Из типов — это:

LCR>1. Тип в левой части или его производный
LCR>2. Типы, содержащие статические методы, которые возвращают тип в левой части или его производный.

Почему статические? instance методы тоже. А еще все поля и локальные переменные того же или совместимого типа. То есть список получается весьма нехилый, в то время как список конструкторов обычно очень небольшой.
... << RSDN@Home 1.2.0 alpha rev. 508>>
AVK Blog
Re[11]: Синтаксический оверхед в C# / Java
От: L.C.R. Россия lj://_lcr_
Дата: 05.07.05 18:23
Оценка:
AndrewVK,

LCR>>(По-прежнему в предположении, что отсутствует new). Я набираю =, мне вываливается список типов и объектов, которые подходят сюда. Из типов — это:

LCR>>1. Тип в левой части или его производный
LCR>>2. Типы, содержащие статические методы, которые возвращают тип в левой части или его производный.

AVK>Почему статические? instance методы тоже. А еще все поля и локальные переменные того же или совместимого типа. То есть список получается весьма нехилый, в то время как список конструкторов обычно очень небольшой.


(Ой, про "свои" методы и прочее забыл). Согласен, список будет большой. Поэтому я и подумал, что можно и этот пункт не реализовывать.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.