философия тима option
От: para  
Дата: 22.12.10 16:40
Оценка:
в чём смысл option.None, если можно вернуть null?
и
нужно ли проверять (x == null) в случае option.Some(x)?
Re: философия тима option
От: hardcase Пират http://nemerle.org
Дата: 22.12.10 17:23
Оценка:
Здравствуйте, para, Вы писали:

P>в чём смысл option.None, если можно вернуть null?


Про паттенр NullObject слышал?

def x : option[int] = None();
def y = x.WithDefault(10); // y == 10
/* иЗвиНите зА неРовнЫй поЧерК */
Re: философия тима option
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.12.10 17:48
Оценка:
Здравствуйте, para, Вы писали:

P>в чём смысл option.None, если можно вернуть null?


"option[T]" описывает необязательное значение. Значение может быть или не быть. null же в дотнете — это значение указателя.
1. null не применим к вэлью-типам. При использовании же option[T] плевать каков тип у T.
2. null является значением по умолчанию для любого указателя. Часто бывает так, что некоторые поля не должны ни в каком случае содержать null (должны всегда содержать данные). Но на практике null таки появляется полях автоматически при инициализации объекта рантаймом. Можно допустить ошибку и в поле будет null хотя это не должно было случиться по логике программы.

Когда метода (свойство) возвращает option[T], то программист четко понимает, что имеет дело с необязательным значением и должен обязательно проверять его наличие. Обойти такие проверки в немерле можно только явно.
В случае же работы с методом который возвращает некую ссылку на объект не ясно нужно ли проверять ее на null. Так что option[T] — это средство фиксации семантики в контракте метода.

Проблемой option[T] является то, что это ссылочный тип, а значит на его создание уходит относительно довольно много времени. Так что в высоко-нагруженных вычислениях он может создать проблему.

P>и

P>нужно ли проверять (x == null) в случае option.Some(x)?

По идее применение option[T] должно исключать это. Но это целиком и полностью остается на совести разработчика. Так что в конкретных случаях может быть как угодно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: философия тима option
От: para  
Дата: 22.12.10 19:11
Оценка:
Про структурные типы вопросов нет.

Здравствуйте, hardcase, Вы писали:
H>Про паттенр NullObject слышал?
осторожно отношусь к паттернам. в немерле сначала подумал про сопоставление с образцом

этот паттерн подразумевает конкретное дефолтное поведение, которое в данном случае с водится к
H>
H>def y = x.WithDefault(10); // y == 10
H>

и аналогичным методам.
но этого же можно добиться по-моему экстеншн-методом. сейчас проверить к сожалению не могу
public static WithDefault (this o : T, val : T) : T
  where T : class
{
  if(o == null)
    val
  else
    o
}


Здравствуйте, VladD2, Вы писали:
VD>2. null является значением по умолчанию для любого указателя. Часто бывает так, что некоторые поля не должны ни в каком случае содержать null (должны всегда содержать данные).
данные, которые сводятся к переменной типа None вместо null? и что с ней делать кроме проверки?

VD>В случае же работы с методом который возвращает некую ссылку на объект не ясно нужно ли проверять ее на null. Так что option[T] — это средство фиксации семантики в контракте метода.

очень хорошая возможность, но при этом было бы логично запретить использование, передачу в качестве параметра и возврат из метода значения null, причём на уровне рантайма (утопия ) и тем более для Some.

пока что я вижу option только как средство синтаксической унификации структур и классов.

довольно часто встречаю использование этой конструкции, но её использование обычно не
def y = x.WithDefault(10); // y == 10

а
      match (x) {
        | Some => ...
        | _ => ...

что было бы эквивалентно проверке на null, только больше писанины.

Зы. я не докапываюсь, а искренне хочу понять суть.
Re[2]: философия тима option
От: hardcase Пират http://nemerle.org
Дата: 22.12.10 19:21
Оценка:
Здравствуйте, para, Вы писали:

P>Про структурные типы вопросов нет.


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

H>>Про паттенр NullObject слышал?
P>осторожно отношусь к паттернам. в немерле сначала подумал про сопоставление с образцом

P>этот паттерн подразумевает конкретное дефолтное поведение, которое в данном случае с водится к

H>>
H>>def y = x.WithDefault(10); // y == 10
H>>

P>и аналогичным методам.
P>но этого же можно добиться по-моему экстеншн-методом. сейчас проверить к сожалению не могу


Как ты сведешь к экстеншонам GetHashCode и Equals?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: философия тима option
От: hardcase Пират http://nemerle.org
Дата: 22.12.10 19:23
Оценка:
Здравствуйте, para, Вы писали:

P>довольно часто встречаю использование этой конструкции, но её использование обычно не

P>
P>def y = x.WithDefault(10); // y == 10
P>

P>а
P>
P>      match (x) {
P>        | Some => ...
P>        | _ => ...
P>

P>что было бы эквивалентно проверке на null, только больше писанины.

Если я вижу, что метод вертает некоторый объект я никак не ожидаю что это будет null, за исключением случаев, описанных в документации.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: философия тима option
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.12.10 19:35
Оценка:
Здравствуйте, para, Вы писали:

Огромная просьба не отвечать на сообщения скопом. Это не ленточный сервис, древесный. Ты нарушаешь иерархию сообщений и препятствуешь работе системе оповещения об ответах. Я мог вообще не узнать что мне ответили.

P>данные, которые сводятся к переменной типа None вместо null? и что с ней делать кроме проверки?


Оно и нужно исключительно для проверок. Точнее для того чтобы их не забыли сделать.

P>очень хорошая возможность, но при этом было бы логично запретить использование, передачу в качестве параметра и возврат из метода значения null, причём на уровне рантайма (утопия ) и тем более для Some.


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

P>пока что я вижу option только как средство синтаксической унификации структур и классов.


Что-то очень умно завернуто.

P>довольно часто встречаю использование этой конструкции, но её использование обычно не

P>
P>def y = x.WithDefault(10); // y == 10
P>

P>а
P>
P>      match (x) {
P>        | Some => ...
P>        | _ => ...
P>

P>что было бы эквивалентно проверке на null, только больше писанины.

А ты подумал, какой у 10 может быть null?

P>Зы. я не докапываюсь, а искренне хочу понять суть.


option на практике делает действия с необязательными данными намного более понятными. Видя проверку:
match (x)
{
  | Some(y) => y...
  | _ => ...
}

ты отчетливо понимаешь, что здесь проверяется отсутствие или наличие значения, а не просто проверка на null c целью чтобы не долбонуло.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: философия тима option
От: catbert  
Дата: 22.12.10 20:22
Оценка:
Здравствуйте, para, Вы писали:

P>в чём смысл option.None, если можно вернуть null?


В том, что вы никогда не забудете проверить значение перед его использованием.

P>нужно ли проверять (x == null) в случае option.Some(x)?


Если внутри option-а ссылочный тип, да, к сожалению.
Re[2]: философия тима option
От: para  
Дата: 23.12.10 06:24
Оценка:
Здравствуйте, catbert, Вы писали:

P>>нужно ли проверять (x == null) в случае option.Some(x)?


C>Если внутри option-а ссылочный тип, да, к сожалению.


мне кажется стоит добавить в конструктор Some соответствующий асерт.
это наверное будет отложено до 2.0
куда кстати можно об этом записать?

да можно и целый макрос уровня сборки сделать, который бы вставлял асерты по дефолту во все методы. только как быть с внешними библиотеками?
Re[3]: философия тима option
От: hardcase Пират http://nemerle.org
Дата: 23.12.10 08:39
Оценка: :))
Здравствуйте, para, Вы писали:

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


P>>>нужно ли проверять (x == null) в случае option.Some(x)?


C>>Если внутри option-а ссылочный тип, да, к сожалению.


P>мне кажется стоит добавить в конструктор Some соответствующий асерт.


Какую проблему ты пытаешься этим решить?
Ассерт добавить такой система типов .NET не позволит тебе.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: философия тима option
От: catbert  
Дата: 23.12.10 10:06
Оценка: 2 (1) +1
Здравствуйте, para, Вы писали:

P>да можно и целый макрос уровня сборки сделать, который бы вставлял асерты по дефолту во все методы. только как быть с внешними библиотеками?


Вот именно:

    def result = Some(LibraryFunctionFromAnotherAssembly()); // неприятно будет


С другой стороны, можно добавить в язык какую-нибудь фичу, которая перед запаковкой в option требовала бы матча с null-ом. Только я не думаю, что эта фича оправдает затраты на свою реализацию.

Вообще-то, можно прямо сейчас добавть функцию (если ее уже нету) в вариант Option, которая бы проверяла ReferenceEquals(x, null) и возвращала соответственно либо None либо Some с не-null'ом. Но такое решение вообще-то не решение, потому что никто не мешает создать option по-другому.

А вот объявить конструкторы option закрытыми, и оставить только один способ создания — вроде хорошая идея. Точнее, это идея, в которой я не могу найти проблем.
Re[2]: философия тима option
От: _FRED_ Черногория
Дата: 24.12.10 05:16
Оценка:
Здравствуйте, hardcase, Вы писали:

P>>в чём смысл option.None, если можно вернуть null?

H>Про паттенр NullObject слышал?
H>def x : option[int] = None();
H>def y = x.WithDefault(10); // y == 10


А почему аналога оператора ?? для option нету?
Help will always be given at Hogwarts to those who ask for it.
Re[2]: философия тима option
От: _FRED_ Черногория
Дата: 24.12.10 05:17
Оценка:
Здравствуйте, VladD2, Вы писали:

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


А почему не сделать бы option структурой с двумя полями?
Help will always be given at Hogwarts to those who ask for it.
Re[2]: философия тима option
От: dsorokin Россия  
Дата: 24.12.10 07:49
Оценка:
Здравствуйте, VladD2, Вы писали:

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


Кстати, у конкурентов в f# значение None заменяется в байт-коде на обычный null. На днях словил из-за этого NullReferenceException. Просто попытался в отладочном коде вызвать ToString() для значения Option, а не тут-то было.
Re[3]: философия тима option
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 08:09
Оценка:
Здравствуйте, dsorokin, Вы писали:

D>Кстати, у конкурентов в f# значение None заменяется в байт-коде на обычный null. На днях словил из-за этого NullReferenceException. Просто попытался в отладочном коде вызвать ToString() для значения Option, а не тут-то было.


Вот потому — это и не есть хорошее решение. Хорошего решение же для дотнета сделать будет не просто, так как сам дотнет трактует null как значение по умолчанию для всех ссылочных данных, а ведь кроме классов есть еще структуры которые могут инициализироваться автоматически.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: философия тима option
От: catbert  
Дата: 24.12.10 09:42
Оценка: 4 (2) +1
VD>option на практике делает действия с необязательными данными намного более понятными.

Кроме того, он делает и описания типов более понятными:

    class Foocator
    {
         public Id : int { get; private set; }
         public MyBar : BarInfo { get; private set; } // может ли MyBar быть null?
    }

/** или **/

    class Foocator
    {
         public Id : int { get; private set; }
         public MyBar : option[BarInfo] { get; private set; } // явно указано, что MyBar опционален
    }


Нуллабл-типы определены только для структур, так что их так использовать не выйдет.
Re[3]: философия тима option
От: hardcase Пират http://nemerle.org
Дата: 24.12.10 11:46
Оценка: +1
Здравствуйте, _FRED_, Вы писали:

_FR>А почему не сделать бы option структурой с двумя полями?


Такая мысль есть, недавно Влад закоммитил в стандартную библиотеку структуру ValueOption. Есть определенные мысли научить ПМ работать с ней.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: философия тима option
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 15:59
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А почему аналога оператора ?? для option нету?


Потому что то что есть работает с option. Он макросом сделан, анализирует тип выражения, и генерирует специализированный код:
http://code.google.com/p/nemerle/source/browse/nemerle/trunk/macros/operators.n?r=9467
  macro @?? (exprA, exprB) 
  {
    def typer = Macros.ImplicitCTX ();      
    def tnullable = typer.InternalType.Generic_Nullable_tc;
    def toption = typer.InternalType.Nemerle_option_tc;

    def isNullable = tnullable.Equals(_);
    def isOption (t)
    {
      toption.Equals (t) 
      || (t.BaseType != null && toption.Equals (t.BaseType))
    }

    def tExprA = typer.TypeExpr(exprA);
    def tExprB = typer.TypeExpr(exprB);
    def tR = typer.FreshTypeVar(); // result type

    def resolve (check, lastTry)
    {
      match (tExprB.Type.Hint)
      {
        | Some (Class (tiB, _)) =>
            def v = if (check(tiB)) <[ $exprA ]> else <[ $exprA.Value ]>;
            Some(<[ match ($exprA.HasValue) { | true => $v | _ => $exprB } ]>)
        | None => 
            when (lastTry)
              Message.Error(exprB.Location, $"Can't infer type of right operand ($exprB) of the `??' operator");
            None()
        | _ => Some(<[ if ($exprA != null) $exprA else $exprB ]>)
      }
    }

    def checkTypes(lastTry)
    {
      match (tExprA.Type.Hint)
      {
        | None when !lastTry => None()
        | None  =>
            Message.Error(exprA.Location, $"Can't infer type of left operand ($exprA) of the `??' operator");
            None()

        | Some (Class (tiA, _)) when tiA.IsValueType && !isNullable(tiA) =>
            Message.Error(exprA.Location, $"Left operand ($exprA) of the `??' operator should be reference or nullable type ");
            None()

        | Some (Class (tiA, _))   when isNullable(tiA) => resolve(isNullable, lastTry)
        | Some (Class (tiA, [_])) when isOption(tiA)   => resolve(isOption,   lastTry)
        | _ => Some(<[ if ($exprA != null) $exprA else $exprB ]>)
      }
    }

    typer.DelayMacro(checkTypes, tR);
  }
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: философия тима option
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 16:00
Оценка:
Здравствуйте, hardcase, Вы писали:

_FR>>А почему не сделать бы option структурой с двумя полями?


H>Такая мысль есть, недавно Влад закоммитил в стандартную библиотеку структуру ValueOption. Есть определенные мысли научить ПМ работать с ней.


http://code.google.com/p/nemerle/source/browse/nemerle/trunk/lib/option.n?r=9467#205
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.