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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Форматирование исходного текста
СообщениеДобавлено: Вс, ноя 04 2007, 13:53 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Коллеги,
кто как/чем форматирует исходники в ABAP (преобразование ключевых слов к верхнему регистру, выравнивание по вложенности)?


Последний раз редактировалось vga Вс, ноя 04 2007, 18:26, всего редактировалось 1 раз.

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

Зарегистрирован:
Пн, окт 11 2004, 13:16
Сообщения: 1790
vga написал(а):
Коллеги,
кто как/чем форматирует исходники в ABAP (преобразование ключевых слов к верхнему регистру, выравнивание по вложенности)?

Встроенный редактор, особенно новая версия, вполне достойно справляется с этим.

_________________
/nex


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

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Встроенный Pretty Printer, конечно, хорош, за одним исключением: преобразуя ключевые слова к верхнему регистру, он всё остальное приводит к нижнему, в то время весь цивилизованный мир пишет myVeryLongVariable. Альтернатив не знаю.

Паттерны для вызовов функциональных модулей формирую на perl'е, декларируя при этом переменные нужных типов.

Рефакторинг и сложную обработку ABAP-кода делаю в WinEdt, поскольку там есть regexp'ы в Find&Replace.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс, ноя 04 2007, 17:41 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
sibrin написал:
Встроенный Pretty Printer, конечно, хорош, за одним исключением: преобразуя ключевые слова к верхнему регистру, он всё остальное приводит к нижнему, в то время весь цивилизованный мир пишет myVeryLongVariable. ....

Правильней было-бы сказать что во всём мире (мире Javа и C++) переменные не преобразуются (как впрочем и ключевые слова) - поскольку здесь важен регистр, в отличии от ABAP.

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


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
IMHO, преобразование к нижнему регистру - это в самом деле проблема, для тех, кто использует длинные написания
myVeryLongVariable

поскольку
myverylongvariable
воспринимается тяжело

альтернатива так
my_very_long_variable

Достаточно долго писав на С и плюсах, только после сообщения sibrin задумался, почему в абапе перестал использовать длинные имена и, собственно, это не стало проблемой. А вывод достаточно интересный ;-) Круг разработок узок, и короткие абревиатуры l_bukrs, l_lifnt, g_gjahr фактически самодостаточны. Это как китайские иероглифы.
Ну максимун надо добавить один признак после переменной
например l_lifnt_old, g_gjahr_old
К тому же название структур и таблиц тоже достаточно информативны для понимания кода.
Исключения, разве что, объявленные глобально переменные и названия подпрограмм.
Все ИМХО.


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

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
vga написал(а):
альтернатива так
my_very_long_variable


Альтернативу не всегда можно использовать, поскольку есть уже if_componentcontroller, а также автоматически генерится onactioncustom_event. В общем, ничто не стоит так дёшево, и не ценится так дорого, как вежливость. И удобство восприятия кода тоже.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс, ноя 04 2007, 19:51 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
vga написал(а):
...
Достаточно долго писав на С и плюсах, только после сообщения sibrin задумался, почему в абапе перестал использовать длинные имена и, собственно, это не стало проблемой. ...

Почему перестали? Использование длинных имён только ещё предстоит (если конечно планируется какоето развитие ABAP). А так ведь при ограничении 30 символов на имя при общей длине строки 72 (до версии 4.6 если не ошибаюсь) не очень ведь и разгуляешся с сохранением читабельности текстов.

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


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Длинные имена тоже не всегда панацея. Вот например, исходники коллеги с прошлой работы. Сколько мы с ним спорили, что нафиг так писать, мало того что на экран монитора не влезает, так еще и в глазах ребит. Смысл теряет абсолютно и разбираться в этом было одно мучение.
В АБАП-е зато все видно.

Code:
#ifdef _DEBUG
void ASRSPELLING::SpellDecoder::printStatesInfo( FILE * _fptr )
{
   if ( NULL == _fptr ) { return; }   
   unsigned short tmp_hmmIndex = 0;
   for ( ; tmp_hmmIndex < m_hmmsArrayDimension; tmp_hmmIndex++ )
   {      
      HmmPTR tmp_hmm = m_hmmsArray + tmp_hmmIndex;
      StatePTR tmp_statesArray = tmp_hmm->m_statesArray;
      unsigned short tmp_stateIndex = 0;
      for( ; tmp_stateIndex < tmp_hmm->m_statesArrayDimension; tmp_stateIndex++ )
      {
         StatePTR tmp_state = tmp_statesArray + tmp_stateIndex;
         fprintf ( _fptr, "%12ld ", tmp_state->m_firstProbability );
      }
      fprintf ( _fptr, "\n" );
   }
}
#endif

short ASRSPELLING::SpellDecoder::process_observation()
{
   #ifdef _FOR_LAMER
   if ( !m_flgInitialization /* _FLG_INITIALIZATION_NO */ )
   {
      return _FLG_INITIALIZATION_NO;
   }
   #endif
   m_framesCounter++;
   unsigned short tmp_transitionIndex = m_probabilitiesArrayDimension;
   unsigned short tmp_hmmIndex = m_hmmsArrayDimension;
   while ( tmp_hmmIndex-- )
   {      
      HmmPTR tmp_hmm = m_hmmsArray + tmp_hmmIndex;
      unsigned short tmp_stateIndex = tmp_hmm->m_statesArrayDimension;
      ProbabilityType tmp_probabilityTransition;
      StatePTR tmp_statesArray = tmp_hmm->m_statesArray;
      while( tmp_stateIndex-- )
      {
         StatePTR tmp_state = tmp_statesArray + tmp_stateIndex;
         unsigned short tmp_childsStateIndex = tmp_state->m_childsStatesArrayDimension;
         StatePPTR tmp_childsStatesArray = tmp_state->m_childsStatesArray;
         ProbabilityType tmp_currentProbability_1 = tmp_state->m_firstProbability;
         ProbabilityType tmp_currentProbability_2 = tmp_state->m_secondProbability;         
         if ( tmp_currentProbability_1 != _MIN_LOG_PROBABILITY )
         {            
            if ( tmp_currentProbability_2 != _MIN_LOG_PROBABILITY )
            {
               while ( --tmp_childsStateIndex )
               {
                  tmp_transitionIndex--;
                  tmp_probabilityTransition = m_probabilitiesArray[ tmp_transitionIndex ];
                  ProbabilityType tmp_accountProbability_1 = tmp_currentProbability_1 - tmp_probabilityTransition;
                  ProbabilityType tmp_accountProbability_2 = tmp_currentProbability_2 - tmp_probabilityTransition;
                  StatePTR tmp_childState = tmp_childsStatesArray[ tmp_childsStateIndex ];
                  if ( tmp_childState->m_firstProbability < tmp_accountProbability_1 && tmp_state->checkDurationConditionMinMaxFirst() && tmp_childState->checkDurationConditionAccount( tmp_state->m_firstAccountDuration ) )
                  {
                     tmp_childState->m_firstProbability = tmp_accountProbability_1;
                     tmp_childState->m_firstAccountDuration = tmp_state->m_firstAccountDuration + tmp_state->m_durationCode;
                     tmp_childState->m_firstInDuration = 0;
                  }                  
                  if ( tmp_childState->m_secondProbability < tmp_accountProbability_2 && tmp_state->checkDurationConditionMinMaxSecond() && tmp_childState->checkDurationConditionAccount( tmp_state->m_secondAccountDuration ))
                  {
                     tmp_childState->m_secondProbability = tmp_accountProbability_2;
                     tmp_childState->m_secondAccountDuration = tmp_state->m_secondAccountDuration + tmp_state->m_durationCode;
                     tmp_childState->m_secondInDuration = 0;
                  }                  
               }
               tmp_transitionIndex--;
               tmp_probabilityTransition = m_probabilitiesArray[ tmp_transitionIndex ];
               if ( tmp_state->checkDurationConditionMaxFirst() )
               {
                  tmp_state->m_firstProbability -= tmp_probabilityTransition;
                  tmp_state->m_firstInDuration += tmp_state->m_durationCode;
                  tmp_state->m_firstAccountDuration += tmp_state->m_durationCode;
               }
               else
               {
                  tmp_state->m_firstProbability = _MIN_LOG_PROBABILITY;
               }
               if ( tmp_state->checkDurationConditionMaxSecond() )
               {
                  tmp_state->m_secondProbability -= tmp_probabilityTransition;
                  tmp_state->m_secondInDuration += tmp_state->m_durationCode;
                  tmp_state->m_secondAccountDuration += tmp_state->m_durationCode;
               }
               else
               {
                  tmp_state->m_secondProbability = _MIN_LOG_PROBABILITY;
               }               
            }
            else
            {
               while ( --tmp_childsStateIndex )
               {
                  tmp_transitionIndex--;
                  ProbabilityType tmp_accountProbability_1 = tmp_currentProbability_1 - m_probabilitiesArray[ tmp_transitionIndex ];
                  StatePTR tmp_childState = tmp_childsStatesArray[ tmp_childsStateIndex ];
                  if ( tmp_childState->m_firstProbability < tmp_accountProbability_1 && tmp_state->checkDurationConditionMinMaxFirst() && tmp_childState->checkDurationConditionAccount( tmp_state->m_firstAccountDuration ) )
                  {
                     tmp_childState->m_firstProbability = tmp_accountProbability_1;
                     tmp_childState->m_firstAccountDuration = tmp_state->m_firstAccountDuration + tmp_state->m_durationCode;
                     tmp_childState->m_firstInDuration = 0;
                  }                  
               }
               tmp_transitionIndex--;
               if ( tmp_state->checkDurationConditionMaxFirst() )
               {
                  tmp_state->m_firstProbability -= m_probabilitiesArray[ tmp_transitionIndex ];
                  tmp_state->m_firstInDuration += tmp_state->m_durationCode;
                  tmp_state->m_firstAccountDuration += tmp_state->m_durationCode;
               }
               else
               {
                  tmp_state->m_firstProbability = _MIN_LOG_PROBABILITY;
               }
            }
         }         
         else
         {
            if ( tmp_currentProbability_2 != _MIN_LOG_PROBABILITY )
            {
               while ( --tmp_childsStateIndex )
               {
                  tmp_transitionIndex--;
                  ProbabilityType tmp_accountProbability_2 = tmp_currentProbability_2 - m_probabilitiesArray[ tmp_transitionIndex ];
                  StatePTR tmp_childState = tmp_childsStatesArray[ tmp_childsStateIndex ];
                  if ( tmp_childState->m_secondProbability < tmp_accountProbability_2 &&  tmp_state->checkDurationConditionMinMaxSecond() && tmp_childState->checkDurationConditionAccount( tmp_state->m_secondAccountDuration ))
                  {
                     tmp_childState->m_secondProbability = tmp_accountProbability_2;
                     tmp_childState->m_secondAccountDuration = tmp_state->m_secondAccountDuration + tmp_state->m_durationCode;
                     tmp_childState->m_secondInDuration = tmp_childState->m_durationCode;
                  }                  
               }
               tmp_transitionIndex--;
               if ( tmp_state->checkDurationConditionMaxSecond() )
               {
                  tmp_state->m_secondProbability -= m_probabilitiesArray[ tmp_transitionIndex ];
                  tmp_state->m_secondInDuration += tmp_state->m_durationCode;
                  tmp_state->m_secondAccountDuration += tmp_state->m_durationCode;
               }
               else
               {
                  tmp_state->m_secondProbability = _MIN_LOG_PROBABILITY;
               }               
            }
            else
            {
               tmp_transitionIndex -= tmp_childsStateIndex;
            }
         }            
      }
   }
   return 1;
}



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

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Имена идентификаторов должны быть смысловыми. На мой взгляд, в данном примере они чуть-чуть длинноваты. Можно немного сократить, например, checkDurationConditionAccount, до chkDuratConditAcc, чтобы глаз охватывал. Если переменная используется локально (в рамках 20–30 строк), то можно давать и несмысловые имена из двух-трёх символов.

Хорошо известно, что оптимальная для восприятия длина строка составляет 55–65 символов. В программном коде, ввиду наличия спец.символов, длина строки может быть раза в 2–3 раза больше.

Давать смысловые имена переменным, а также писать грамотные комментарии в коде программы, спору нет, нужно. Писать так труднее. Читать другому человеку (или самому, когда забудешь) — легче.

Тут, как обычно, должен быть баланс между кратковременным и долговременным планированием: успели написать программу к старту проекта — хорошо, она перестала работать через 2 недели после старта и никто уже не может разобраться, как она работает, — плохо.


Последний раз редактировалось sibrin Вс, ноя 04 2007, 21:52, всего редактировалось 2 раз(а).

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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
ИМХО, код должен помещаться на экране монитора без горизонтальной прокрутки у всей команды (upd: разработчиков). Этого достаточное и необходиое условие! В VisualStudio строка не переносится, как в Абапе. И, конечно, названия д.б. осмысленны + имена переменных соотвествовать венгерской нотации.
То есть, к вышеприведенному коду 2 замечания.


Последний раз редактировалось vga Вс, ноя 04 2007, 23:46, всего редактировалось 1 раз.

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

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
vga написал(а):
код должен помещаться на экране монитора

Да, конечно, но при каком шрифте и при каком разрешении? Можно шрифт сделать поменьше и пододвинуть монитор поближе. Инвариантная для восприятия величина — кол-во символов в строке. Современные мониторы позволяют поместить гораздо больше символов, чем может охватить глаз.

vga написал(а):
имена переменных соотвествовать венгерской нотации.
У венгерской нотации есть сторонники и противники.

По-моему, когда типы данных можно по пальцам пересчитать, она имеет смысл. В ABAPе это не так. Поэтому никому в голову и не приходит тип данных в префикс выносить. Конечно, принятые в ABAPе префиксы области видимости и размерности тоже можно считать венгерской нотацией. Но тут своя особенность: если я увижу идентификатор gt_mara, то ни за что не поверю, что это глобальная таблица. При написании программы в стиле экстремального программирования, когда ТЗ рождается последним, часто приходится переносить переменные из локальной области в глобальную, и наоборот. Так что, зачастую, от этих префиксов только путаница.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс, ноя 04 2007, 23:40 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
Ну и я добавлю свои 5 копеек.
Использую только средства форматирования встроенного редактора. Вполне доволен.
Переменные стараюсь именовать в одно слово, но чтобы несло смысловую нагрузку не только для меня (хотя длинные наименования не нравятся). Если не хватает смысловой нагрузки - добавляю "доп.суфиксы" после переменной. Перед переменной стараюсь использовать префиксы, указывающие на принадлежность ее к глобальным либо локальным данным программы.
Частенько переменные интерфейса вызываемых ФМ в своих программах именую один-в-один. Можете кидать тапками :)
После появления нового редактора стал использовать upper case форматирование для всего текста программ. Все равно подсветка все на свои места расставляет.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс, ноя 04 2007, 23:56 
Начинающий
Начинающий

Зарегистрирован:
Пн, окт 01 2007, 10:17
Сообщения: 11
Существует довесок к стандартному Pretty Print
Improved Pretty Print program used Clipboard


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

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


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

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


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

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