Текущее время: Вс, авг 03 2025, 22:55

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 14:01 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Вт, июн 05 2007, 05:16
Сообщения: 13
Откуда: Пермь
До поры до времени полагал, что в ABAP чтит кодекс области видимости переменных, постепенно понял, что избирательно... только в пределах подпрограмм.

Например.
Цитата:
do 5 times.
data d type i value 0.
d = d + 1.
write:/ d.
enddo.
Соответствующая интерпретация на любом С++-подобном языке выдаст в консоль пять раз 1, в то время как ABAP числа от 1 до 5. То есть по факту в Сишном понимании, ABAP компилирует этот код в нечто подобное:
Цитата:
data d type i value 0.
do 5 times.
d = d + 1.
write:/ d.
enddo.
OK, делаем вывод: ABAP в пределах подпрограммы работает с переменными аналогично Pascal - все переменные глобально видимы.

Но остается без ответа вопрос: а на кой тогда давать возможность объявления переменной в любом месте подпрограммы (Pascal же не зря не дает такой возможности), если это не играет рояли? :-)


Последний раз редактировалось rsn81 Пн, июл 09 2007, 18:07, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 14:14 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
rsn81 написал(а):
До поры до времени полагал, что в ABAP чтит кодекс области видимости переменных, постепенно понял, что избирательно... только в пределах подпрограмм.


В хелпе четко прописано о области видимости. К операторам это не относится.

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

В языке С переменные описываются в начале программы. Иначе компилятор выдаст ошибку.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июл 09 2007, 14:15 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Про соответствие ABAP общепринятым стандартам лучше умолчать :)
Думаю, при авторы компилятора ABAP были вообще не особо в курсе существования теорий синтаксического разбора да и вообще других языков...

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 15:20 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
rsn81 написал(а):
До поры до времени полагал, что в ABAP чтит кодекс области видимости переменных, постепенно понял, что избирательно... только в пределах подпрограмм.
Что значит избирательно в данном контексте? Область видимости и действия переменных вполне себе документирована, какой ещё нужен "кодес"? Тем более что "кодекс - это не закон ..." (с) Пираты ...
rsn81 написал(а):
...OK, делаем вывод: ABAP в пределах подпрограммы работает с переменными аналогично Pascal - все переменные глобально видимы.

Разве в паскале уже отменили блок BEGIN END; который образует собственную облась видимости для объявленых в нём переменных? Или я что-то с чем-то путаю???
rsn81 написал(а):

Но остается без ответа вопрос: а на кой тогда давать возможность объявления переменной в любом месте подпрограммы (Pascal же не зря не дает такой возможности), если это не играет рояли? :-)

Не играет?
Попробуйте зыпустить репорт с такой конструкцией
Code:
  DO 5 TIMES.
    d = d + 1.
    DATA d TYPE i VALUE 0.
    WRITE:/ d.
  ENDDO.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 16:21 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
sy-uname написал(а):
Разве в паскале уже отменили блок BEGIN END; который образует собственную облась видимости для объявленых в нём переменных? Или я что-то с чем-то путаю???

путаете :) разве что в Дельфи такая возможность со временем появилась, и то сомнительно

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 16:26 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Вт, июн 05 2007, 05:16
Сообщения: 13
Откуда: Пермь
Сергей Королев написал:
Про соответствие ABAP общепринятым стандартам лучше умолчать :)
Думаю, при авторы компилятора ABAP были вообще не особо в курсе существования теорий синтаксического разбора да и вообще других языков...
Ага. :-)
Мне еще нравится заплатка ООП на ABAP: после copy-paste обычного 100% исполняемого ABAP-интерпретатором кода из подпрограммы в метод класса начинается ругань а-ля "данный оператор недоступен в ОО-контексте". Даже и лекарство для заплатки нашлось: оформляешь строчку нелюбимого объектами в исполнении ABAP кода в подпрограммку и ставишь вызов из метода объекта - все, ABAP жестоко обманут и уже не ругается.
sy-uname написал(а):
Разве в паскале уже отменили блок BEGIN END; который образует собственную облась видимости для объявленых в нём переменных? Или я что-то с чем-то путаю???
Не знаю, что с чем вы путаете. Выше собственно и было сказано, что область видимости переменных ABAP аналогична Pascal. Одно только непонятно, на кой-то ляд сделано допущение: объявление переменной в любом месте программы. Наверно самое разумное объяснение, как и заметили выше, улучшение читаемости кода. Гм... только что-то в эффективность этого вериться с трудом.
sy-uname написал(а):
Не играет?
Попробуйте зыпустить репорт с такой конструкцией
Это, вообще говоря, чести ABAP не добавляет, даже наоборот. :-)
Собственно к области видимости это отношения не имеет, а говорит только о том, что интерпретатор проходит по программе за один ход.


Последний раз редактировалось rsn81 Пн, июл 09 2007, 16:35, всего редактировалось 2 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июл 09 2007, 16:27 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Не нужно сомневаться ;)
Есть и давным-давно была в Delphi возможность объявлять локальные переменные в процедурах и функциях.
А вот такая конструкция:
Code:
  DO 5 TIMES.
    d = d + 1.
    DATA d TYPE i VALUE 0.
    WRITE:/ d.
  ENDDO.

в дельфях не пройдет.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 17:16 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
rsn81 написал(а):
Мне еще нравится заплатка ООП на ABAP: после copy-paste обычного 100% исполняемого ABAP-интерпретатором кода из подпрограммы в метод класса начинается ругань а-ля "данный оператор недоступен в ОО-контексте". Даже и лекарство для заплатки нашлось: оформляешь строчку нелюбимого объектами в исполнении ABAP кода в подпрограммку и ставишь вызов из метода объекта - все, ABAP жестоко обманут и уже не ругается.

Почему обманут - выполнение программы вышло из области действия ООП и выполняется в классическом окружении - так в чём тут обман?

Цитата:
... Одно только непонятно, на кой-то ляд сделано допущение: объявление переменной в любом месте программы. Наверно самое разумное объяснение, как и заметили выше, улучшение читаемости кода. Гм... только что-то в эффективность этого вериться с трудом.
Да-да, только вот с С++ возможность объявлять переменные там где нужно а не в начале блока преподносилось как громадное достижение в сравнении с классическим С.
Цитата:
Это, вообще говоря, чести ABAP не добавляет, даже наоборот. :-)
Собственно к области видимости это отношения не имеет, а говорит только о том, что интерпретатор проходит по программе за один ход.
C++ то-же видать однопроходный, раз требуется объявлять переменные до первого использования.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 17:40 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Вт, июн 05 2007, 05:16
Сообщения: 13
Откуда: Пермь
sy-uname написал(а):
Почему обманут - выполнение программы вышло из области действия ООП и выполняется в классическом окружении - так в чём тут обман?
Потому что замена такого кода:
Цитата:
class SomeObject implementation.
method someMethod.
<someAction>. "здесь при компиляции упомянутая ошибка
endmethod.
endclass.
на такой:
Цитата:
class SomeObject implementation.
method someMethod.
perform someForm.
endmethod.
endclass.

form someForm.
<someAction>. "а так все OK
endform.
абсолютно ничего не меняет с точки зрения логики, но почему-то помогает съесть ABAP-у желаемую логику кода в ООП-исполнении. Завтра с работы смогу показать такие примеры, если, конечно, интересно.
sy-uname написал(а):
Да-да, только вот с С++ возможность объявлять переменные там где нужно а не в начале блока преподносилось как громадное достижение в сравнении с классическим С.
Честно говоря, не понял, о чем вы.
sy-uname написал(а):
C++ то-же видать однопроходный, раз требуется объявлять переменные до первого использования.
Во-первых, C++ - компилятор, а ABAP, если не ошибаюсь, интерпретатор. Во-вторых, не понимаю, что вы хотите доказать.

Начали с того, что порядок инициализации переменных в коде программы обычно играет роль в ЯП, кроме а-ля Pascal, где достаточно логичный синтаксис прединициализации переменных. Нашли, что в ABAP порядок инициализации переменных роли не играет. Вы указали на то, что с ABAP-ом все еще плачевнее: как только интепретатор добирается до объявления переменной он делает ее в глобально-видимой (в пределах подпрограммы), казалось бы, остался один шаг до Pascal - сделай интерпретатор первый проход по коду подпрограммы для сбора всех объявлений переменных, а только после этого проход для выполнения кода - и приведенный вами пример исполнится. Так нет же... :-)


Последний раз редактировалось rsn81 Пн, июл 09 2007, 20:23, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 17:55 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
rsn81 написал(а):
Потому что замена такого кода:
... на такой: ... абсолютно ничего не меняет с точки зрения логики, но почему-то помогает съесть ABAP-у желаемую логику кода в ООП-исполнении. ...
Потому что в целях совместимости и сохранения работоспособности старых программ в новых реализациях ABAP более жёсткие требования к описаниям и манипуляциям с типами|данными распространяются (_пока_) только на новую функциональность.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 19:25 
Специалист
Специалист

