Re[18]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 09:03
Оценка:
Здравствуйте, stalcer, Вы писали:

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


FDS>>Не пойдёт! К сожалению. Смысл в том, что оператор должен прекращать выполнение обработки условного выражения, а не возвращать значение по умолчанию. Как тогда справиться с последовательным вызовом a.?b.?c.? Хранить "нулевые" объекты-значения по умолчанию?


S>А чего не пройдет-то? С последовательным вызовом как раз все нормально. Например, a.?b.?c.?Age

S>Пусть поле 'b' будет равно null.

S>1) A tmp1 = a; // not null

S>2) B tmp2 = (tmp1 != null) ? tmp1.b : null; // a.b (== null)
S>3) C tmp3 = (tmp2 != null) ? tmp2.c : null; // null, так как tmp2 == null
S>4) int tmp4 = (tmp3 != null) ? tmp3.Age : 0; // 0, так как tmp3 == null

S>Результат будет 0 (ноль).


Ага. Получится NULL > 16?
Re[5]: С# 3.0
От: WolfHound  
Дата: 16.09.05 09:05
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Что должно быть на каждом шаге? Какого типа каждое из этих промежуточных выражений?


S>А если так:

S>
S>int x = Root.?Config.?User.?Age;
S>

В C#2 появились nullable типы.
Те в данном случае будет так
int? x = Root.?Config.?User.?Age;

и приводится это к такому коду
int? x;
if (Root != null && Root.Config != null && Root.Config.User != null)
    x = Root.Config.User.Age;
else
    x = null;


В C#2 такой код
int? a;
a = null;
Console.WriteLine(a > 1);
a = 1;
Console.WriteLine(a > 1);
a = 2;
Console.WriteLine(a > 1);

выводит
False
False
True

Те в случае если a == null то любые сравнения с числом возвращают false.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: С# 3.0
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.09.05 09:07
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Я думаю, необязательно именно возвращать NULL. Можно, например, просто выходить без исключения из условного оператора, так как условие заранее не выполнено.

int age;
try {  age = Root.Config.User.Age;} 
catch (NullReferenceException)  {age=0;}
if (age > 16)
{
  bla-bla
|

Значительно короче. И не растет с удлиннением выражения.
... << RSDN@Home 1.1.4 stable rev. 510>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[19]: С# 3.0
От: stalcer Россия  
Дата: 16.09.05 09:07
Оценка:
Здравствуйте, FDSC, Вы писали:

S>>1) A tmp1 = a; // not null

S>>2) B tmp2 = (tmp1 != null) ? tmp1.b : null; // a.b (== null)
S>>3) C tmp3 = (tmp2 != null) ? tmp2.c : null; // null, так как tmp2 == null
S>>4) int tmp4 = (tmp3 != null) ? tmp3.Age : 0; // 0, так как tmp3 == null

S>>Результат будет 0 (ноль).


FDS>Ага. Получится NULL > 16?


Стоп. tmp4 имеет тип int, и значение не null, а 0.
http://www.lmdinnovative.com (LMD Design Pack)
Re[20]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 09:09
Оценка:
Здравствуйте, stalcer, Вы писали:

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


S>>>1) A tmp1 = a; // not null

S>>>2) B tmp2 = (tmp1 != null) ? tmp1.b : null; // a.b (== null)
S>>>3) C tmp3 = (tmp2 != null) ? tmp2.c : null; // null, так как tmp2 == null
S>>>4) int tmp4 = (tmp3 != null) ? tmp3.Age : 0; // 0, так как tmp3 == null

S>>>Результат будет 0 (ноль).


FDS>>Ага. Получится NULL > 16?


S>Стоп. tmp4 имеет тип int, и значение не null, а 0.


М-м. Видать я не совсем понял. Надо бы более строгое описание.

Если так — согласен. Очередь за Microsoft
Re[6]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 09:10
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>В C#2 появились nullable типы.


Спасибо. Это как раз то, что мы обсуждали.
Re[5]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 09:13
Оценка:
Здравствуйте, Sinclair, Вы писали:

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


FDS>>Я думаю, необязательно именно возвращать NULL. Можно, например, просто выходить без исключения из условного оператора, так как условие заранее не выполнено.

S>
S>int age;
S>try {  age = Root.Config.User.Age;} 
S>catch (NullReferenceException)  {age=0;}
S>if (age > 16)
S>{
S>  bla-bla
S>|
S>

S>Значительно короче. И не растет с удлиннением выражения.

А исполняется это значительно медленее и не очень читаемо (такое впечатление). Тут вопрос был ещё и в том, что возможно один из объектов не может быть равен NULL и это нужно обработать как ошибку.
Re[6]: С# 3.0
От: stalcer Россия  
Дата: 16.09.05 09:14
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>В C#2 появились nullable типы.

WH>Те в данном случае будет так
WH>
WH>int? x = Root.?Config.?User.?Age;
WH>


То есть оператор '.?' уже есть?

WH>Те в случае если a == null то любые сравнения с числом возвращают false.


Операции как в SQL? Наверное не только к сравнениям относится, на и к другим операциям (+, — и т.п.)

А спецификация есть в инете? Где почитать?
http://www.lmdinnovative.com (LMD Design Pack)
Re[7]: С# 3.0
От: WolfHound  
Дата: 16.09.05 09:47
Оценка:
Здравствуйте, stalcer, Вы писали:

S>То есть оператор '.?' уже есть?

Такого оператора нет. Есть int? те инт который может быть null.

WH>>Те в случае если a == null то любые сравнения с числом возвращают false.

S>Операции как в SQL? Наверное не только к сравнениям относится, на и к другим операциям (+, — и т.п.)
S>А спецификация есть в инете? Где почитать?
Ищи спецификацию C#2.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: С# 3.0
От: Igor Trofimov  
Дата: 16.09.05 10:43
Оценка:
Вообще мне не очень понятно (и не очень нравится) это стремление добавить в шарп возможности (и спец-синтаксис)функционального программирования. Так ли оно надо именно в рамках шарпа, если есть F# и т.п? Мне кажется, что эта попытка собрать все в одну кучу-малу до добра не доведет — пропадает простота, лаконичность, концептуальная цельность.. Или это во мне говорит закоренелый консерватор, воспитанный на императивных языках?
Re[6]: С# 3.0
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.09.05 10:43
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>А исполняется это значительно медленее

Ну, насчет "значительнее" — зависит только от вероятности того, что кто-то все-таки null. Если такая ситуация встречается слишком часто, то надо будет пересмотреть логику. Тем не менее, premature optimization is the root of all evil.
FDS>и не очень читаемо (такое впечатление).
Это ошибочное впечатление. Более короткий код читается всегда легче. Во-первых, здесь с первого взгляда виден весь путь доступа (Root.Config.User.Age) без необходимости продираться через цепочку присваиваний (именно за такой эффект всегда критиковали конструкцию with в паскале). Во-вторых, единство политики обработки отсутствия данных выражено ровно в одной строке — сразу видно, что где бы ни произошел NullReferenceException, мы примем дефолтный возраст за Null.
FDS> Тут вопрос был ещё и в том, что возможно один из объектов не может быть равен NULL и это нужно обработать как ошибку.
Простите, но в начальном коде этого не было. См. Re: С# 3.0
Автор: DarkGray
Дата: 15.09.05
. Проблема была ровно в том, что приходится писать паразитный код для проверок. Я привел корректное решение этой проблемы.
... << RSDN@Home 1.1.4 stable rev. 510>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: С# 3.0
От: GlebZ Россия  
Дата: 16.09.05 11:09
Оценка: 5 (2) +1
Здравствуйте, AndrewVK, Вы писали:

Честно говоря, я пришел к выводу, что все нововведения построены ради прозрачного обслуживания DLinq, XLinq. Причем так, чтобы их интеграция небыла заметна для прикладника. Чтобы не было заметно, с чем он работает. Синтаксиса языка явно не хватало потому как для генерации и оптимизации предикатов нужно иметь AST. И оно должно быть в функциональном стиле(без лишнего состояния). Плюс генерация типов (чтобы прозрачно можно было запросы менять). Плюс расширение типов(чтобы добавлять поведение для типов к которому доступа нет, так как он создан тем-же DLinq. Ну таким образом, можно все и приплюсовать.

С уважением, Gleb.
Re[2]: С# 3.0
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.09.05 12:34
Оценка: 1 (1)
Здравствуйте, DarkGray, Вы писали:

DG>До сих пор не хватает "красивой" работы с нулевыми значениями


DG>сейчас вместо:

DG>
DG>if (Root.Config.User.Age > 16)
DG>{
DG>   //bla-bla
DG>}
DG>


DG>часто приходиться писать:


Можно воспользоваться паттерном Null Object, тогда проверок вобще делать нужно не будет.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[15]: С# 3.0
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 16.09.05 13:46
Оценка: 2 (1)
Здравствуйте, Кодёнок, Вы писали:

Кё>Нет, оператор не дожен возвращать никакой тип, иначе ничего не выйдет Именно это мне и показалось интересным — не простое вычисление выражения в операторе if по правилам языка, а какое-то более сложное поведение, в данном случае — считать само условие невыполненным в случае невозможности вычислить аргументы.


Как работает nil в Objective-C:

nil возвращаемый из методов в Objective-C /.../ в ответ на посылаемое ему сообщение nil не бросает исключение, а попросту игнорирует это сообщение. То есть, nil из Objective-C ведёт себя как "черная дыра". Это пустота. Это ничто. При посылке к nil-у любого сообщения, всё что вы получите назад — это nil. Не будет никаких исключений, никаких возвращенных значений. Ничего.
/.../
поведение ``поедающее'' сообщения позволяет создавать более элегантный код!
/.../
Предположим, что мы хотим найти последний телефонный номер, который вы набрали со своего офисного телефона, и сохранить этот номер в переменной, скажем, 'последнийНомер'. Далее предположим, что мы хотим сохранить этот номер как строку и затем отобразить его в виджете (или же использовать этот номер позже). Если вы -- это 'человек' в последовательности сообщений приведённой далее, то достаточно ли этой последовательности для получения работоспособной программы?


    последнийНомер := человек офис телефон последнийИсходящийНомер какСтрока.
    виджет строковоеЗначение: последнийНомер.

Возможно.

Но что, если у человека нет офиса? Или в офисе нет телефона? Или что если это новый телефон и по нему еще никто не звонил? В любом из этих случаев, при использовании ``исключенческого'' nil-а будет выброшено исключение, которое приведёт к остановке программы, если только не будет создан соответствующий обработчик исключения.

А что с nil-ом ``поедающим'' сообщения? В этом случае 'последнийНомер' может в качестве значения принять nil, но всё будет работать и в этом случае. Даже передача nil-а как аргумента для метода #строковоеЗначение:1будет работать, потому что ``поедающий'' nil может нормально работать с виджетами. Совершенно не важно, что аргумент это nil. Всё будет работать без бросания исключений и без заметных с первого взгляда побочных эффектов (на этом подробнее остановимся позже).

Для сравнения, ниже приведён код для работы с ``исключенческим'' nil-ом:

    | врем |
  врем := человек офис.
  врем неПусто еслиИстина: [врем := врем телефон].
    врем неПусто еслиИстина: [врем := врем последнийИсходящийНомер].
    врем неПусто еслиИстина: [врем := врем какСтрока].
    виджет строковоеЗначение: последнийНомер.

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[3]: С# 3.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.09.05 14:15
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Первое всё-таки лучше.


DG>>Особенно это нужно при описании правил бизнес логики, т.к. в бизнес-логики часто мы имеем на руках только частичную информацию о мире


FDS>То же с этим очень мучаюсь. Просто жуть!


А слабо придумать хорошие значения по умолчанию? Ну, 0 для возраста...
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: С# 3.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.09.05 14:15
Оценка: 1 (1)
Здравствуйте, FDSC, Вы писали:

FDS>Компилятор должен обрабатывать примерно так:


FDS>Root.Config инициализированно? — нет — выйти из условного оператора


FDS>Root.?Config.?User инициализированно? — аналогично


Создайте для всех этих классов null-объектв которые будут возвращать дефолтную информацию и не мучайтесь. Компилятор тут не причем.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: С# 3.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.09.05 14:15
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>В C#2 появились nullable типы.

WH>Те в данном случае будет так
WH>
WH>int? x = Root.?Config.?User.?Age;
WH>


Такой синтаксис не поддерживается. Откда ты это взял, я не знаю.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: С# 3.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.09.05 14:15
Оценка: 7 (3)
Здравствуйте, DarkGray, Вы писали:

DG>До сих пор не хватает "красивой" работы с нулевыми значениями


DG>сейчас вместо:

DG>
DG>if (Root.Config.User.Age > 16)
DG>{
DG>   //bla-bla
DG>}
DG>


DG>часто приходиться писать:...


Для вашей проблемы сто лет назад был придуман паттерн NuulObject. То есть объект выполняющий роль того самого null. При этом он предоставлеяет некие значения которые считаются недействительными. Для ссылочных объектов это специальные синглтон-экземлпяры, для вэлью-типов предопределенные значения. Вот пример использования данного паттерна:
class A
{
    public A(int i) { I = i; }
    public int I;
    public static readonly A Default = new A(-1);
}

class B
{
    public B() { A = A.Default; }
    public B(A a) { A = a; }
    public A A;
    public static readonly B Default = new B();
}

class Program
{
    static void Main()
    {
        B b = new B();

        int i = b.A.I;
    }
}


При этом код классов увеличевается незначительно, а основной код выглядит полностью читабельным и незамусоренным.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: С# 3.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.09.05 14:15
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Вообще мне не очень понятно (и не очень нравится) это стремление добавить в шарп возможности (и спец-синтаксис)функционального программирования. Так ли оно надо именно в рамках шарпа, если есть F# и т.п? Мне кажется, что эта попытка собрать все в одну кучу-малу до добра не доведет — пропадает простота, лаконичность, концептуальная цельность.. Или это во мне говорит закоренелый консерватор, воспитанный на императивных языках?


Функцональные возможности в Шарпе были изначально (делегатов уже достаточно). Просто их было очень неудобно использовать. Во втором шарпе их улучшели, но не самым лучшим образом. В третьем шарпе просто довели до ума идеи второго шарпа. Ничего нового в нем не введено. Просто более краткий синтаксис.

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

К тому же функциональный подход позволяет производить более детальную декомпозицию кода. Так что лишним он не будет.

Ну, и главное, что функциональный стиль не навязывается обязательным. Те кто его не понимает могут пользоваться только его плодами. Не думаю, что это будет проблемой.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: С# 3.0
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 16.09.05 14:24
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Функцональные возможности в Шарпе были изначально (делегатов уже достаточно). Просто их было очень неудобно использовать. Во втором шарпе их улучшели, но не самым лучшим образом. В третьем шарпе просто довели до ума идеи второго шарпа. Ничего нового в нем не введено. Просто более краткий синтаксис.


Врядли синтаксис тех лямб пойдёт в серию. Там же ни одной скобки нету. Ни круглой ни фигурной. Массы такого абстракционизма не поймут
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.