Страница 3 из 4
Добавлено: 26.10.2007 07:51:15
Bonart
Deepthroat писал(а):Вопрос: где ошибка?
Первая - в строке
Складываешь целое и действительное. О чем компилятор тебе и сообщит, приведя номер строки и типы переменных.
Deepthroat писал(а)://a lot of code here
А вот за это (подпрограмма больше экрана) программиста принято бить. Причем ногами

Deepthroat писал(а):И как здесь компилятор мне поможет определить типы всех переменных?
Он сделает это за тебя - выведет автоматически.
Добавлено: 27.10.2007 00:46:39
Deepthroat
Складываешь целое и действительное.
Компилятору-то видно, а вот человеку совсем не очевидно, пока он не запустит компилятор.
А вот за это (подпрограмма больше экрана) программиста принято бить. Причем ногами
Согласен на все 100 процентов. Но обычно, когда приходится править чей-то код, возможности физического контакта с разработчиком нету...
И кстати, зачем такие мелкие процедуры? Компилятор же справится! А потомучто хороший стиль и читаемость кода. Вот для этого же и нужны типы в объявлении, а также слово "var" - для того, чтобы читаемость была, чтобы не ломать голову при определении типа
без компилятора.
Он сделает это за тебя - выведет автоматически.
Да с автоматикой все понятно. Никто не сомневается в способности компилятора все это скомпилировать. Дело в чтении кода программистом. Что если я на бумажке листинг изучаю? Сложновато будет типы определять.
Добавлено: 24.12.2007 17:59:10
Mastack1
А как вам такой вариант:
Код: Выделить всё
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 сейчас
Добавлено: 24.12.2007 22:16:51
alexs
Мне не нравится сам факт объявления типа в тексте кода. При кол-ве строк больше 3-4 найти объявление переменной становится проблемотичным - приходится перечитывать весь текст.
Объявление переменных должно быть в строго фиксированной области. А если встречается блок с независимыми переменными - то логично оформить его в виде отдельной процедуры.
Добавлено: 24.12.2007 23:32:49
Deepthroat
А как быть с телом цикла? Его тоже в виде отдельной процедуры оформлять? А в циклах довольно часто требуются временные переменные - начиная от счетчика, и заканчивая какой-то переменной для временного хранения чего-нибудь.
Добавлено: 25.12.2007 08:18:16
alexs
всё равно перед наччалом цикла произволдиш какие либо подготовительные работы - ты ведб не будеш инициализацию внутри делать?
Я это уже писал - при сопровождении кода на первое место выходит не скорость написания текста (для этого в конце концов всякие IDE и используем) и компактность кода - а удобство его чтения и понимания, приблежонность к человеческому языку и самодокументируемость.
А объявление переменных равномерно размазанных по процедурам этому никак не способствуют.
Добавлено: 25.12.2007 09:29:55
bw
alexs, с одной стороны я с тобой согласен, а с другой нет. Если переменная используется лишь на небольшом участке кода (соответственно её инициализиция производится в том же участке кода), то удобнее было бы видеть тип переменной (т.е. объявлять её) именно там где она используется. Дело не только том что, если мы объявляем переменную в "заголовке" метода, то время жизни этой переменной будет равно размеру всего метода. А еще и в том что интервалы использования этой переменной могут увеличиться. Т.е. определение в одном месте, а использование в другом. Нужно понимать что и время жизни и интервалы использования должны быть минимальными, это действительно влияет на читаемость.
Сейчас я стараюсь не делать большие методы, хотя возникает другая проблема, увеличивается количество методов

.
p.s. Кажется мы сильно отошли от темы.
..bw
Добавлено: 25.12.2007 17:15:50
alexs
bw - а для этого и придумали структурированное програмирование - ибо нефиг писать процедуры, которые трудно охватить одним взглядом
если текст процедуры не вмещается на один экран - его надо разделить на две (и более) процедуры.
Добавлено: 26.12.2007 01:52:34
Deepthroat
Хорошо, что удобнее читать, сопровоздать и проч., вот это:
Код: Выделить всё
...
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;
...
В первом случае, чтобы для каждого цикла сделать читаемые имена временных переменных, необходимо объявить столько наборов переменных, сколько у нас циклов. В результате, в секции объявления переменных сам черт ногу сломит.
Во втором случае, переменные объявляются там, где они нужны, так что секция объявления не загромождается временными переменными, счетчиками цикла и т.п.
Добавлено: 26.12.2007 08:37:01
alexs
Deepthroat
ты не внимательно читаеш мои посты - я НИКОГДА не пишу таких больших блоков кода
вынеси циклы в отдельные процдуры и объяви переменные как надо
Добавлено: 26.12.2007 12:20:05
Mastack1
Deepthroat
Я возможно оригинал, но мне проще читать именно первый вариант.
Всем
Кстати, я тут вспомнил, что в PL/SQL для Oracle переменные цикла вообще не объявляются. А ведь они там могут быть не только целыми. Как вам такой вариант? По мне, так самый удобный...
PS
маленькое дополнение к предыдущему посту:
Код: Выделить всё
procedure Swap(a, b:type(a)); // проверка типов при компиляции
begin
t:type(a) := a;
a := b;
b := t;
end;
можно в этом случае полностью отключать автоприведение типов, то есть вызов
Swap(integer, real);
не прокатит.
Добавлено: 26.12.2007 13:16:43
bw
Mastack1, для объявления переменной все нужно писать
var, так лучше читается, ИМХО.
А что если
Какой тип должен быть у
a и
b? Компилятору придется такое разруливать, да и лишний повод ошибиться самому программисту.
..bw
Добавлено: 26.12.2007 17:39:25
Mastack1
bw
э-э-э...
никакой. компилятор паскаля является однопроходным. поэтому такая запись является ошибкой. во фрагменте
никакого b ещё не существует.
А в первом комментарии имелось ввиду вот так
?
Добавлено: 26.12.2007 18:52:38
bw
Здесь речь идет не о существующем компиляторе Pascal.
Да, имелось ввиду именно то, что вы указали.
..bw
Добавлено: 26.12.2007 19:45:41
Mastack1
Ну, если рассуждать в таком направлении, то проще писать на СИ,
ИМХО
но это уже полный уход от темы...