Зарегистрирован:
Пт, июл 22 2005, 08:56
Сообщения: 158
sy-uname написал(а):
rsn81 написал(а):
Потому что замена такого кода:
... на такой: ... абсолютно ничего не меняет с точки зрения логики, но почему-то помогает съесть ABAP-у желаемую логику кода в ООП-исполнении. ...
Потому что в целях совместимости и сохранения работоспособности старых программ в новых реализациях ABAP более жёсткие требования к описаниям и манипуляциям с типами|данными распространяются (_пока_) только на новую функциональность.

кстати, еще одна недопустимость использования в ОО контексте - нельзя создавать внутренние таблицы с header line... Никто не знает, почему?

_________________
C SAP
Изображение


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 19:45 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
rsn81 написал(а):
...
Начали с того, что порядок инициализации переменных в коде программы обычно играет роль в ЯП, кроме а-ля Pascal, где достаточно логичный синтаксис прединициализации переменных. Нашли, что в ABAP порядок инициализации переменных роли не играет. Вы указали на то, что с ABAP-ом все еще плачевнее: как только интепретатор добирается до объявления переменной он делает ее в глобально-видимой (в пределах подпрограммы), казалось бы, остался один шаг до Pascal - сделай интерпретатор первый проход по коду подпрограммы для сбора всех объявлений переменных, а только после этого проход для выполнения кода - и приведенный sy-uname-ом пример исполнился. Так нет же... :-)

Замечу что компилятор всё-таки контролирует соответствие количества передаваемых параметров и их типы на момент компиляции - так что однозначно утверждать о тольео одном проходе я-бы не стал.

По поаоду деклараций пересенных:

Code:
class Hello2  { 
   public static void main ( String args[] ) { 
      int i = 3;
      System.out.println ( i );
   }
}

Цитата:
>javac Hello2.java

>java Hello2
3

Code:
class Hello2  { 
   public static void main ( String args[] ) { 
      System.out.println ( i );
      int i = 3;
   }
}

Цитата:
>javac Hello2.java
Hello2.java:3: cannot resolve symbol
symbol : variable i
location: class Hello2
System.out.println ( i );
^
1 error

Вроде Java не самый из "неправильных" языков

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 19:56 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Вт, июн 05 2007, 05:16
Сообщения: 13
Откуда: Пермь
часть написал(а):
кстати, еще одна недопустимость использования в ОО контексте - нельзя создавать внутренние таблицы с header line... Никто не знает, почему?
Именно. :-)
Тоже пришлось найти обходной маневр.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 20:07 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
часть написал(а):
кстати, еще одна недопустимость использования в ОО контексте - нельзя создавать внутренние таблицы с header line... Никто не знает, почему?

Потому что под одним именем скрыты два разных объекта - структура и таблица, что пораждает потециально небезопасный код - классический случай когда передают таблицу вместо структуры или наоборот. Или, что ещё хуже используют следующий изврат:
Code:
form _form tables itab.
    itab-field1 = some_value1.
    itab-field2 = some_value2.
endform.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Область видимости переменных
СообщениеДобавлено: Пн, июл 09 2007, 20:15 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Вт, июн 05 2007, 05:16
Сообщения: 13
Откуда: Пермь
sy-uname написал(а):
Замечу что компилятор всё-таки контролирует соответствие количества передаваемых параметров и их типы на момент компиляции - так что однозначно утверждать о тольео одном проходе я-бы не стал.
Как раз эти ограничения можно проверить и за один проход. Но вообще я только предположил, так глубоко не знаю.
sy-uname написал(а):
Вроде Java не самый из "неправильных" языков
А то! Java, английский и русский - вот мои языки. :-)
Не надо бередить мою рану... спор с администратором, который против развертывания Java в рамках новой версии ERP в конце года - вот и приходится мучаться пока с этим калекой ABAP-ом.

Речь просто не о том шла: разумеется, объявление переменной должно идти до ее использования (я просто решил пойти в шутке дальше: если у ABAP действительно глобальная видимость, то в принципе ничего не мешало бы ему и скушать приведенный вами пример - разницы-то 100% никакой!), мы же говорили о другом - о глобальной видимости в ABAP. В Java-то как раз есть понятие области видимости переменной... о чем и начинал говорить в первом сообщении. Самый наипростейший пример:
Цитата:
{
int i = 0;
}
i = 5; // compile error: i cannot be resolved
И все следствия из него, опять же пример, приведенный в первом сообщении на Java:
Цитата:
for (int k = 0; k < 5; k++) {
int i = 0;
System.out.println(++i);
}
выведет пять единиц в отличие от ABAP-а.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB