Замечания и предложения

Дополнил.

Непонятно, для чего в PascalABC.NЕТ делать внутриблочные константы. Опять из любви к искусству? Если программа сложная, она модульная и константы локализованы в модуле. Если страшно, что какая-то процедура или функция испортит параметр - объявите его параметром const.

В таком случае, внутриблочные переменные тоже не имеют смысла.

При таком подходе можно было просто сделать компилятор TurboPascal для .NET и не заморачиваться.

Как раз потому, что он .NET. Современный язык, не имеющий жёсткого деления программы на блоки. Описание констант в одном конкретном месте - ни что иное, как пережитки прошлого, которое язык не поворачивается назвать удачным.

Повторю ещё раз все преимущества и недостатки внутриблочных констант, на этот раз - с примерами кода.

Преимущества:

  1. Нет необходимости выносить константы в промежуток между объявлением метода и его реализацией(по - старому - блок описания констант):
//TurboPascal
Procedure MyVoid();
Const pi: single = 3.1415;
n: integer = 300;
k: real = 0.5;
Begin
  writeln(pi);
  writeln(n);
  writeln(k);
End;
//PascalABC.NET
Public Procedure MyVoid();
Begin
  Const pi: Single = 3.1415;
  Console.WriteLine(pi);
  Const n: Int32 = 300;
  Console.WriteLine(n);
  Const k: Double = 0.5;
  Console.WriteLine(k);
End;
  1. Локальное действие констант:
//TurboPascal
Const pi = 3.1415;
Const RPi = 3;
Begin
  writeln('Pi = ', pi);
  writeln('RPi = ', RPi);
End.
//PascalABC.NET
Begin
  Begin
    Const pi = 3.1415;
    Console.WriteLine(pi);
  End;
  Begin
    Const pi = 3;
    Console.WriteLine(pi);
  End;
End;

Недостатки: Новая конструкция, которой нет в старых версиях Паскаля.

Подумайте о соотношении количества констант и переменных. Кроме того, в разных блоках одна и та же переменная может обозначать разное, а именованная типизированная константа - она всегда должна обозначать одно и то же. Смысл ее прятать?

Даже если меня среди ночи разбудить, я скажу, что в PascalABC.NET константа pi предопределена.

И что этот безумный код демонстрирует? Чем он лучше

var (n,k) := (300, 0.5);

И да, я назвал его “безумным”, потому что напоминает код сишного наркомана, бьющегося в “ломке” - все эти, абсолютно ненужные в Паскале пустые скобки, Console.Writeline, Int32, Double.

Так сделано в C++ и C#. Наверняка, не просто так. Констант тоже может быть много.

Приведите хотя бы один РАЗУМНЫЙ пример, где констант с одним именем много.

“Я шел по улице, там Вася и Петя стучали головами об стену. Наверно и мне нужно, ведь они наверняка не просто так.”

P.S. Когда уж вы все запомните, что “так сделано там-то” - не довод.?

А по моему важно то, что в ООП принято объявлять переменные как можно позже, прямо перед их использованием. И стараться делать так, чтоб они выходили из зоны видимости как только стали не нужны. И так же с переменными которые нельзя изменить, то есть константами. Это помогает программисту не думать о лишнем.

2 лайка

А зачем обязательно с одинаковыми именами?

А зачем тогда PatternMatching сделали? Он ведь из другого языка. Да и не только он. Сергей, в принципе, объяснил даже лучше меня.

Еще как довод. Тем более, если этим успешно пользуются в других языках (это в общем, а не конкретно к данному случаю).

@Gleb, я бы сделал так:

begin
  const x = 0;
end.

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

1 лайк

Константы объявляют в начале, чтобы потом не шарахаться везде в поисках. К примеру, объявили константу Vz в каком-то модуле - скорость звука. Через два месяца выяснилось, что взяли скорость звука в воздухе, а надо было в воде. И что, вспоминать в каком модуле использована? Вот поэтому константы выносят “наверх”, чтобы в глаза бросались. В разных модулях оправдывает разное наименование тогда, когда в каждом свое значение, но тогда это не константа а так, баловство и выпендрёж.

Сочли полезным - и сделали. А вовсе не потому, что оно “где-то есть, потому и нам надо”. Разницу улавливаете?

Пользуются потому что это просто есть или пользуются, потому что это реально что-то дает или потому, что иначе нельзя/неудобно в этом языке?

Можно и так.

Это важно для экономии памяти. Например, в Вашем примере тип x будет Int32 (4 байта), а если явно указать тип Byte - то один.

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

1 лайк

Это как раз очень сомнительно и выше я написал почему.

Верно, но зачем решать за всех, будет ли оно нужно? У Вас один стиль программирования, а у кого-то другой.

1 лайк

Не понял Вас.

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

Что-то мне кажется, что сейчас будет неконструктивная беседа. Давайте оперировать только аргументами. Без обсуждений какой у кого стиль программирования. Наша задача - аргументировать почему мы так считаем, а задача разработчиков решить что в итоге делать с нашими предложениями. :slight_smile:

1 лайк

Ну так я и не даю ему оценку)

Ну, я так, на всякий случай. :wink: