In workshop CD261 at this years TechEds you will get your hands on expression enabled ABAP 7.40.
As almost every year the question arised, what kind of exercise can we offer to you, Two years ago, I prepared a pocket calculator simulation that was written in old style code and that the participants had to refactor to expression oriented code as far as possible with ABAP 7.02. Since gamification is such a buzz word and since another subject of the workshop - ABAP Channels - is also exemplified by a game, we (Holger and myself) have decided to also use a gaming example for expression enabled ABAP this year. We searched for an existing game programmed in ABAP and prepared it in such a way that it is usable for an exercise.
The existing game
As a suitable game we found a Jawbreaker adaption in Enno Wulff's Trick Tresor: Well, if you look at the code, you see typical ABAP as you can find tons of it in real life programs: full of forms, OCCURS, WRITEs, ... (and comments and names in German) but no offense!. We like the idea of the game but it cannot be an exercise template in such a pre ABAP Objects state .
Refactoring the game for ABAP 7.0
Theerfore, we have rewritten the game in such a way that it represents a state-of-the-art 7.0 ABAP program. The new version uses ABAP Objects instead of subroutines of course and no other obsole statements any more. And since classical list programming is regarded as a kind of old fashioned, the game interface is realized as an HTML file shown in a browser control (but we will also offer a list based version):
You find the source code of the refactored game attached as Z_BLOCKS_HTML_700.txt. You can copy the code to your 7.02 or 7.0 sytem and run it happily there (since the convenience class CL_ABAP_BROWSER is not yet available in 7.0, you have to replace it with CL_GUI_HTML_VIEWER and use an own custom control there). But the game is not the aim.
Express the game in 7.40
The aim is to beautify the ABAP code by replacing statements and helper variables with expressions whilst the functionality stays the same. This will be an exercise of the 2013 TechEd workshop. I could attach the full solution right now, but I won't (no cheating!). All I will say is that you can reduce the amount of lines by 35% by introducing expressions as shown in the following code snippets:
Example 1
Z_BLOCKS_HTML_700
DATA:
rnd_color TYPE REF TO cl_abap_random_int,
seed TYPE i.
seed = sy-uzeit.
rnd_color = cl_abap_random_int=>create( seed = seed min = 1 max = 4 ).
Z_BLOCKS_HTML_740
DATA(rnd_color) =
cl_abap_random_int=>create( seed = CONV i( sy-uzeit ) min = 1 max = 4 ).
Example 2
Z_BLOCKS_HTML_700
READ TABLE field INDEX x ASSIGNING <column>.
READ TABLE <column> INDEX y ASSIGNING <color>.
Z_BLOCKS_HTML_740
DATA(color) = field[ x ][ y ].
Example 3
Z_BLOCKS_HTML_700
CASE <color>.
WHEN 1.
color = `lightblue`.
WHEN 2.
color = `cornflowerblue`.
WHEN 3.
color = `darkblue`.
WHEN 4.
color = `steelblue`.
ENDCASE.
DATA:
xn TYPE n2,
yn TYPE n2.
xn = x.
yn = y.
CONCATENATE
html
`<td bgcolor="` color `">`
`<a href="sapevent:x` xn `y` yn
`" style="text-decoration:none">` square `</a></td>`
INTO html.
Z_BLOCKS_HTML_740
html =
html &&
|<td bgcolor="{ SWITCH string( color WHEN 1 THEN `lightblue`
WHEN 2 THEN `cornflowerblue`
WHEN 3 THEN `darkblue`
WHEN 4 THEN `steelblue`) }">| &&
|<a href="sapevent:x{ CONV n2( x )
}y{ CONV n2( y )
}" style="text-decoration:none">{ square }</a></td>|.
And of course, you can get your hands on ADT (Eclipse) for rewriting the code ...
See you at TechEd!