Описание переменных вне директивы описания

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Re: Описание переменных вне директивы описания

Сообщение alexey38 » 23.04.2013 07:00:30

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

2. Если кому-то нравятся фишки от C++, C#, Java и т.п. - то пользуйтесь теми языками, никто Вам не мешает.

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

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

5. Объявление локальных переменных внутри зоны видимости некого структурного блока в некоторых случаях полезно, т.к. например, не дает использовать значение переменной после цикла, но и тот же С++ и прочие языки не зепрещают определеть переменные и в самом начале, т.е. гарантию никто не дает. А многостилие оно приводит к ошибкам. Кроме того, выход из зоны видимости не приводит к освобождению памяти под переменные, т.к. память выделена в стеке, хотя эта область памяти может использоваться дальше под другую переменную. Но такая экономия копеечна.

6. Для указателей на объекты или структуры памяти, выход ее из области видимости не приводит к освобождению памяти в C++ идругих языках без сборщика мусора. Основные проблемы в том же C++ возникают, когда на локальную переменную делаются указатели или указатель дублируется в несколько переменных с разной областью видимости.
Например:
Код: Выделить всё
char *bbb;
{
  char aaa[100];
  bbb=&aaa[5];
}
//теперь bbb указывает непонятно на что

Компилятор такие штуки пропускает, т.к. у локальных переменных нет счетчика ссылок, так что определение переменных внутри кода может и реально приводит к множеству багов у не очень опытных программеров.[/quote]
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Описание переменных вне директивы описания

Сообщение absdjfh » 23.04.2013 09:24:36

Независимо от того, плохо использование определение переменных внутри кода или нет, наличие возможности не обязывает ее использовать. Ведь до сих пор есть директива {$goto on}, хотя уже давно решено, что пользоваться этим вредно :)
Также и с этим случаем. Правда, такой подход мне напомнил идеологию языка си: разрешить самостоятельно выбирать программисту, даже если это позволит выбирать ему неправильно.
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

Re: Описание переменных вне директивы описания

Сообщение vada » 23.04.2013 11:25:35

dedm0zaj писал(а):а нафига делать такие длинные процедуры/функции?

А процедуры и функции не такие уж и длинные. Их просто много в одной зоне видимости. Может быть несколько десятков.
Если я все их вынесу, и начну передавать им мешки параметров, скорость выполнения программы может уменьшится в разы.
Лекс Айрин писал(а):угу.. скажите это хакерам, которые очень быстро такие ошибки находят

Обязательно скажу. :)
Вы, видимо, не в курсе что IDE для JAVA, C# компилируют код на лету. Они просто не дают мне допустить ошибку в описании местной переменной, если такая переменная уже описана в зоне видимости, или имеет другой тип.
Например, в методе может быть множество конструкций вот такого типа
Код: Выделить всё
for (int i=0; i<count; i++)
{
}
....
for (int i=0; i<length; i++)
{
}
....
for (int i=0; i<size; i++)
{
}

И в каждом цикле я объявляю переменную int i; Снова и снова. И ни каких ошибок не происходит. Что тут делать хакеру?
А вот за такую конструкцию:
Код: Выделить всё
int i;
for (i=0; i<count; i++)
{
}
...
for (i=0; i<size; i++)
{
}

Мне, скорее всего, по рукам надают. Как раз здесь зарыта потенциальная ошибка.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Описание переменных вне директивы описания

Сообщение alexey38 » 23.04.2013 15:54:31

vada писал(а):Вы, видимо, не в курсе что IDE для JAVA, C#

А чем Вас конкретно не устраивает JAVA и C#? Если нравятся, то и пишите на них. Собственно C# имеет целый ряд идей из Дельфи, т.к. делал его тот, кто делал Дельфи. C# это гибрид между JAVA и паскалем.

Некоторые люди любят чай, другие кофе, а третьи пьют чистую воду. Для чего делать помойную смесь всего со всем?

Паскаль, со своими строгими правилами определяет свой стиль программирования. Контроль использования неопределенных (не присовоенных) переменных работает на уровне Warning. Наличие предопределения всех переменных вначале упрощает как понимание, так и рефакторинг.

Кстати, хороший стиль программирования (для прочтения) не допускает применения переменной с именем "i" в качестве переменной цикла, т.к. конструкция типа "a[i,j]" вызывает много вопросов при чтении чужого кода, лучше "Table[Row,Col]".

Добавлено спустя 3 минуты 57 секунд:
vada писал(а):А процедуры и функции не такие уж и длинные. Их просто много в одной зоне видимости. Может быть несколько десятков.
Если я все их вынесу, и начну передавать им мешки параметров, скорость выполнения программы может уменьшится в разы.

Вы про вложенные процедуры? Иначе как может быть несколько процедур в пределах одной зоны видимости?

От этого лучше уходить, сильно ухудшают читабельность, насколько я помню, они появились до появления ООП, и это был праобраз ООП (не самый удачный). Но предопределение переменных вначале как раз делает вложенные процедуры возможными. Вместо вложенных процедур лучше использовать классы, или вообще несколько изменить алгоритм. Наличие подобных конструкций - это признак плохой структуры.
Последний раз редактировалось alexey38 23.04.2013 19:42:26, всего редактировалось 1 раз.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Описание переменных вне директивы описания

Сообщение Лекс Айрин » 23.04.2013 16:28:08

vada писал(а):Вы, видимо, не в курсе что IDE для JAVA, C# компилируют код на лету.


насчет C# не в курсе. А насчет вложенных циклов, то и Паскаль ругать будет. Как раз про подобные ошибки я и говорил.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Описание переменных вне директивы описания

Сообщение KUKA » 23.04.2013 22:25:47

SSerge писал(а):ide с умными закладками и другими фичами, "облегчающими" работу программиста, стимулируют к написанию кода, который потом будет трудночитаем на ide без умных закладок и других фич.как по мне, так код должен легко читаться даже в простом блокноте.

Ну вот я данном контексте я говорил про паскаль\делфи, в других яп, в которых работал, таких проблем нет.

SSerge писал(а):Вообще то вынос описания переменных в отдельную секцию был сделан исключительно для того, чтобы дать возможность компилятору паскаля работать в один проход. Из того же назначения - изначальное отсутствие макроопределений и область видимости переменных, всегда распространяющаяся на все тело процедуры.

Да к черту этот один проход, все равно оно все в байткод превращается. Да и ощутимой скорости этот "#1 проход" не дает, ибо не с чем сравнивать толком, даже на компиляцию сложных систем и пол минуты не уходит

alexey38 писал(а):6. Для указателей на объекты или структуры памяти, выход ее из области видимости не приводит к освобождению памяти в C++ идругих языках без сборщика мусора. Основные проблемы в том же C++ возникают, когда на локальную переменную делаются указатели или указатель дублируется в несколько переменных с разной областью видимости.

Опять же, в закрытых пакетах, естественно проблема со сборщиком мусора отчасти решена более менее. Но опять же никто не запрещает самому контролировать память. Вообще работать с памятью ручками накладно, может бажить, если где-то что-то упустить, и память начнет течь. т.е фактически если я хочу жестких оптимизаций, у меня не остается выбора, только как говнокодить, оборачивать совсем уж банальные участки кода в функции\процедуры, либо вручную управлять памятью
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Описание переменных вне директивы описания

Сообщение Сквозняк » 24.04.2013 02:07:32

KUKA писал(а):Да и ощутимой скорости этот "#1 проход" не дает, ибо не с чем сравнивать толком, даже на компиляцию сложных систем и пол минуты не уходит

С плюсами сравни, не зря плюсовики часто используют ssd для работы.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Описание переменных вне директивы описания

Сообщение KUKA » 24.04.2013 16:45:50

Сквозняк писал(а):
KUKA писал(а):Да и ощутимой скорости этот "#1 проход" не дает, ибо не с чем сравнивать толком, даже на компиляцию сложных систем и пол минуты не уходит

С плюсами сравни, не зря плюсовики часто используют ssd для работы.


Ну это известная проблема, но за все хорошее нужно платить. Некоторые штуки типа Boost'a достаточно один раз скомпилить что бы использовать
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Описание переменных вне директивы описания

Сообщение alexey38 » 24.04.2013 17:53:53

KUKA писал(а):Ну это известная проблема, но за все хорошее нужно платить. Некоторые штуки типа Boost'a достаточно один раз скомпилить что бы использовать

Но нужно вначале иметь несколько часов (в зависимости от машины), чтобы собрать все либы.

Добавлено спустя 4 минуты 35 секунд:
Скорость компиляции 10-15 лет назад было решающим преимуществом того же Дельфи, сегодня это уже не так существенно.
Но более важно то, что раз компилятор не смог в один проход и быстро скомпилить сишный код, то и человек не может в один проход и быстро прочитать сишную программу. Одно вытекает из другого. Поэтому при сопровождении чужого (наследованного) кода, паскаль имеет огромное преимущество.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Описание переменных вне директивы описания

Сообщение KUKA » 24.04.2013 19:09:04

alexey38 писал(а):Скорость компиляции 10-15 лет назад было решающим преимуществом того же Дельфи, сегодня это уже не так существенно.Но более важно то, что раз компилятор не смог в один проход и быстро скомпилить сишный код, то и человек не может в один проход и быстро прочитать сишную программу. Одно вытекает из другого. Поэтому при сопровождении чужого (наследованного) кода, паскаль имеет огромное преимущество.


От пары вложенных локальных переменных в цикле мозг не взорвется, не нужно преувеличивать). Паскаль просто не приспособлен к написанию кода, достойного перфекциониста.
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Описание переменных вне директивы описания

Сообщение absdjfh » 24.04.2013 19:40:21

alexey38 писал(а):Но более важно то, что раз компилятор не смог в один проход и быстро скомпилить сишный код, то и человек не может в один проход и быстро прочитать сишную программу. Одно вытекает из другого. Поэтому при сопровождении чужого (наследованного) кода, паскаль имеет огромное преимущество.

IMHO, сложнее читать плохо написанные программы на паскале, чем плохо написанные программы на си. Под плохо написанными в этом случае принимаю - неправильные имена переменных, вроде a, b: Integer, c: Char; tmp1, tmp2: string...
В случае паскаля я вижу список каких-то неясных переменных без предназначения. В случае кода си (т. е. кода, в котором переменные объявляются в середине текста - в данном случае имеет значение только эта особенность) переменная появляется в нужный момент и мы довольно точно понимаем ее смысл - если алгоритм, конечно, достаточно прозрачен. То есть предварительное описание переменных в паскале в таких случаях лишь сбивает с толку.
Если переменные названы понятно - границы стираются, но слишком уж часто я вижу код с, мягко говоря, странными названиями переменных, понять которые можно лишь наладив телепатическую связь с автором исходника.
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

Re: Описание переменных вне директивы описания

Сообщение alexey38 » 24.04.2013 21:26:28

absdjfh писал(а):IMHO, сложнее читать плохо написанные программы на паскале, чем плохо написанные программы на си. Под плохо написанными в этом случае принимаю - неправильные имена переменных, вроде a, b: Integer, c: Char; tmp1, tmp2: string...

Для таких случаев существует такой инструмент, ка рефакторинг.

Начиная с описания функции и до первого begin - это и есть цель рефакторига, в этом смысле паскалевское предопределение удобнее для понимания цели. А строгость паскалевского компилятора и скорость самой компиляции делает процесс такого вида рефакторинга чрезвычайно легким. В результате опытный программист за 5-15 минут в среднем разгадывает ребус с невнятных наименований переменных, имен функций и их параметров. Бывают случаи, что и на час или даже на сутки можно подвиснуть, но это очень редко. Обычно 15 минут достаточно.

Добавлено спустя 8 минут 47 секунд:
KUKA писал(а):От пары вложенных локальных переменных в цикле мозг не взорвется, не нужно преувеличивать).

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

Имея богатый опыт работы унаследованным кодом на разных языках и разных авторов, то бывают совершенно разные авторы. Несколько раз в совершенно разных организациях встречал код, когда на С/С++, например, в одной процедуре вначале определялось "int i", затем "char *i", и наконец "float i", а потом опять вроде бы как в первый раз, но немного по другому "int *i". Когда на каждой второй строке одно и то же имя переменной имеет порой противоположный смысл, то с мозгом нужно быть очень аккуратным, иначе взорвется.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Описание переменных вне директивы описания

Сообщение runewalsh » 24.04.2013 21:51:54

KUKA писал(а):Некоторые штуки типа Boost'a достаточно один раз скомпилить что бы использовать

Ах, если бы... Инстанцирование шаблонов при пересборке проекта, активно их использующих, занимает больше времени, чем всё остальное, и работает как раз благодаря многопроходности компилятора. В C++11 даже костыль для этого дела добавили — extern template.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Описание переменных вне директивы описания

Сообщение dedm0zaj » 25.04.2013 03:01:22

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

если переменная в паскале требует инициализации, то я это делаю непосредственно перед её использованием. т.е становится понятно, что вот сейчас в данный момент она начнёт использоваться.

например простой счётчик в цикле while
Код: Выделить всё
var
    i:integer;
begin
...
    i := 0;
    while (...) do begin
        i := i+1; //кстати, что работает быстрей: inc(i) или i:=i+1? по моим тестаи i:=i+1, хотя по идее должно inc(i);
        ...
    end;
...
end;


вообще я щитаю, что объявления и операции с объявленным, это две разные категории и не должны перемешиваться. по этой же причине я не поддерживаю инициализацию переменных в объявлениях, а делаю это в специально отведённом месте либо, как в случае выше, непосредственно перед использованием.
dedm0zaj
постоялец
 
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Re: Описание переменных вне директивы описания

Сообщение Сквозняк » 25.04.2013 03:23:16

KUKA писал(а):
Сквозняк писал(а):
KUKA писал(а): Ну это известная проблема, но за все хорошее нужно платить. Некоторые штуки типа Boost'a достаточно один раз скомпилить что бы использовать

И в результате Буст будет собран одним компилятором, другой фреймворк другим, проект третьим а динамически линкуемые библиотеки целым зоопарком.

Добавлено спустя 3 минуты 30 секунд:
KUKA писал(а):От пары вложенных локальных переменных в цикле мозг не взорвется, не нужно преувеличивать). Паскаль просто не приспособлен к написанию кода, достойного перфекциониста.

Паскаль не разрешает разбрасывать использованные носки по люстрам и кастрюлям а заставляет складывать в одну кучу - весь кайф обламывает.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Пред.След.

Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru