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

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

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

Сообщение Bonart » 24.10.2007 12:09:27

alexs писал(а):Я под макросом подразумевал inline-функцию

Тогда нужен исходный текст этой функции.
Или каждого нового типа надо писать новый экземпляр?
Bonart
новенький
 
Сообщения: 81
Зарегистрирован: 29.06.2007 11:47:40

Сообщение alexs » 24.10.2007 12:26:12

а какже иначе :-)
при обмене параметров ты должен проконтролировать приводимость типов.

Сразу на возражение о лишеней писанине отвечаю - я и не прадлагаю этот метод для разовых операций

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

Сообщение Bonart » 24.10.2007 12:41:14

alexs писал(а):а какже иначе

Фигня получается. Захотел поменять тип - заодно пиши новое определение SWAP. Опять почетный труд имени мартышки.
При том, что определение SWAP везде одно и то же :) Может пусть и будет тогда ОДНО? Но тогда указание конкретного типа аргументов уже вредно :)
Оказывается явное указание конкретного типа не всегда лучшее решение. И может сильно мешать рефакторингу.
Bonart
новенький
 
Сообщения: 81
Зарегистрирован: 29.06.2007 11:47:40

Сообщение alexs » 24.10.2007 12:47:06

нефиг - нефиг
используеш - будь добр опиши

понимаеш, когда ты создаёш и сопровождаеш проекты, жизненный цикл у которых более 1 месяца, от аналогичных твоим предложениям отказываешся сразу. Иначе эти проекты сопровождать невозможно. Чем больше ты делаеш всевозможных проверок и явных описаний - тем тебе же проще будет через некоторое время вспомнить - почему жто сделано имено так, и меньше вероятность ошибок.

А все предложения об отказе от предварительного описания, объявления типов и т.п. предназначены только для одного - побстрее склепать первоначальный код, не заботясь о его дальнейшем сопровождении.

Это всё равно что спорить о необходимости коментировать исходники.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Bonart » 24.10.2007 13:33:44

alexs писал(а):используеш - будь добр опиши

Ну-ну. Простейшую ПЕРЕСТАНОВКУ оказывается надо отдельно описывать для КАЖДОГО типа. Хотя на самом деле ее описание - три строчки на всех.
Вот и получается копипастерство. Из любви к догме ради догмы.

alexs писал(а):Чем больше ты делаеш всевозможных проверок и явных описаний - тем тебе же проще будет через некоторое время вспомнить - почему жто сделано имено так, и меньше вероятность ошибок.

Чем больше Я делаю проверок?
Это путь Perl, PHP и Питона - там все надо проверять программисту.
Путь Паскаля - как можно больше проверяет компилятор во время трансляции!
Как я могу ошибиться в типе t в моем приеме? Ответ - НИКАК. А вот ТЫ - запросто ;) И таких случаев - полным-полно.
Bonart
новенький
 
Сообщения: 81
Зарегистрирован: 29.06.2007 11:47:40

Сообщение alexs » 24.10.2007 14:33:01

Bonart писал(а):Простейшую ПЕРЕСТАНОВКУ оказывается надо отдельно описывать для КАЖДОГО типа

Не передёргивай - описывать надо описать процедуру SWAP
а потом просто вызов этой процедуры
кстати - по количесву писанины в итоге если у тебя перестановка вызывается более чем из одного места в итоге остаёшся в выйгрыше

Bonart писал(а):Как я могу ошибиться в типе t в моем приеме? Ответ - НИКАК. А вот ТЫ - запросто


Объясни - в чём может быть ошибка которую не отловит компилятор? И пожалуста - если считаеш что если есть возможность ошибки - давай развёрнутый пример.

Твой путь для перестановки - это тоже самое что предлагаю я - только уже развёрнутый вариант inline процедуры - теряется наглядность.

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

Сообщение Bonart » 24.10.2007 14:57:34

alexs писал(а):Объясни - в чём может быть ошибка которую не отловит компилятор?

Стоп. Ошибки типов при статической типизации компилятор отловит в любом случае.
Просто у меня в приведенном примере ошибки не будет вообще - тип у t такой же, как и у a! А ты можешь указать для t другой тип - и получить сообщение об ошибке.
alexs писал(а):Кстати, зная как программисты любят лбзывать временные переменные - есть вероятность следуюя твоейлогике (объявления переменной в коде) столкнуться с двойным использованием переменной с одним именем но с разным функционалом (типом).

Не получится. У меня область определения переменной ограничивается блоком, в котором она определена. Т.е. до begin и после end t не существует.
Например:
Код: Выделить всё
if a > b then begin
  t ::= a;
  a := b;
  b := t;
end;
write(t);

Здесь в последней строке будет ошибка! Если, конечно, t не определена где-то ранее.
Bonart
новенький
 
Сообщения: 81
Зарегистрирован: 29.06.2007 11:47:40

Сообщение alexs » 24.10.2007 15:12:44

Bonart писал(а): А ты можешь указать для t другой тип

Как? максимум что будет - эта таже ошибка на этапе компиляции - несоответсвие типов переменных и параметров процедуры.

И ещё, я даже оверлоадинг стараюсь не использовать - сразу пишу SwapInt, SwapStr - т.е. уже по имени процедуры видно что ты собираешся менять.
Я же выше говорил - самодокоментирование исходников это очень хорошо.

Bonart писал(а): Если, конечно, t не определена где-то ранее.

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

Сообщение Deepthroat » 25.10.2007 01:02:29

Bonart писал(а):Во-первых var - лишнее, т.к. явное указание типа уже признак определения, а не переприсваивания.

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

Лично я вообще за обязательность указания как типа, так и var, т.е. признака объявления.

Bonart писал(а):Во-вторых temp изменять никто не собирается, а значит это не переменная, а константа.

Константа на этапе компиляции заменяется на ее значение (не путать с передачей аргументов в подпрограммы!). В данном случае на этапе компиляции значение не известно, следовательно компилятор выдаст ошибку. Вообще, как это мы константу через переменную объявлять будем?

Bonart писал(а):В-третьих, при изменении типов a и b придется менять и тип t, что в данном случае явно лишняя работа.

Во-первых, эту "лишнюю" работу ты сделаешь один раз, а пожинать плоды будешь многократно при отладке.

Bonart писал(а):
Deepthroat писал(а):Т.е. для определения типа всех переменных, через которые описана a, надо определить тип всех переменных, через которые описаны все переменные, через которые описана a.

Ну и что? Компилятор с этим справится быстрее чем мы с набиванием пары символов.

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

И насчет SWAP. А Generic не помошник? Расширить его применение на функции и все ОК. Сама процедура описывается один раз. А дополнительно объявление заголовка с необходимым типом позволит избежать гемороя с отладкой и анализом исходников другими разработчиками.
Аватара пользователя
Deepthroat
постоялец
 
Сообщения: 144
Зарегистрирован: 06.09.2007 00:21:34
Откуда: Outer Heaven

Сообщение alexs » 25.10.2007 14:46:02

Deepthroat писал(а):И насчет SWAP. А Generic не помошник? Расширить его применение на функции и все ОК

Ну это уже особенности реализации, т.е. если будет реализованно в языке - хорошо, нет - работаем как и раньше.

Мне важнее принцип - что такие элементарные (а может и не элементарные) операции, которые не имеют непосредственного отношения к разрабатываемому алгоритму - лучше выносить в отдельные процедуры/функции.

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

Сообщение Bonart » 25.10.2007 16:22:37

Deepthroat писал(а):Так тип обязателен?

Если тип обязателен, то var - не надо.
Если необязателен, то var полезно.
alexs писал(а):отож, а если определена, и конструкция внутри блока посложнее?

А если определена - то t по отношению к блоку - глобальная переменная. В общем не вижу проблемы, локальные для подпрограммы переменные в Паскаль
вводили как раз за тем, чтобы не думать об одноименности. Я предлагаю переменные, локальные для блока - еще проще и полезнее.
Deepthroat писал(а):Константа на этапе компиляции заменяется на ее значение

Ошибка - "на этапе компиляции" здесь лишнее. Недостаток Паскаля - он требует вычисление констант при компиляции. Это приводит к большим трудностям, ибо все константы, вычисляемые при выполнении, приходится определять как переменные, т.е. работать с постоянным объектом как с изменчивым. В результате компилятор с одной стороны позволяет переприсваивание фактических констант, а с другой - сильно усложняется оптимизация, т.к. неизменчивые объекты компилятор вынужден находит явно.
Кстати, данная проблема осознается и частично решается - в FPC есть const-параметры, а в C++ const-определения.
alexs писал(а):И ещё, я даже оверлоадинг стараюсь не использовать - сразу пишу SwapInt, SwapStr - т.е. уже по имени процедуры видно что ты собираешся менять.

Ручной манглинг - плохое решение. За типами прежде всего должен следить компилятор. Алгоритм не должен зависеть от типа, если такая зависимость сама по себе не входит в его определение.
Deepthroat писал(а):Во-первых, эту "лишнюю" работу ты сделаешь один раз, а пожинать плоды будешь многократно при отладке.

А что не так при отладке? Там типы a b и t видны сразу и проблемы не представляют - типизация-то статическая!
Это тебе может понадобиться анализируя исходник узнать тип переменной.

Для чего я спокойно использую компилятор :)
Deepthroat писал(а):Ну и будешь искать долго и упорно, какой же тип имеет переменная.

Да-да, аж целую десятую долю секунды.
Bonart
новенький
 
Сообщения: 81
Зарегистрирован: 29.06.2007 11:47:40

Сообщение alexs » 25.10.2007 17:05:48

Bonart писал(а): Там типы a b и t видны сразу и проблемы

С чего ты взял что они видны - ты аобще предлагаеш убрать объявление типа, либо размазать его по исходнику. ГДЕ БУДЕТ ЛЕГКО ВИДНО?
в нынешней нотаци паскаля я по крайней мере знаю - надо посомотрит - что у меня за переменная - смотри в начало кода процедуры/функции - а если всё это будет размазано по тексту? где смотреть?
Bonart писал(а): Я предлагаю переменные, локальные для блока

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

Bonart писал(а):Да-да, аж целую десятую долю секунды.

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

Bonart писал(а):За типами прежде всего должен следить компилятор. Алгоритм не должен зависеть от типа, если такая зависимость сама по себе не входит в его определение

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

Сообщение Bonart » 25.10.2007 17:39:52

alexs писал(а):ты аобще предлагаеш убрать объявление типа

Только сделать необязательным. Т.е. ты сам можешь указывать тип при каждом определении и никакой ошибкой это не будет.
alexs писал(а):ГДЕ БУДЕТ ЛЕГКО ВИДНО?

В отладчике, в хорошей IDE, в сообщениях компилятора. Мало?
Это я только про случаи, когда тип не очевиден при первом взгляде на исходник.
alexs писал(а):При объявлении перемнной в начале блока кода сложнее - выше уже есть код - теряется наглядность.
в нынешней нотаци паскаля я по крайней мере знаю - надо посомотрит - что у меня за переменная - смотри в начало кода процедуры/функции - а если всё это будет размазано по тексту? где смотреть?

Наглядность ЧЕГО теряется?
Кода, использующую эту переменную выше (и вообще вне блока) нет.
Зато само определение максимально близко к использующему переменную коду - в одном блоке. А значит в большинстве случаев достаточно посмотреть в начало блока - это ближе чем начало подпрограммы.
alexs писал(а):Судя по твоим рассуждениям - ты не учитываеш возможность исследования кода, написанного тобой год назад, или вобше поддержания не твоего кода.

Как раз учитываю. Это ты не учитываешь, что помимо глаз для исследования пригодятся компилятор, отладчик, IDE и т.д.
alexs писал(а):Так-то оно так, но от лишней подсказки я не буду отказываться ради красивых теорий

Это не моя теория - это суровая практика, в частности в самом распространенных языках системного (и очень популярных в прикладном) программирования Си и Си++.
К тому же в моем варианте ты ни от чего не отказываешься - указывать тип можно. Более того, несложно можно сделать утилиту, которая по листингу компилятора сама расставит типы в исходниках.
Bonart
новенький
 
Сообщения: 81
Зарегистрирован: 29.06.2007 11:47:40

Сообщение alexs » 25.10.2007 18:11:06

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

Сообщение Deepthroat » 26.10.2007 00:12:45

Более того, несложно можно сделать утилиту, которая по листингу компилятора сама расставит типы в исходниках.

К вопросу о лишней работе :wink:

Рассмотрим такой пример:
Код: Выделить всё
//bla bla bla
var a := 0;
var x := 10;

//some program code
begin
  var y := 7.5;
  a := x + y;
end;

//a lot of code here
b: real := 789;
var y := round(b + a / 0.8);

//code, code, code
var z := (y + b) * 7;

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

Пред.След.

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

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

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

Рейтинг@Mail.ru