Re[20]: Вот я не понимаю...
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.09.07 11:17
Оценка:
Здравствуйте, Sinclair, Вы писали:

M>>Нереально. То есть можно "как правило" отказаться (введя "пустой объект" данного класса, скажем пустую строку для строк), за исключением небольшого числа случаев (0 тоже долго не считали числом, но потом решили, что уж слишком удобное понятие).

S>Так Влад и предлагает ввести пустой объект "соседнего" класса.

Не очень понял термин "соседнего", но не суть. Тут вводится специальный объект который явно вводит понятие "не определено". Это заставляет компилятор выявлять места некорректного использования. С экземляром такого объекта нельзя будет попытаться произвести вычисление и получить исключение. Ты обязан будешь явно проверить, что объект задан и только после этого воспользоваться им. Вот только для реализации этого уже надо расширять язык. В клонах МЛ (коими являются Немреле и Скала) для этого используется паттерн-матчинг:
public modul Test
{
  public Method1(x : option[string], y : option[int]) : void
    {
        match (x, y)
        {
            | (Some(xVal), Some(yVal)) => WriteLine($"x=$xVal y=$yVal");
            | (None, None)             => WriteLine("x and y not set!");
            | (_, _)                   => WriteLine("x or y not set!");
        }
    }
}

Без паттерн-матчинга все будет не так красиво. Это часть концепции. Концепции очнь красивой и стройной.

В принципе на уровне рантайма (дотнета, например) можно было бы оптимизировать этот код и переписать его в код использующий null-ы.

M>>Но это будет не сильно большим выходом, ошибки NPE сейчас — чаще всего замаскированная другая ошибка. В каком-то смысле NPE — это автоматически расставляемые компилятором/VM ассерты. Не будет NPE — будут ещё более трудно уловимые баги.

S>Нет, не будет. Багов будет столько же, только ловиться будут быстрее. Как правило, у какого-то значения есть мало источников, зато много потребителей. (Типа поле инициализируется одним из трех конструкторов, а потом читается в полусотне методов). Внедрение non-null позволит раньше отловить передачу некорректного значения.

Багов будет меньше, так как система типов и язык будут требовать явной обработки для неопределенных значнеий. Будь моя воля я бы вообще запретил в языке явное приведение типов. Оставил бы оное только через паттерн-матчинг:
match (x : object)
{
    | x is int    => ... // x имеет тип int  
    | x is string => ... // x имеет тип string 
    | _           => ... // тип x другой... неизвестный нам...
}

Это конечно сделао бы код иногда чуть длиннее, но за то избавило бы от рантайм ошибок связаных с приведением типов. А это огромный класс ошибок!

M>>Не очень удобно, IMHO, так как не-null можно рассматривать как один из constraint-ов данных. Могут быть и другие условия, вроде interned объектов (которые можно сравнивать на равенство по ссылке, а не по значению). Если на одину ссылку наложить несколько условий — то не понятно в каком порядке их "оборачивать" в эти врапперы.

S>Это верно. Правильным ответом, безусловно, является паттерн-матчинг. Но реально NPE — это 98% констреинтов.

А кто говорит, что другие ограничения невозможны? Ты верно заметил про процент. Так и нужно устранять самые часто встречающуюся грабли. NPE — это бич явы и дотнета. Причем чем ниже класс программиста, тем большее он бьет по все команде.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: Вот я не понимаю...
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.09.07 11:17
Оценка:
Здравствуйте, AndrewVK, Вы писали:

S>>Так Влад и предлагает ввести пустой объект "соседнего" класса.


AVK>Не, паттерн null object проблемы не решает. Ну будет вместо NPE исключение при обращении к полям null object — только косвенность увеличится. Влад другое предлагает — ввести хотя бы частичный контроль за null на стадии компиляции, а не в рантайме.


Ага. Только не "хотя бы частичный", а полный. Но к сожалению — это скорее всего без именения рантайма не прокатит. Так что СпекШарп похоже выглядет более реальным.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: Вот я не понимаю...
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.09.07 11:17
Оценка:
Здравствуйте, Sinclair, Вы писали:

AVK>>Не, паттерн null object проблемы не решает. Ну будет вместо NPE исключение при обращении к полям null object — только косвенность увеличится.

S>Это если не пользоваться non-null object
S>Просто non-null выбросит NPE не при использовании, как сейчас, а при присваивании.

Дык, а зачем вообще исключения когда можно остановить проблему в зародыше (при компиляции)?

AVK>>Влад другое предлагает — ввести хотя бы частичный контроль за null на стадии компиляции, а не в рантайме.

S>Частичный — да. На стадии компиляции просто будет принудительно проверяться наличие проверок в оговоренных разработчиком местах.

Не. Ты не понял. На стадии компиляции будет пресикаться любая попытка пораболтать с неинициализированными ссылками. А инициализировать налом будет прсото нельзя.

Но на это, к сожалени, ни Сан, ни МС не решатся. Это будет прямы признанием трех, неоспоримых на мой вгляд, фактов:
1. В МС и Сан проморгали одни из главных граблей и приняли явно безграмотное решение.
2. В МС и Сан не умеют использовать чужой опыт (решение было в МЛ много лет назад).
3. Рантаймы дотнета и Явы содержат охринительные граблищи тупо скопированные с С/С++.

В общем, изменения слишком радикальные. Так что по техническим, и что более важно, по политическим мативам, прямых решений для них лично я не ожидаю. В прочем, технологии СингШарп могут стать спасением.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Вот я не понимаю...
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.09.07 11:17
Оценка:
Здравствуйте, nikov, Вы писали:

N>Скоро это изменится.

N>Молчу, молчу... Ребята скоро сами расскажут.

Вообще-то с Sing#-ом должна поставляться аннотированная библиотека дотнета. Но вот все куда сложнее. Sing# обеспечивает куда более сложные решения.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Вот я не понимаю...
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.09.07 11:17
Оценка:
Здравствуйте, EvilChild, Вы писали:

VD>>2. Ввести в систему типов аналог option[T] (нулабл-типы из дотнета не подходят, так как они применимы исключительно для вэйлью-типов).

EC>Они не решают эту проблему и для value types — меня компилятор не обязывает проверять есть ли значение в обёртке.
EC>Это подходит только для систем типов с алгебраическими типами данных.

Это не так. Решение найти не сложно. Конечно прийдется поменять язык, но это мелочи по сравнению с тем, что прийдется серьезно менять рантайм.

Да и нужны тут не алгеброические типы, а аналог паттерн-матчинга.

В Обероне есть понятие защиты (guard) которое является облегченным аналогом паттерн-матчинга и как раз решает похожие проблемы (безопасного повышающего приведения типов). Можно содрать это решение.

В прочем, введение алгеброических типов было бы действительно отличным решением. Но это, похоже, для МС просто слабо. Для Сана — тоже.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Вот я не понимаю...
От: EvilChild Ниоткуда  
Дата: 11.09.07 11:31
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Да и нужны тут не алгеброические типы, а аналог паттерн-матчинга.

Насколько я понимаю паттерн матчинг это процесс обратный конструированию значения алгебраического типа.
Хотя дело даже не в этом. NPE возможен когда у нас есть reference семантика.
Например в Haskell он невозможен потому как там её просто нет (всякие извраты с IORef не в счёт).
now playing: Komputer — Like A Bird
Re[21]: Вот я не понимаю...
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 11.09.07 11:51
Оценка: 2 (1)
Здравствуйте, EvilChild, Вы писали:

VD>>Да и нужны тут не алгеброические типы, а аналог паттерн-матчинга.

EC>Насколько я понимаю паттерн матчинг это процесс обратный конструированию значения алгебраического типа.
EC>Хотя дело даже не в этом. NPE возможен когда у нас есть reference семантика.
EC>Например в Haskell он невозможен потому как там её просто нет (всякие извраты с IORef не в счёт).

В языке Nice, работающем поверх JVM, сделали хорошую попытку устранения NPE: http://nice.sourceforge.net/manual.html#optionTypes

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

Что-то подобное хотят реализовать так же в ближайших версиях Eiffel-я.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[22]: Вот я не понимаю...
От: EvilChild Ниоткуда  
Дата: 11.09.07 12:07
Оценка:
Здравствуйте, eao197, Вы писали:

E>В языке Nice, работающем поверх JVM, сделали хорошую попытку устранения NPE: http://nice.sourceforge.net/manual.html#optionTypes

Насколько я понимаю это compile only фича. Т.е. с ней происходит нечто аналогичное type erasure generic'ов.
Т.е. JVM об этом ничего не знает. Интересно как выглядит из Java функция с сигнатурой void bar(?String arg).
now playing: Phage & Daniel Dreier — Green Onions
Re[21]: Вот я не понимаю...
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.09.07 12:08
Оценка:
Здравствуйте, EvilChild, Вы писали:

VD>>Да и нужны тут не алгеброические типы, а аналог паттерн-матчинга.

EC>Насколько я понимаю паттерн матчинг это процесс обратный конструированию значения алгебраического типа.

Это тебе показалось или внушили. На самом деле это некий подход к декомпозиции данных. Конечно АлТД на него ложатся идеально, но и без них он полезен.

EC>Хотя дело даже не в этом. NPE возможен когда у нас есть reference семантика.


Вот в МЛ-языках почти все по ссылке передается. Уж АлТД всегда обязаны по ссылке передаваться. Но проблем нет.

EC>Например в Haskell он невозможен потому как там её просто нет (всякие извраты с IORef не в счёт).


А Хаскеле только она и есть. Причем ссылочность там трехэтажная. Просто нет налов.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Вот я не понимаю...
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 11.09.07 12:19
Оценка:
Здравствуйте, EvilChild, Вы писали:

E>>В языке Nice, работающем поверх JVM, сделали хорошую попытку устранения NPE: http://nice.sourceforge.net/manual.html#optionTypes

EC>Насколько я понимаю это compile only фича. Т.е. с ней происходит нечто аналогичное type erasure generic'ов.
EC>Т.е. JVM об этом ничего не знает.

Имхо, в этом и вся соль. Это как со спецификацией исключений -- компилятор занимается проверками твоих намерений, но не добавляет лишних инструкций в генерируемый код.

EC>Интересно как выглядит из Java функция с сигнатурой void bar(?String arg).


Я уже давно с Java-инструментами на "вы", так что даже не знаю, как это проверить. Тем более, что у себя Nice я уже снес.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[21]: Вот я не понимаю...
От: deniok Россия  
Дата: 11.09.07 12:26
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Багов будет меньше, так как система типов и язык будут требовать явной обработки для неопределенных значнеий. Будь моя воля я бы вообще запретил в языке явное приведение типов. Оставил бы оное только через паттерн-матчинг:

VD>
VD>match (x : object)
VD>{
VD>    | x is int    => ... // x имеет тип int  
VD>    | x is string => ... // x имеет тип string 
VD>    | _           => ... // тип x другой... неизвестный нам...
VD>}
VD>

VD>Это конечно сделао бы код иногда чуть длиннее, но за то избавило бы от рантайм ошибок связаных с приведением типов. А это огромный класс ошибок!

В Хаскелле сделал
cast :: (Typeable a, Typeable b) => a -> Maybe b

изволь потом матчить Maybe на предмет удачности приведения
Prelude> (cast ’a’) :: Maybe Char
Just ’a’
Prelude> (cast ’a’) :: Maybe Bool
Nothing
Prelude> (cast True) :: Maybe Bool
Just True
Re[22]: Вот я не понимаю...
От: EvilChild Ниоткуда  
Дата: 11.09.07 12:27
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Это тебе показалось или внушили. На самом деле это некий подход к декомпозиции данных. Конечно АлТД на него ложатся идеально, но и без них он полезен.


Можешь дать своё определение?
Здесь это определяют как:

Pattern matching is used to test whether things have a desired structure, to find relevant structure, to retrieve the aligning parts, and to substitute the matching part with something else.

Проверка на null это сравнение двух значений, но никак не test whether things have a desired structure.

EC>>Хотя дело даже не в этом. NPE возможен когда у нас есть reference семантика.


VD>Вот в МЛ-языках почти все по ссылке передается. Уж АлТД всегда обязаны по ссылке передаваться. Но проблем нет.


Ты смешиваешь семантику и детали реализации.
То что что-то передаётся посредством указателя ещё не значит, что значения типа имеет ссылочную семантику.
Чтобы обозначить, что значение может отсутствовать используют Maybe, причём само значение типа Maybe не может быть null.
Если бы ссылочная семантика присутствовала, то с чего бы вдруг Maybe понадобился?

VD>А Хаскеле только она и есть. Причем ссылочность там трехэтажная. Просто нет налов.


Можешь пример привести ссылочности в Haskell?
now playing: Phage & Daniel Dreier — Salt And Vinegar
Re[24]: Вот я не понимаю...
От: EvilChild Ниоткуда  
Дата: 11.09.07 12:29
Оценка:
Здравствуйте, eao197, Вы писали:

E>Имхо, в этом и вся соль. Это как со спецификацией исключений -- компилятор занимается проверками твоих намерений, но не добавляет лишних инструкций в генерируемый код.

Т.е. о checked exceptions JVM ничего не знает?
now playing: Phage & Daniel Dreier — Salt And Vinegar
Re[25]: Вот я не понимаю...
От: mkizub Литва http://symade.tigris.org
Дата: 11.09.07 12:57
Оценка: 4 (1)
Здравствуйте, EvilChild, Вы писали:

EC>Т.е. о checked exceptions JVM ничего не знает?


Ничего.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[25]: Вот я не понимаю...
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 11.09.07 13:43
Оценка:
Здравствуйте, EvilChild, Вы писали:

E>>Имхо, в этом и вся соль. Это как со спецификацией исключений -- компилятор занимается проверками твоих намерений, но не добавляет лишних инструкций в генерируемый код.

EC>Т.е. о checked exceptions JVM ничего не знает?

Коллеги говорят, что JVM знает только сигнатуры методов (естественно, что они должны попадать в class-файлы для раздельной компиляции). Но никаких дополнительных проверок в run-time не выполяется.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[23]: Вот я не понимаю...
От: WolfHound  
Дата: 11.09.07 16:31
Оценка:
Здравствуйте, EvilChild, Вы писали:

EC>Проверка на null это сравнение двух значений, но никак не test whether things have a desired structure.

Сравнение двух значений это лишь частный случай проверки структуры.

EC>Ты смешиваешь семантику и детали реализации.

EC>То что что-то передаётся посредством указателя ещё не значит, что значения типа имеет ссылочную семантику.
EC>Чтобы обозначить, что значение может отсутствовать используют Maybe, причём само значение типа Maybe не может быть null.
EC>Если бы ссылочная семантика присутствовала, то с чего бы вдруг Maybe понадобился?
Передача по ссылке и возможность присвоить этой ссылке null понятия ортогональные.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[24]: Вот я не понимаю...
От: EvilChild Ниоткуда  
Дата: 11.09.07 16:50
Оценка:
Здравствуйте, WolfHound, Вы писали:

EC>>Ты смешиваешь семантику и детали реализации.

EC>>То что что-то передаётся посредством указателя ещё не значит, что значения типа имеет ссылочную семантику.
EC>>Чтобы обозначить, что значение может отсутствовать используют Maybe, причём само значение типа Maybe не может быть null.
EC>>Если бы ссылочная семантика присутствовала, то с чего бы вдруг Maybe понадобился?
WH>Передача по ссылке и возможность присвоить этой ссылке null понятия ортогональные.
Согласен, только не понял как это относится к процитированному. Не пояснишь?
now playing: Extrawelt & Morelle — Schmedding
Re[25]: Вот я не понимаю...
От: WolfHound  
Дата: 11.09.07 17:26
Оценка:
Здравствуйте, EvilChild, Вы писали:

EC>>>Если бы ссылочная семантика присутствовала, то с чего бы вдруг Maybe понадобился?

WH>>Передача по ссылке и возможность присвоить этой ссылке null понятия ортогональные.
EC>Согласен, только не понял как это относится к процитированному. Не пояснишь?
Так что при наличии ссылочный семантики Maybe нужна.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[26]: Вот я не понимаю...
От: EvilChild Ниоткуда  
Дата: 11.09.07 17:45
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Так что при наличии ссылочный семантики Maybe нужна.

Только если значения Maybe имеют value семантику или есть статическая гарантия,
что они не могут быть null, что в контексте этого обсуждения одно и тоже.
now playing: Chloe — Dead End
Re[27]: Вот я не понимаю...
От: WolfHound  
Дата: 11.09.07 19:27
Оценка:
Здравствуйте, EvilChild, Вы писали:

WH>>Так что при наличии ссылочный семантики Maybe нужна.

EC>Только если значения Maybe имеют value семантику или есть статическая гарантия, что они не могут быть null, что в контексте этого обсуждения одно и тоже.
Совершенно не одно и тоже.
class Test
{
    public int i = 0;
}

...
Test t1 = new Test();
Test t2 = t1;
t1.i = 1;
Console.WriteLine(t2.i);

Данный код напечатает 1.
Если class заменить на struct то этот код напечатает 0.
В этом разница между значениями и ссылками.
И это ни коем образом не относится к возможности присвоить ссылке null.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.