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

Часовой пояс: 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 часа


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

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


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

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