Age: 40 Joined: 01 Feb 2008 Posts: 387 Location: Воронеж
Posted: Mon Feb 04, 2013 10:08 pm Post subject: Техническая часть ФС
Всем привет, интересно насколько часто вам приходится заполнять техническую часть документации. И присутствуют ли в ней разделы с созданными объектами, запросами и тому подобной ..эээээ... штукой
Из тех кто работает с этой документацией, хоть раз пригодился список объектов или список запросов?
не теоретически, а практически имею ввиду.
ЗЫ: почему спросил, меня недавно это запарило, я написал прогу, которая выгружает эти вещи более менее автоматически. Если вещь нужная, может я ее чуть подправлю, и выложу? По большому счету хрень, но экономит много времени, особенно когда нужно обновить десятки спек быстро.
19.03.2013 выкладываю код в 1 пост
Есть 2 таблицы
2 таблицы ZHR_REQUEST_TAB - для уменьшения объектов выборки
ZHR_PROG_MASK - более специфична
Так же прога, таблицы, и пример их заполнения прикрепляю к сообщению
PARAMETERS: p_text TYPE as4text DEFAULT '*'.
* ,p_stat TYPE trstatus
SELECT-OPTIONS so_strk for e070-strkorr.
PARAMETERS: p_num TYPE text4
.
SELECT-OPTIONS: so_pgmid FOR e071-pgmid.
*--------------------------------------------------------------------*
DATA: BEGIN OF gt_data OCCURS 0
,trkorr TYPE trkorr
,trfunction TYPE trfunction
,trstatus TYPE trstatus
,as4date TYPE as4date
,as4text TYPE as4text
,pgmid TYPE pgmid
,object TYPE trobjtype
,obj_name TYPE trobj_name
,objfunc TYPE objfunc
,devclass TYPE devclass
* ,reference TYPE trvalue
,END OF gt_data
,BEGIN OF gt_table1 OCCURS 0
,type TYPE OBJ_TYP
,name TYPE trobj_name
,action TYPE devclass
,prim TYPE as4text
,END OF gt_table1
,BEGIN OF gt_table2 OCCURS 0
,n TYPE INT4"(5)
,date TYPE as4date "(10)
,request TYPE trkorr"(50)
,request_name TYPE as4text"(200)
,END OF gt_table2
,gt_object_table TYPE TABLE OF ko100
,gt_cust TYPE TABLE OF zhr_request_tab
,gt_mask TYPE TABLE OF zhr_prog_mask
,gv_num_text TYPE as4text
.
*--------------------------------------------------------------------*
INITIALIZATION.
*Подготовка таблицы с запросами для выгрузки
PERFORM create_table_1.
*Подготовка таблицы с запросами для выгрузки
PERFORM create_table_2.
*Выгрузка в ворд
"PERFORM show_word.
*Выгрузка в ALV
PERFORM show_alv.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
FORM get_data .
*--select values for pgmid/object/text from database--------------------
CALL FUNCTION 'TR_OBJECT_TABLE'
TABLES
wt_object_text = gt_object_table.
TRANSLATE p_text USING '*%'.
SELECT * FROM zhr_request_tab INTO TABLE gt_cust.
SELECT * FROM zhr_prog_mask INTO TABLE gt_mask.
SELECT "DISTINCT
e070~trkorr e070~trfunction e070~trstatus
e070~as4date e07t~as4text e071~object
e071~obj_name e071~objfunc e071~pgmid
tadir~devclass
INTO CORRESPONDING FIELDS OF TABLE gt_data
FROM ( e070
INNER JOIN e07t
ON e07t~trkorr = e070~trkorr
INNER JOIN e071
ON e071~trkorr = e070~trkorr
INNER JOIN tadir
ON tadir~obj_name = e071~obj_name )
BYPASSING BUFFER "(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
WHERE e07t~as4text LIKE p_text
AND e070~strkorr in so_strk
AND e071~pgmid IN so_pgmid
GROUP BY e070~trkorr e070~trfunction e070~trstatus
e070~as4date e07t~as4text e071~object
e071~obj_name e071~objfunc e071~pgmid
tadir~devclass
.
gv_num_text = p_num.
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form CREATE_TABLE_1
*&---------------------------------------------------------------------*
FORM create_table_1 .
CONSTANTS: lc_prog TYPE trobjtype VALUE 'PROG'
,lc_reps TYPE trobjtype VALUE 'REPS'
.
DATA: lr_obj_name TYPE RANGE OF trobj_name
,lv_off TYPE i
,lv_num_text TYPE as4text
,lv_lenght TYPE i
,ls_cust TYPE zhr_request_tab
,lv_objid TYPE hr_sobjid
,lv_otype TYPE hr_sotype
,lv_clsname TYPE seoclsname
,lv_cmpname TYPE seocmpname
,lv_sotr_key TYPE sotr_key
,lv_shorttextid TYPE enhdocuobject
,lv_entry TYPE sotr_text
,lv_tabclass TYPE tabclass
,lv_prog TYPE progname
,lv_dynr TYPE dynpronr
.
RANGES: lr_object FOR ls_cust-object.
FIELD-SYMBOLS: <fs_table1> LIKE LINE OF gt_table1
,<fs_data> LIKE LINE OF gt_data
,<fs_object_table> LIKE LINE OF gt_object_table
,<fs_obj_name> LIKE LINE OF lr_obj_name
,<fs_cust> LIKE LINE OF gt_cust
,<fs_mask> LIKE LINE OF gt_mask
.
"(--------Проверки по типу объекта---------------------------)
"(--------------WHEN-------------------------)
WHEN 'PDTS' OR 'PDWS' OR 'PDAC'.
IF <fs_data>-object = 'PDTS'.
lv_otype = 'TS'.
ELSEIF <fs_data>-object = 'PDWS'.
lv_otype = 'WS'.
ELSEIF <fs_data>-object = 'PDAC'.
lv_otype = 'AC'.
ENDIF.
lv_objid = <fs_data>-obj_name.
SELECT SINGLE stext FROM hrs1000 INTO <fs_table1>-prim "(Тащим имя объекта из таблицы с инфотипами)
WHERE objid = lv_objid
AND otype = lv_otype
AND langu = sy-langu.
"IF <fs_table1>-prim IS INITIAL.
SELECT SINGLE witext FROM hrs1206 INTO <fs_table1>-prim "(Тащим пометку/указание из таблицы с инфотипами)
WHERE objid = lv_objid
AND otype = lv_otype
AND langu = sy-langu.
"ENDIF.
IF <fs_table1>-prim IS INITIAL.
SELECT SINGLE stext FROM hrs1000 INTO <fs_table1>-prim
WHERE objid = lv_objid
AND otype = lv_otype.
ENDIF.
IF <fs_table1>-prim IS INITIAL.
SELECT SINGLE witext FROM hrs1206 INTO <fs_table1>-prim
WHERE objid = lv_objid
AND otype = lv_otype.
ENDIF.
"(--------------WHEN-------------------------)
WHEN 'METH'.
SPLIT <fs_data>-obj_name AT space INTO lv_clsname lv_cmpname.
CONDENSE lv_cmpname.
SELECT SINGLE descript FROM seocompotx INTO <fs_table1>-prim
WHERE clsname = lv_clsname
AND cmpname = lv_cmpname
AND langu = sy-langu.
IF sy-subrc IS INITIAL.
SELECT SINGLE descript FROM seocompotx INTO <fs_table1>-prim
WHERE clsname = lv_clsname
AND cmpname = lv_cmpname.
ENDIF.
"(--------------WHEN-------------------------)
WHEN 'ENHC' OR 'ENHO' OR 'ENHS' OR 'ENSC'.
IF <fs_data>-object = 'ENHC'.
SELECT SINGLE shorttextid FROM enhcompheader INTO lv_shorttextid
WHERE enhcomposite = <fs_data>-obj_name
AND version = 'A'.
ELSEIF <fs_data>-object = 'ENHO'.
SELECT SINGLE shorttext_id FROM enhheader INTO lv_shorttextid
WHERE enhname = <fs_data>-obj_name
AND version = 'A'.
ELSEIF <fs_data>-object = 'ENHS'.
SELECT SINGLE shorttextid FROM enhspotheader INTO lv_shorttextid
WHERE enhspot = <fs_data>-obj_name
AND version = 'A'.
ELSEIF <fs_data>-object = 'ENSC'.
SELECT SINGLE shorttextid FROM enhspotcomphead INTO lv_shorttextid
WHERE enhspotcomposite = <fs_data>-obj_name
AND version = 'A'.
ENDIF.
SELECT SINGLE dtxt FROM d020t INTO <fs_table1>-prim
WHERE prog = lv_prog
AND dynr = lv_dynr
AND lang = sy-langu.
IF sy-subrc IS INITIAL.
SELECT SINGLE dtxt FROM d020t INTO <fs_table1>-prim
WHERE prog = lv_prog
AND dynr = lv_dynr.
ENDIF.
"(--------------WHEN-------------------------)
WHEN 'CMOD'.
PERFORM get_text USING 'MODTEXT' 'MODTEXT'
'NAME' <fs_data>-obj_name
'SPRSL'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'TRAN'.
PERFORM get_text USING 'TTEXT' 'TSTCT'
'TCODE' <fs_data>-obj_name
'SPRSL'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'FUGR'.
PERFORM get_text USING 'AREAT' 'TLIBT'
'AREA' <fs_data>-obj_name
'SPRAS'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'CLAS' OR 'INTF'.
PERFORM get_text USING 'DESCRIPT' 'SEOCLASSTX'
'CLSNAME' <fs_data>-obj_name
'LANGU'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'VIEW' OR 'VIED' OR 'ENQU'.
PERFORM get_text USING 'DDTEXT' 'DD25T'
'VIEWNAME' <fs_data>-obj_name
'DDLANGUAGE'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'VCLS'.
PERFORM get_text USING 'TEXT' 'VCLDIRT'
'VCLNAME' <fs_data>-obj_name
'SPRAS'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'SHLP' OR 'SHLD'.
PERFORM get_text USING 'DDTEXT' 'DD30T'
'SHLPNAME' <fs_data>-obj_name
'DDLANGUAGE'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'TABL'.
PERFORM get_text USING 'DDTEXT' 'DD02T'
'TABNAME' <fs_data>-obj_name
'DDLANGUAGE'
CHANGING <fs_table1>-prim.
SELECT SINGLE tabclass FROM dd02l INTO lv_tabclass
WHERE tabname = <fs_data>-obj_name.
IF lv_tabclass = 'INTTAB'.
<fs_table1>-type = 'Структура'.
ENDIF.
"(--------------WHEN-------------------------)
WHEN 'DTEL'.
PERFORM get_text USING 'DDTEXT' 'DD04T'
'ROLLNAME' <fs_data>-obj_name
'DDLANGUAGE'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'DOMA'.
PERFORM get_text USING 'DDTEXT' 'DD01T'
'DOMNAME' <fs_data>-obj_name
'DDLANGUAGE'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'TTYP'.
PERFORM get_text USING 'DDTEXT' 'DD40T'
'TYPENAME' <fs_data>-obj_name
'DDLANGUAGE'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'PROG' OR 'REPS'.
IF <fs_table1>-prim IS INITIAL.
PERFORM get_text USING 'TEXT' 'TRDIRT'
'NAME' <fs_data>-obj_name
'SPRSL'
CHANGING <fs_table1>-prim.
ENDIF.
"(--------------WHEN-------------------------)
WHEN 'FUNC'.
PERFORM get_text USING 'STEXT' 'TFTIT'
'FUNCNAME' <fs_data>-obj_name
'SPRAS'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'SXCI'.
PERFORM get_text USING 'TEXT' 'SXC_ATTRT'
'IMP_NAME' <fs_data>-obj_name
'SPRSL'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'SFPF'.
PERFORM get_text USING 'TEXT' 'FPCONTEXTT'
'NAME' <fs_data>-obj_name
'LANGUAGE'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'SFPI'.
PERFORM get_text USING 'TEXT' 'FPINTERFACET'
'NAME' <fs_data>-obj_name
'LANGUAGE'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'WDYN' OR 'WDYC'.
PERFORM get_text USING 'DESCRIPTION' 'WDY_COMPONENTT'
'COMPONENT_NAME' <fs_data>-obj_name
'LANGU'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'WDYA'.
PERFORM get_text USING 'DESCRIPTION' 'WDY_APPLICATIONT'
'APPLICATION_NAME' <fs_data>-obj_name
'LANGU'
CHANGING <fs_table1>-prim.
"(--------------WHEN-------------------------)
WHEN 'MSAG'.
PERFORM get_text USING 'STEXT' 'T100A'
'ARBGB' <fs_data>-obj_name
'MASTERLANG'
CHANGING <fs_table1>-prim.
ENDCASE.
ENDLOOP.
SORT gt_table1 BY type name.
DELETE ADJACENT DUPLICATES FROM gt_table1.
IF lr_obj_name[] IS NOT INITIAL.
DELETE gt_table1 WHERE name IN lr_obj_name.
ENDIF.
ENDFORM. " CREATE_TABLE_1
*&---------------------------------------------------------------------*
*& Form CREATE_TABLE_2
*&---------------------------------------------------------------------*
FORM create_table_2 .
DATA: lv_new_trkorr(1)
.
FIELD-SYMBOLS: <fs_table2> LIKE LINE OF gt_table2
,<fs_data> LIKE LINE OF gt_data.
LOOP AT gt_data ASSIGNING <fs_data>.
CLEAR: lv_new_trkorr.
AT NEW trkorr.
lv_new_trkorr = 'X'.
ENDAT.
IF lv_new_trkorr IS NOT INITIAL.
APPEND INITIAL LINE TO gt_table2 ASSIGNING <fs_table2>.
WRITE <fs_data>-as4date TO <fs_table2>-date.
<fs_table2>-request = <fs_data>-trkorr.
<fs_table2>-request_name = <fs_data>-as4text.
ENDIF.
ENDLOOP.
LOOP AT gt_table2 ASSIGNING <fs_table2>.
<fs_table2>-n = sy-tabix.
ENDLOOP.
ENDFORM. " CREATE_TABLE_2
*&---------------------------------------------------------------------*
*& Form SHOW_WORD
*&---------------------------------------------------------------------*
FORM show_word .
*&---------------------------------------------------------------------*
*& Form SHOW_ALV
*&---------------------------------------------------------------------*
FORM show_alv .
DATA: lr_alv_table TYPE REF TO cl_salv_table
,lr_functions TYPE REF TO cl_salv_functions.
*&---------------------------------------------------------------------*
*& Form GET_TEXT
*&---------------------------------------------------------------------*
FORM get_text USING value(pv_text)
value(pv_tab)
value(pv_cond)
pv_obj_name
value(pv_langu)
CHANGING cv_prim.
DATA: cond_syntax TYPE string.
CONCATENATE pv_cond '=' 'PV_OBJ_NAME'
'AND' pv_langu '=' 'SY-LANGU'
INTO cond_syntax SEPARATED BY space.
SELECT SINGLE (pv_text) FROM (pv_tab) INTO cv_prim
WHERE (cond_syntax).
IF cv_prim IS INITIAL.
CONCATENATE pv_cond '=' 'PV_OBJ_NAME'
INTO cond_syntax SEPARATED BY space.
SELECT SINGLE (pv_text) FROM (pv_tab) INTO cv_prim
WHERE (cond_syntax).
ENDIF.
Posted: Tue Feb 05, 2013 7:03 am Post subject: Re: Техническая часть ФС
XXX_:) wrote:
Всем привет, интересно насколько часто вам приходится заполнять техническую часть документации. И присутствуют ли в ней разделы с созданными объектами, запросами и тому подобной ..эээээ... штукой
Из тех кто работает с этой документацией, хоть раз пригодился список объектов или список запросов?
не теоретически, а практически имею ввиду.
ЗЫ: почему спросил, меня недавно это запарило, я написал прогу, которая выгружает эти вещи более менее автоматически. Если вещь нужная, может я ее чуть подправлю, и выложу? По большому счету хрень, но экономит много времени, особенно когда нужно обновить десятки спек быстро.
Конечно выкладывай, уже подобное юзаем, но для истории лишним не будет
Age: 160 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Tue Feb 05, 2013 1:15 pm Post subject:
Заполняем конечно, на мой вгляд, много не нужного.
Но, список юзер-ехитов может пригодиться, далеко не всегда очевидно, что вызывается. История транспортов, тоже штука полезная.
Если отдельно не используется система change management,
полезно в спеке вести историю ошибок и примеры их тестирования. Часто будущие исправления приводят к возврату ошибок. _________________ Молитва - это запрос разработчику на изменение кода программы.
Age: 46 Joined: 05 Nov 2007 Posts: 725 Location: КраснАдар
Posted: Wed Feb 06, 2013 9:27 am Post subject:
Нужно детально описывать. Все созданные объекты и, обязательно, логику.
У меня был негативный опыт. Принимали от "внедренцев" документацию по одному отчету. В ней указано, что создана программа и транзакция, для вывода используется ALV Grid, алгоритм указан в функциональной спецификации. Формально все ок. На деле - указанная программа содержит 30 строк, в которых оформлен вызов стат.метода какого-то самописного класса. А внутри этого метода, еще 10 различных вызовов других методов других классов. И как это дерьмище потом сопровождать - одному богу известно. _________________ FunCoding.ru KicksCollector.ru
Age: 46 Joined: 05 Nov 2007 Posts: 725 Location: КраснАдар
Posted: Wed Feb 06, 2013 9:32 am Post subject:
Добавлю еще пару строк банальных.
Хорошо сформулированная функциональная спецификация (ТЗ) - это 80% успеха при разработке. В свою очередь хорошо оформленная техническая спецификация - те же проценты успеха, но уже при сопровождении + 10 в карму оформителю + звание "Спаситель пустоши". _________________ FunCoding.ru KicksCollector.ru
Age: 160 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Wed Feb 06, 2013 10:40 am Post subject:
John Doe wrote:
На деле - указанная программа содержит 30 строк, в которых оформлен вызов стат.метода какого-то самописного класса. А внутри этого метода, еще 10 различных вызовов других методов других классов. И как это дерьмище потом сопровождать - одному богу известно.
Чувствуется, любишь ты классы в абап
Я лично "тащусь" от их сопровождения и удобств навигации. _________________ Молитва - это запрос разработчику на изменение кода программы.
Age: 40 Joined: 01 Feb 2008 Posts: 387 Location: Воронеж
Posted: Wed Feb 06, 2013 2:47 pm Post subject:
прогу мою стажер проверит на предмет явных косяков, потом выложу.
А насчет вызова класса и т.д. то видимо этот класс был написал для другой разработки, а в этой лишь использовался, смысла по нескольку раз копипастить смысла не вижу (хотя сам так не далал вроде бы).
Если пакет и все объекты содержат номер разработки, все объекты лежат в своих пакетах. Если в описании запросов всегда есть номер запроса и либо порядковый номер либо дата, то поиск любой инфы не составляет труда. Что касается логики работы программы, то я вообще не люблю ничего описывать в тех.части. Немного пишу в комментариях что именно сейчас ищу или обрабатываю. Если нужно реализую какую то часть логики из спеки, то переношу ее копипастом из спеки в комментарии к данному участку кода.
Мне так кажется удобнее. А описывать что то отдельно от кода очень сложно, и читается потом неудобно. Что касается реализации юзер-екзитов, то внутрь него кладу инклуд в имени которого номер разработки, сам инклуд в пакет с номером разработки. В общем после этого его искать не составит большого труда. Близкая по духу технология передачи параметров в память в одном коде и чтение в другом. Делаем статический класс в название номер разработки. У него 2 метода set и get соответсвенно, в которых записываем значения в память и читаем из нее же, таким образом весь код легко отследить(Спасибо моему другу Юре за эту идею с классами).
сам сейчас делал разработки 4 программы. Они почти полностью состоят из классов. Хотя писал так не по моему желанию, а т.к. там много алв и их надо обрабатвать, много схожего кода, а вызов подпрограмм из обработчиков алв не красиво, вот и пришел у "класс"ной программе
ЗЫ: я видел несколько программ написанных на классах, которые по другому было нельзя описать, там и наследование и т.д. ))) очень сложно было по началу, но когда программа реально сложная, то нужно подбирать оптимальную реализацию и пользоваться классами, если это улучшит код и убережет его от ошибок. _________________ Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Age: 46 Joined: 05 Nov 2007 Posts: 725 Location: КраснАдар
Posted: Wed Feb 06, 2013 3:40 pm Post subject:
Такой подход, может быть, не составит большого труда в поисках лично этому же разработчику через 3-4 года, к примеру. А вот другому очень даже составит, по моему мнению.
Плохая документация, по факту, ничем не лучше ее отсутствия вообще.
Документация не должна облегчать поиск изменений, это заблуждение. Наоборот, она должна отражать изменение в логике, вызванное изменением программы. Т.е. любое изменение должно быть отражено и в функциональной, и в технической документации.
А по поводу "крутости" реализации, я считаю, что это либо детство, либо глупость. Программисты меряются друг перед другом своими программами, как приматы длиной достоинства. По личному опыту скажу - всем остальным "непрограммистам" глубоко похрену на то, что у программы внутри. Все оценки делаются на основании функциональности и удобства работы. Часто программисты напрочь забывают, что результаты их работы предназначены для мейнстрим пользователей, а не для ценителей раритетов. _________________ FunCoding.ru KicksCollector.ru
Age: 40 Joined: 01 Feb 2008 Posts: 387 Location: Воронеж
Posted: Wed Feb 06, 2013 4:13 pm Post subject:
John Doe wrote:
Документация не должна облегчать поиск изменений, это заблуждение. Наоборот, она должна отражать изменение в логике, вызванное изменением программы. Т.е. любое изменение должно быть отражено и в функциональной, и в технической документации.
Андрей, я не видел ни одной технической спецификации, которая бы нормально отражала то что твориться в коде. Если ты имеешь ввиду, что туда просто пишется, что алгоритм по проверке был по таблице такой то стал по такой то, то не уверен, что кому то будет интересно через месяц какая раньше тут была проверка, тем более что всегда можно через версии посмотреть что именно поменяли. А со временем за многочисленными исправлениями становиться уже не понятно что было в самом начале, да и так ли это важно спустя год-другой?
Если у тебя есть пример такой спецификации, вышли, я посмотрю, возможно мне просто не попадались такие экземпляры, и я наконец то буду писать более правильно.
John Doe wrote:
А по поводу "крутости" реализации...
Ну я вообще то не то имел ввиду. Я имел ввиду нормальный стиль программирования, чтобы не было копипаста, чтобы локальные данные не становились глобальными, чтобы когда нужно было поправить какую то проверку или выборку не нужно было делать это во многих местах. Код должен быть написан таким образом, чтобы новый разработчик мог достаточно быстро понять логику программы и найти нужное место для ее модификации. Мериться то зачем ))).
Программу, мы конечно пишем для пользователя, и ему конечно глубоко на то что внутри, но нужно ведь подумать и о тех кто потом будет этот код читать. Если код го"№;но(а его навалом), то никакое описание не поможет, его бывает зачастую лучше переписать, чем поддерживать. Если программу пишешь, как для себя любимого, то и другому в ней не сложно разобраться, если он конечно не стажер какой нибудь.
John Doe wrote:
Плохая документация, по факту, ничем не лучше ее отсутствия вообще.
+1
а по поводу того что требуют писать запросы и объекты, так я искренне считаю, что это мусор, т.к. он не отражает сути, но т.к. это требуется, то и была написана соответствующая программа. _________________ Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Age: 47 Joined: 14 Nov 2008 Posts: 300 Location: Russia
Posted: Wed Feb 06, 2013 8:42 pm Post subject:
XXX_:) wrote:
прогу мою стажер проверит на предмет явных косяков, потом выложу
Правильно, не барское это дело! У меня вообще недавно сама архитектор тестировала.
А разве абапу не глубоко без разницы объектная (ну экранчики только дорисовать) или функциональная направленность реализации проектного ABAP-концепта? Само по себе важно его наличие не только в виртуальном разрозненном виде в головах исполнителей, а еще и в материальном воплощении: файл, ватман там. А у нас что? Регламент... А по-хорошему надо отдельно по функциональным (если требуется), общим (WF, DMS, CA-CL и т.п.), замещениям и прочим, требующим концептуального описания. А уже потом регламенты, наименования. И, самое главное, выстроить все в иерархию с перекрестными ссылками. Зашел в ТС, перешел в ФС процесса - используемые расширения - список где еще используется какое-либо расширение и т.д. Покликали, вернулись, курим ТС дальше, в других окнах подсматриваем нужную инфу.
Надеюсь, что доживу до такого счастья: полномасштабной проект с реализацией ИНФОСИСТЕМЫ документации, как жизненно необходимой части внедряемой системы. А не "так, все срочно пишем ФС/ТС, завтра последний день проекта, банкет и улетаем".
А по поводу классов я солидарен с Андреем. Тоже не люблю классы, вот их перечень:
1) первый раз в первый класс (самый первый класс);
2) я у мамы дурачок, напишу-ка косячок (второй класс);
3) попробую-ка я ... (cl_salv_table, RTTS etc);
4) вся остальная хрень репозитария, внутри методов которой вызовы ФМ дат, вариантов, нет/брут (обертка стандарта), чаще всего под 1, максимум 2 небольших разработки очередного мудака, дорвавшегося до системы;
Здесь никакая документация не спасет... _________________ ABAP/4 You
Last edited by Dmitriy on Thu Feb 07, 2013 1:33 am; edited 3 times in total
Age: 40 Joined: 01 Feb 2008 Posts: 387 Location: Воронеж
Posted: Wed Feb 06, 2013 10:02 pm Post subject:
Дима, сколько горечи ))) и нелюбви к классам. )) не удержался, улыбнуло ).
Просто лишь хотел сказать что есть разработки которые без использования классов реализовать очень сложно, код превращается в какую то кашу. Если у вас не было таких разработок, то не смогу объяснить. Но если не писать, то хотя бы свободно читать надо всем нам уметь. Вообще остановиться в нашей профессии почти значит уступить свое место более молодым и амбициозным, а не хотелось бы.
ЗЫ: очень ушли от первоначальной темы и свалились в негативные какие то высказывания. Это я виноват в общем то. _________________ Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Age: 47 Joined: 14 Nov 2008 Posts: 300 Location: Russia
Posted: Wed Feb 06, 2013 11:39 pm Post subject:
XXX_:) wrote:
Дима, сколько горечи ))) и нелюбви к классам. )) не удержался, улыбнуло ).
Просто лишь хотел сказать что есть разработки которые без использования классов реализовать очень сложно, код превращается в какую то кашу. Если у вас не было таких разработок, то не смогу объяснить. Но если не писать, то хотя бы свободно читать надо всем нам уметь. Вообще остановиться в нашей профессии почти значит уступить свое место более молодым и амбициозным, а не хотелось бы.
ЗЫ: очень ушли от первоначальной темы и свалились в негативные какие то высказывания. Это я виноват в общем то.
Верно, но это не горечь, а банальный стёб над ООП. Просто забыл дописать, что всё остальное меня устраивает, а тот же RTTS + cl_salv даже чем-то нравится. Это как раз к вопросу о молодых, которым уступить. Зачем же, наш метод - изучать и использовать. Там не сложно, больше поводов потом у тех, кто любит программами мерятся.
Всё, что считаешь нужным записать в ТС - пиши. Список запросов и объектовх, вменяемые описания классов (отдельно), ГФ (кроме автогенер.), блоков обработки и т.п. Приносит уважение и благодарность уже в этой жизни, с возможностью полной отработки своей и частично чужой негативной кармы (всяких балбесов), а не + 10 к карме и медальку, как тебе тут John Doe расписывает, дескать умрешь и в зачет этих "+" в следующей жизни будешь директором у заказчика. Он просто руководитель, а ты посмотри какая подпись у шефа. Думаешь, просто так? _________________ ABAP/4 You
Наверное буду проклят, но я как раз предпочитаю оборачивать громоздкие вызовы стандарта в более компактную форму (естесственно если эти вызовы часто нужны). Если нужно только в одной программе - то в подпрограмму, если нужно не в одной - то в статический метод глобального класса. И не только сам пишу - но и сопровождаю написанное другими, и если имена классов и методов выбраны с умом - все достаточно понятно и прозрачно.
А по теме - заполняем техническую часть, всегда. Правда вместо списка запросов обычно шаблон наименования, у нас на это регламент плюс проверка при создании запроса
Наверное буду проклят, но я как раз предпочитаю...
Это нормально, мы просто ждали.
Хочу добавить что полный ООПец осуждаю
Как пример - тр. MIRO, когда копался - временами хотелось сделать разработчику этого что нибудь неприятное и болезненное
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.