Оператор присваивания

Проектирование и разработка идеального средства программирования.

Модератор: Модераторы

Сообщение Bonart » 26.10.2007 07:51:15

Deepthroat писал(а):Вопрос: где ошибка?

Первая - в строке
Код: Выделить всё
a := x + y

Складываешь целое и действительное. О чем компилятор тебе и сообщит, приведя номер строки и типы переменных.
Deepthroat писал(а)://a lot of code here

А вот за это (подпрограмма больше экрана) программиста принято бить. Причем ногами :)
Deepthroat писал(а):И как здесь компилятор мне поможет определить типы всех переменных?

Он сделает это за тебя - выведет автоматически.
Bonart
новенький
 
Сообщения: 81
Зарегистрирован: 29.06.2007 11:47:40

Сообщение Deepthroat » 27.10.2007 00:46:39

Складываешь целое и действительное.

Компилятору-то видно, а вот человеку совсем не очевидно, пока он не запустит компилятор.

А вот за это (подпрограмма больше экрана) программиста принято бить. Причем ногами

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

И кстати, зачем такие мелкие процедуры? Компилятор же справится! А потомучто хороший стиль и читаемость кода. Вот для этого же и нужны типы в объявлении, а также слово "var" - для того, чтобы читаемость была, чтобы не ломать голову при определении типа без компилятора.

Он сделает это за тебя - выведет автоматически.

Да с автоматикой все понятно. Никто не сомневается в способности компилятора все это скомпилировать. Дело в чтении кода программистом. Что если я на бумажке листинг изучаю? Сложновато будет типы определять.
Аватара пользователя
Deepthroat
постоялец
 
Сообщения: 144
Зарегистрирован: 06.09.2007 00:21:34
Откуда: Outer Heaven

Сообщение Mastack1 » 24.12.2007 18:59:10

А как вам такой вариант:
Код: Выделить всё
procedure Swap(a, b); [inline;]
begin
  t:type(a) := a;
  a := b;
  b := t;
end;

По-моему, самый понятный, нет?

Если говорить об области видимости, то
Код: Выделить всё
некий код
begin
  t:type(a) := a;
  a := b;
  b := t;
end;
здесь t уже не видна

begin-end; с неограниченной вложённость в любом (почти) месте уже давно в Delphi есть.

Если не устраивает такая СИ-образная запись, то можно так:
Код: Выделить всё
некая процедура
var
  a:integer;
  b:real;
begin
  t:type(a) := a;
  что-то делаем с t-она integer
  b := t; // автопреобразование типов
  t:type(b) := b;
  что-то делаем с t-она real
  a := t; // ошибка при компиляции - несоответствие типов
end;

а экономия памяти достигается оптимизаций, так же как в Delphi сейчас
Mastack1
незнакомец
 
Сообщения: 5
Зарегистрирован: 24.12.2007 18:48:43
Откуда: Москва

Сообщение alexs » 24.12.2007 23:16:51

Мне не нравится сам факт объявления типа в тексте кода. При кол-ве строк больше 3-4 найти объявление переменной становится проблемотичным - приходится перечитывать весь текст.
Объявление переменных должно быть в строго фиксированной области. А если встречается блок с независимыми переменными - то логично оформить его в виде отдельной процедуры.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Deepthroat » 25.12.2007 00:32:49

А как быть с телом цикла? Его тоже в виде отдельной процедуры оформлять? А в циклах довольно часто требуются временные переменные - начиная от счетчика, и заканчивая какой-то переменной для временного хранения чего-нибудь.
Аватара пользователя
Deepthroat
постоялец
 
Сообщения: 144
Зарегистрирован: 06.09.2007 00:21:34
Откуда: Outer Heaven

Сообщение alexs » 25.12.2007 09:18:16

всё равно перед наччалом цикла произволдиш какие либо подготовительные работы - ты ведб не будеш инициализацию внутри делать? :D
Я это уже писал - при сопровождении кода на первое место выходит не скорость написания текста (для этого в конце концов всякие IDE и используем) и компактность кода - а удобство его чтения и понимания, приблежонность к человеческому языку и самодокументируемость.
А объявление переменных равномерно размазанных по процедурам этому никак не способствуют.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение bw » 25.12.2007 10:29:55

alexs, с одной стороны я с тобой согласен, а с другой нет. Если переменная используется лишь на небольшом участке кода (соответственно её инициализиция производится в том же участке кода), то удобнее было бы видеть тип переменной (т.е. объявлять её) именно там где она используется. Дело не только том что, если мы объявляем переменную в "заголовке" метода, то время жизни этой переменной будет равно размеру всего метода. А еще и в том что интервалы использования этой переменной могут увеличиться. Т.е. определение в одном месте, а использование в другом. Нужно понимать что и время жизни и интервалы использования должны быть минимальными, это действительно влияет на читаемость.
Сейчас я стараюсь не делать большие методы, хотя возникает другая проблема, увеличивается количество методов :-).

p.s. Кажется мы сильно отошли от темы.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Сообщение alexs » 25.12.2007 18:15:50

bw - а для этого и придумали структурированное програмирование - ибо нефиг писать процедуры, которые трудно охватить одним взглядом

если текст процедуры не вмещается на один экран - его надо разделить на две (и более) процедуры.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Deepthroat » 26.12.2007 02:52:34

Хорошо, что удобнее читать, сопровоздать и проч., вот это:

Код: Выделить всё
...
var
  i, j, k: integer;
  tmp1: string;
  tmp2: char;
  ...
begin
...
  for i := 1 to 10 do
  begin
    for j := 1 to 10 do
    begin
      for k := 1 to 10 do
      begin
        tmp1 := arr[i, j, k] + func1('some_arg');
        tmp2 := func2(tmp1);
        func3(tmp1 + tmp2);
      end;
    end;
  end;
...
  for i := 4 to 8 do
  begin
    for j := 2 to 5 do
    begin
      for k := 8 to 15 do
      begin
        tmp1 := func5(arr[i, j], 'some_other_arg');
        tmp2 := tmp1 + func6(k, tmp1);
        func7(tmp1 + tmp2, j, k);
      end;
    end;
  end;
...


или вот это:

Код: Выделить всё
...
  for var i: integer := 1 to 10 do
  begin
    for var j: integer := 1 to 10 do
    begin
      for var k: integer := 1 to 10 do
      begin
        var readable_name_1: string := arr[i, j, k] + func1('some_arg');
        var readable_name_2: char := func2(readable_name_1);
        func3(readable_name_1 + readable_name_2);
      end;
    end;
  end;
...
  for var i: integer := 4 to 8 do
  begin
    for var j: integer := 2 to 5 do
    begin
      for var k: integer := 8 to 15 do
      begin
        var readable_name_1: string := func5(arr[i, j], 'some_other_arg');
        var readable_name_2: char := readable_name_1 + func6(k, readable_name_1);
        func7(readable_name_1 + readable_name_2, j, k);
      end;
    end;
  end;
...

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

Во втором случае, переменные объявляются там, где они нужны, так что секция объявления не загромождается временными переменными, счетчиками цикла и т.п.
Аватара пользователя
Deepthroat
постоялец
 
Сообщения: 144
Зарегистрирован: 06.09.2007 00:21:34
Откуда: Outer Heaven

Сообщение alexs » 26.12.2007 09:37:01

Deepthroat
ты не внимательно читаеш мои посты - я НИКОГДА не пишу таких больших блоков кода
вынеси циклы в отдельные процдуры и объяви переменные как надо
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Mastack1 » 26.12.2007 13:20:05

Deepthroat
Я возможно оригинал, но мне проще читать именно первый вариант.

Всем
Кстати, я тут вспомнил, что в PL/SQL для Oracle переменные цикла вообще не объявляются. А ведь они там могут быть не только целыми. Как вам такой вариант? По мне, так самый удобный...

PS
маленькое дополнение к предыдущему посту:
Код: Выделить всё
procedure Swap(a, b:type(a)); // проверка типов при компиляции
begin
  t:type(a) := a;
  a := b;
  b := t;
end;

можно в этом случае полностью отключать автоприведение типов, то есть вызов
Swap(integer, real);
не прокатит.
Mastack1
незнакомец
 
Сообщения: 5
Зарегистрирован: 24.12.2007 18:48:43
Откуда: Москва

Сообщение bw » 26.12.2007 14:16:43

Mastack1, для объявления переменной все нужно писать var, так лучше читается, ИМХО.
А что если :-)
Код: Выделить всё
procedure Foo(a: type(b); b: type(a));

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

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Сообщение Mastack1 » 26.12.2007 18:39:25

bw
э-э-э...
никакой. компилятор паскаля является однопроходным. поэтому такая запись является ошибкой. во фрагменте
Код: Выделить всё
a: type(b)
никакого b ещё не существует.
А в первом комментарии имелось ввиду вот так
Код: Выделить всё
var t:type(a) := a;
?
Mastack1
незнакомец
 
Сообщения: 5
Зарегистрирован: 24.12.2007 18:48:43
Откуда: Москва

Сообщение bw » 26.12.2007 19:52:38

Здесь речь идет не о существующем компиляторе Pascal.
Да, имелось ввиду именно то, что вы указали.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Сообщение Mastack1 » 26.12.2007 20:45:41

Ну, если рассуждать в таком направлении, то проще писать на СИ,
ИМХО
но это уже полный уход от темы...
Mastack1
незнакомец
 
Сообщения: 5
Зарегистрирован: 24.12.2007 18:48:43
Откуда: Москва

Пред.След.

Вернуться в Компилятор / язык программирования

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru