Logo

8 декабря 2014 г.

Этюд 5. Кантование параметров

Я уже пытался описать эту концепцию, но получилось немного запутанно, на мой взгляд. Пробую еще раз, уже в этюдах. За прошедшее время концепция была слегка пересмотрена и обрела название.
Синтаксически обусловленная перестановка параметров, допускающая использование свойств классов как в правой, так и в левой части оператора присваивания, теперь называется кантованием параметров. Выбранный термин образно отражает концепцию перестановки и созвучен названию языка.

На Delphi

Для этюда взят простой пример с индексируемым свойством, изменение которого требует перерисовки. Пример немного надуманный, но в нем есть и чтение, и запись индексированного свойства:
type
  TLabel = 0..2;

  TEquipmentLabels = class
  private
    FLabel: array[TLabel] of string;
    function GetLabel(Index: TLabel): string;
    procedure SetLabel(Index: TLabel; const Value: string);
  public
    procedure Redraw; virtual;
    property Labels[Index: TLabel]: string read GetLabel
      write SetLabel; // label -- ключевое слово в Delphi
  end;

function TEquipmentLabels.GetLabel(Index: TLabel): string;
begin
  Result := FLabel[Index];
end;

procedure TEquipmentLabels.SetLabel(Index: TLabel;
  const Value: string);
begin
  if FLabel[Index] <> Value then
  begin
    FLabel[Index] := Value;
    Redraw;
  end;
end;

procedure TEquipmentLabels.Redraw;
begin
  // do some drawings
end;

// использование
procedure UpdateLabels(Equipment: TEquipmentLabels);
begin
  if Equipment.Labels[0] = 'кран' then
  begin
    Equipment.Labels[1] = 'Открыт';
    Equipment.Labels[2] = 'Закрыт';
  end
  else if Equipment.Labels[0] = 'лампа' then
  begin
    Equipment.Labels[1] = 'Включена';
    Equipment.Labels[2] = 'Выключена';
  end;
end;
В Delphi и других языках, где свойства реализованы схожим образом, именование «геттеров» и «сеттеров» может быть предметом жарких дискуссий.

На Канторе

В Канторе нет понятия метода. У классов могут быть только свойства: in-свойства, out-свойства и var-свойства, согласно параметрам. Кантование параметров позволяет обращаться к свойствам естественным образом (аналогично Delphi) без дополнительных объявлений:
public final class Label = 0..2;

public class EquipmentLabels of
  var Core:String[Label] label;
  // либо var Core:String label[Label];
  // кантование применимо и здесь

  public final Label[Label index] = // out-свойство
    label[index];

  public final Label(Label index; // in-свойство
    Core:String value)
  of
    if value <> label[index] then
      label(index) = value;
      Redraw;
    end;
  end;

  public Redraw of // null-свойство = in-свойство
    // do some drawings
  end;
end;

// использование
updateLabels(EquipmentLabels equipment) of
  e = equipment.Labels[0]; // кантование out-свойства
  "on" partial equipment.Label(1);
  off partial equipment.Label(2);

  if e = 'кран' then
    "on" = 'Открыт'; // кантование in-свойства
    off = 'Закрыт';  // через частичное применение
  elsif e = 'лампа' then
    "on" = 'Включена';
    off = 'Выключена';
  end;
end;
Оператор partial без знака «равно» распространяет частичное применение одновременно на out- и на in-свойства. Это пока экспериментальный синтаксис.

Ключевое слово on пришлось заключить в кавычки, чтобы использовать его в качестве идентификатора.

Комментариев нет :

Отправить комментарий

Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.