Nemerle Enhancement Proposal 1
От: _nn_ www.nemerleweb.com
Дата: 16.11.10 10:30
Оценка:
Nemerle Enhancement Proposal 1

Проблема:
В C# и в Nemerle мы имеем возможность определить свойства похожим образом включая автосвойства.
Но ни в C# ни в Nemerle нет возможности задать в автосвойстве только getter. (или только setter, кому оно надо не знаю )

Для этой цели в C# надо писать поле и свойство, а в Nemerle можно сократить работу за счет макроатрибута:
_i : int;
I : int { get { _i } };

mutable _j : int;
J : int { get { _j } set { _j = value } };

mutable _k : int;
K : int { set { _k = value } };


[Accessor]
_i : int;

[Accessor(WantSetter = true)]
_j : int;


Accessor неинтуитивен для программистов C#.

Предложение:
Вместо этого предлагаю обратный Accessor-у стиль.
Описываем свойство, а поле генерируется по имени свойства:

I : int { get };
// _i : int;
// I : int { get { _i } };

[MutableField] I : int { get };
// mutable _i : int;
// I : int { get { _i } };

J : int { get; set; };
// mutable _j : int;
// J : int { get { _j } set { _j = value } };

K : int { set };
// mutable _k : int;
// K : int { set { _k = value } };


Не нужен сложный атрибут Accessor, код более понятен.
Также это не ломает старый код, а лишь дополняет функционал.
Если имя уже занято, ошибка компиляции.

Приложение:
Таким образом можно и улучшить variant.
Вместо задавания полей, можно задавать свойства с генерируемыми полями:

Старый вариант:
variant A
{
  | X
    {
      i : int; j : int; // Определение полей
      public new this(i : int, j : int)
      {
        this.i = i;
        this.j = j;
      }
    }
  | Y
    {
      K : int; L : int; // Определение полей
      public new this(k : int, l : int)
      {
        this.K = k;
        this.L = l;
      }
    }
}

def x = A.X(1, 2);
def i = x.i;
def j = x.j;

def y = A.Y(1, 2);
def k = y.K;
def l = y.L;


Новый вариант:
variant A
{
  | X
    {
      // Создаются поля _i, _j
      i : int; j : int; // Определение свойств
      public new this(i : int, j : int)
      {
        this._i = i;
        this._j = j;
      }
    }
  | Y
    {
      // Создаются поля _k, _l
      K : int; L : int; // Определение свойств
      public new this(k : int, l : int)
      {
        this._k = k;
        this._l = l;
      }
    }
}

def x = A.X(1, 2);
def i = x.i;
def j = x.j;

def y = A.Y(1, 2);
def k = y.K;
def l = y.L;


Заключение:
Предложенный способ позволит улучшить код и привлечь больше программистов C#.
Изменение variant улучшает взаимодействие с C#.

Высказываемся
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.