Professional Documents
Culture Documents
“Methods”
Contents
Index
The Authors
www.sap-press.com/5190
Chapter 4
Methods
This chapter deals with clean ABAP methods. We’ll walk through key 4
method concepts such as method design, method body, and control
flow. We’ll also explore the preferred way to call methods with clean
ABAP.
Methods are the ultimate containers of executable code in ABAP Objects. Other types
of structures that directly contain code are function modules, programs, and subrou-
tines, but as discussed in Chapter 2, Section 2.3, methods are the preferred low-level
building blocks for clean ABAP code.
Many other chapters in this book describe detailed clean code patterns and recommen-
dations for ABAP code within methods. This chapter deals with the design, declaration,
and usage of methods; high-level control flow within methods; method body guide-
lines; and invoking methods. We’ll start with an in-depth discussion on methods in the
context of object-oriented programming in Section 4.1. Then, in Section 4.2, we’ll dive
deeply into method parameters and their use before turning, in Section 4.3, to clean
code principles to apply to the method body. To finish this chapter, we’ll show you how
to call your methods cleanly in Section 4.4.
95
4 Methods 4.1 Object-Oriented Programming
ENDCLASS. ENDCLASS.
Listing 4.2 Instance Method Definition Listing 4.3 Static Creation Method Example
To call an instance method, you need an instance of the class, followed by a thin arrow Utility methods are methods that don’t depend on any underlying resources and per-
(->): form a static operation that is not reasonably expected to change and does not need
DATA my_blog_post TYPE REF TO blog_post. any parameterized behavior. These methods should usually be part of a utility class
... that provides related operations (see Chapter 3, Section 3.1.2). An example of the defini-
my_blog_post->publish( ). tion of a utility method is shown in Listing 4.4, where the fahrenheit_to_celsius
method performs a simple temperature conversion. This kind of operation does not
require any variation and is perfectly fine as a utility method.
Consider Using Instance Methods by Default
CLASS temperature_conversion DEFINITION
The key to the flexibility of instance methods is the fact that they are attached to
PUBLIC
instances of classes. At runtime, a specific instance could refer to any subclass in the
ABSTRACT
hierarchy of the declared class variable (including itself), which makes the method call
FINAL.
“dynamic” or “virtual.”
96 97
4 Methods 4.1 Object-Oriented Programming
PUBLIC SECTION.
Public Instance Methods Should Be Part of an Interface
CLASS-METHODS fahrenheit_to_celsius For a class to serve as a good citizen in an overall design, the class should implement
IMPORTING interfaces that define its abstract behavior. Consequently, most, if not all, of its public
temperature_in_fahrenheit TYPE temperature instance methods should be part of an interface. 4
RETURNING
In this way, the class itself becomes a mere implementation of the concepts repre-
VALUE(result) TYPE temperature.
sented by the interfaces it implements, and consumers don’t need to depend directly
on the class at all. This important step enables the dependency inversion principle, the
...
D in SOLID.
ENDCLASS.
Not all classes need to implement interfaces. Exception classes, value objects (see Chap-
Listing 4.4 Utility Method Example ter 3, Section 3.1.2), and enumeration classes (see Chapter 6, Section 6.2.2), for example,
usually don’t need to present an abstraction over their operations and, as such, aren’t
Both static and instance methods are implemented with the METHOD … ENDMETHOD con-
usually backed by interfaces. In general, classes that represent values or entities that
struct in the class implementation area, as shown in Listing 4.5 for the static method
only contain data, and not services, won’t implement interfaces.
temperature_conversion=>fahrenheit_to_celsius.
For more information about interfaces and their advantages, refer to Chapter 3, Section
CLASS temperature_conversion IMPLEMENTATION. 3.1.1.
Let’s revisit and improve the design of the thermal_switch class presented in Chapter 3,
METHOD fahrenheit_to_celsius.
result = ( temperature_in_fahrenheit - 32 ) * 5 / 9.
Section 3.1.2, specifically in Listing 3.15. The thermal_switch class’s main service is to pro-
ENDMETHOD. tect a wrapped device from overheating. Its methods are trip (to trip the switch and
turn the device off) and reset (to reset the switch to a normal state), which were imple-
ENDCLASS. mented as direct public instance methods on the class.
Public instance methods in a class effectively define its interface to outside consumers. Listing 4.6 The thermal_protector Interface
Anyone with access to the class can call that class’s public instance methods.
The thermal_switch class now implements thermal_protector, which results in all its
To better manage dependencies and improve isolation, you should decouple from con-
public instance methods being backed by interfaces. Listing 4.7 shows its refactored
crete classes and focus on the abstraction that the class presents. In this way, replacing
PUBLIC SECTION.
implementation details with alternative implementations, like mock instances for
testing, will be easier.
98 99
4 Methods 4.1 Object-Oriented Programming
CLASS thermal_switch DEFINITION Let’s revisit the fan class we introduced in Chapter 3. Now, let’s say we have a new
FINAL requirement to create a fan subclass that steps over multiple values when its intensity
PUBLIC. is changed. We can redefine the appropriate methods with the desired implementa-
tion, as shown in Listing 4.8.
PUBLIC SECTION.
CLASS step_fan DEFINITION 4
INTERFACES: PUBLIC
switchable, FINAL
thermal_protector. INHERITING FROM fan.
The resulting Unified Modeling Language (UML) design is shown in Figure 4.1, which ENDCLASS.
shows that a thermal_switch is both a thermal_protector and a switchable.
CLASS step_fan IMPLEMENTATION.
Within a subclass, you can redefine instance methods that are not final and have a spe- ENDCLASS.
cialized implementation for the subclass that should be called in lieu of the superclass
implementation. Listing 4.8 The step_fan Subclass
100 101
4 Methods 4.2 Parameters
The step_fan class shown in Listing 4.8 inherits from fan and redefines the methods Some invocation keywords are optional depending on how the method is declared and
increase_intensity and decrease_intensity to execute them in a certain number of called. In this section, we’ll cover guidelines on parameter declarations. Section 4.4 will
steps. Note how the methods are declared again with the REDEFINITION keyword. The discuss guidelines for method invocation.
redefined methods can then call the corresponding superclass version with the super->
syntax. Note also that the constructor is required to call the superclass constructor as 4
4.2.1 How Many Input Parameters Are Too Many?
its first statement.
Let’s look at the input parameters for the method declaration shown in Listing 4.9.
METHODS add_item
IMPORTING
4.2 Parameters product TYPE REF TO product
quantity TYPE quantity.
Method parameters fall broadly into three kinds or categories: input, output, and
Listing 4.10 Minimized Number of Input Parameters
input-output parameters.
Input parameters are declared with the IMPORTING keyword. Output parameters can be Too many input parameters may also be an indication that the method does more than
declared as EXPORTING parameters or as a single RETURNING parameter. Input-output one thing. More information on this topic is found in Section 4.3.1.
parameters are declared with the CHANGING keyword.
One common source of confusion for novice ABAP developers is that, apart from the Aim for as Few Input Parameters as Possible
CHANGING keyword, these keywords have other keywords as counterparts when invoking The number of input parameters for a method can significantly affect how usable and
methods, as listed in Table 4.1. understandable the method is to callers, the complexity of its internal implementa-
tion, and how hard it is to test it. In general, the less input parameters a method has,
Declaration Invocation
the easier it is to consume it, understand its operation, and test it.
IMPORTING EXPORTING Minimize the number of IMPORTING parameters to your methods. Most methods
EXPORTING IMPORTING should have less than three input parameters. Three or more parameters makes the
sheer number of possible parameter value combinations harder to use and test.
RETURNING RECEIVING
CHANGING CHANGING
4.2.2 Optional Input Parameters
Table 4.1 Parameters Declaration and Invocation Counterparts
ABAP does not support method overloads, which occur when methods with the same
name exist that only differ in their parameters. As a result, optional parameters, which
102 103
4 Methods 4.2 Parameters
are parameters marked with the modifier OPTIONAL, have historically been used to con- METHODS to_csv
trol different behaviors within methods. IMPORTING
separator TYPE string DEFAULT `,`
A typical example is a method that processes either a table of items or a single item, as
RETURNING
shown in Listing 4.11.
...
4
METHODS process
Listing 4.13 Parameter with Default Value
IMPORTING
item_to_process TYPE item OPTIONAL
items_to_process TYPE item_table OPTIONAL. 4.2.3 Preferred Input Parameters
Listing 4.11 Mutually Exclusive Optional Parameters If all input parameters to a method are optional, either by marking them as OPTIONAL or
using a default value, then one of them can be annotated as a PREFERRED PARAMETER, as
This kind of method signature is confusing to the caller and harder to implement. What shown in Listing 4.14.
is not clear is which parameters are required, which combinations of parameters are
METHODS to_csv
valid, and which parameters are mutually exclusive. The implementation must check
IMPORTING
for all valid combinations and fail or branch accordingly.
separator TYPE string DEFAULT `,` PREFERRED PARAMETER
quote type string DEFAULT `"`
Split the Behavior Instead of Adding Optional Parameters RETURNING
Different behaviors should be implemented in different methods (see Section 4.3.1). ...
Separate methods with properly chosen names and specific parameters for each case
Listing 4.14 Method with Preferred Parameter
should be created. Using separate methods provides clear guidance for which parame-
ter combinations are valid and expected and are easier to implement.
When calling a method with a parameter marked as a PREFERRED PARAMETER and provid-
ing a single parameter, you don’t need to name the parameter at the call site; the pre-
For the example shown in Listing 4.11, separating the functionality results in the meth- ferred parameter will automatically be used. Thus, when calling the to_csv method
ods shown in Listing 4.12. defined in Listing 4.14 with a single parameter, that parameter, if not named, will be
METHODS: bound to the preferred parameter, for instance, in the following call:
Default parameter values, which are accomplished by annotating a parameter with the
Use a Preferred Parameter Sparingly
DEFAULT modifier and including a default value, should be used to advertise that the
Only use a PREFERRED PARAMETER if the method name and its preferred parameter are
parameter is optional for the caller, but not for the method, which will use the default
clear and easy to understand when the method is being called, especially when omit-
value if one is not provided. For an example of a default parameter, look at the to_csv
ting the parameter name (see also Section 4.4.4).
method in Listing 4.13. The parameter separator is optional and, if not assigned by the
caller, will have the value `,` (a comma) by default.
104 105
4 Methods 4.2 Parameters
Imagine you have a credit score service class that provides a method for calculating the
IF use_strong_heuristics = abap_true.
credit score of a customer. The definition of this class is shown in Listing 4.15, where the
" use a slower but more robust algorithm....
calculate_credit_score method uses a Boolean parameter to control whether to use
strong heuristics in the calculation. 4
ELSE.
CLASS credit_score_service DEFINITION " use a faster but less robust algorithm....
PUBLIC
FINAL. ENDIF.
constructor When a method takes a Boolean input parameter, usually the method does two things
IMPORTING customer TYPE REF TO customer, instead of one (see also Section 4.3.1).
calculate_simple_credit_score
The calculate_credit_score method can be called in the following way:
RETURNING VALUE(credit_score) TYPE int4,
DATA(my_credit_score) =
my_credit_score_service->calculate_credit_score( abap_true ). calculate_complex_credit_score
RETURNING VALUE(credit_score) TYPE int4.
In this code, what that Boolean parameter means in the call is not clear. You can allevi-
ate this problem by naming the parameter (see Section 4.4.4), as in the following code: Listing 4.17 Separate Methods Instead of a Branching Method
DATA(my_credit_score) = In this way, not only is implementing each method individually easier, consuming
my_credit_score_service->calculate_credit_score( those methods separately is also easier. If needed, common code within the original
use_strong_heuristics = abap_true ). method could be refactored into supporting private methods.
This version improves things a bit even though the burden is on the client to use this You can even go a step further and create separate classes for each scenario. For our
style. Moreover, an issue with the semantics of the method still exists. credit score service, we could have an interface with a simple calculate_credit_score
method with a separate class implementing each algorithm. Thus, even the decision of
It’s not hard to imagine that the implementation of calculate_credit_score will look
which algorithm to use is lifted from client code. The client code itself would only
something like the code shown in Listing 4.16.
depend on the interface and its simpler method.
106 107
4 Methods 4.2 Parameters
4.2.5 EXPORTING Parameters If the output parameters of your method do not form a logical entity, split the method
Results that a method provides to the caller can be declared either as EXPORTING param- into several focused methods. If they do form a logical entity, group parameters into a
eters or a single RETURNING parameter. more cohesive structure or a class and use this structure to minimize the number of
EXPORTING parameters.
EXPORTING parameters allow you to define multiple outputs from a method, as shown in
4
Listing 4.18.
For the check_business_partners method, the output parameters form a logical entity,
METHODS check_business_partners
a check result, which could be made explicit as a check_result structure. Then, the
IMPORTING
check_result structure can be used to type the now single EXPORTING parameter of the
business_partners TYPE business_partners
method, as shown in Listing 4.20.
EXPORTING
result TYPE result_type TYPES:
failed_keys TYPE /bobf/t_frw_key BEGIN OF check_result,
messages TYPE /bobf/t_frw_message. result TYPE result_type,
failed_keys TYPE /bobf/t_frw_key,
Listing 4.18 Multiple EXPORTING Parameters
messages TYPE /bobf/t_frw_message,
END OF check_result.
The check_business_partners method can validate a list of business partners provided
in the input parameter business_partners. The outcome of this validation is returned
METHODS check_business_partners
in three output parameters: result is the overall status of the validation, failed_keys is
IMPORTING
a table of the business partner keys that failed validation, and messages is a list of mes- business_partners TYPE business_partners
sages generated as part of the validation. EXPORTING
EXPORTING parameters are optional for the caller, so when calling check_business_part- result TYPE check_result.
ners, you can capture the output parameters that you’re interested in, as shown in List-
Listing 4.20 Minimizing EXPORTING Parameters
ing 4.19.
check_business_partners( Note that this approach is still not the cleanest way to declare check_business_partners,
EXPORTING which we’ll explore next.
business_partners = my_business_partners
IMPORTING
4.2.6 RETURNING Parameters
result = DATA(business_partners_check_result)
messages = DATA(business_partner_messages) ). RETURNING parameters allow you to declare a single RETURNING parameter for a method,
which can be thought of as the result of the method call.
Listing 4.19 Invoking a Method with EXPORTING Parameters
The last iteration of our check_business_partners method shown in Listing 4.20 ended
Note how you need to provide the counterpart keywords to the declaration of IMPORTING up with a single EXPORTING parameter. Calling that method is shown in Listing 4.21.
and EXPORTING parameters, which flips them to EXPORTING and IMPORTING, respectively.
check_business_partners(
EXPORTING
Minimize the Number of EXPORTING Parameters business_partners = my_business_partners
The presence of many EXPORTING parameters is an indication that your method might IMPORTING
be doing more than one thing, which makes the method harder to implement and result = DATA(business_partners_check_result) ).
harder to consume. A good method does one thing (Section 4.3.1), and that sharp focus Listing 4.21 Calling a Method with a Single EXPORTING Parameter
should be reflected by the outputs of the method as well.
108 109
4 Methods 4.2 Parameters
Listing 4.22 shows the final refactoring of the definition of the check_business_partners For example, let’s say you have many entities that need to be validated, and you want
method, in which the EXPORTING parameter is changed to a RETURNING parameter. to collect all their validation messages in a single message table. You can use the exam-
ple method shown in Listing 4.23 in your entity classes.
METHODS check_business_partners
IMPORTING METHODS validate
business_partners TYPE string CHANGING
RETURNING messages TYPE message_table.
VALUE(result) TYPE check_result. Listing 4.23 CHANGING Parameter Declaration
Listing 4.22 RETURNING Parameter Declaration
This instance method will validate the current entity and append any generated valida-
Calls to check_business_partners are much cleaner, as in the following code: tion messages to the collecting parameter messages, which is an internal table of mes-
sages. The messages parameter could already contain messages (perhaps added earlier
DATA(business_partners_check_result) =
by other validation methods), and as a result, by using the same variable in a number
check_business_partners( my_business_partners ).
of validate calls, all the generated messages will be collected in the parameter, as shown
in Listing 4.24.
Consider Using result as the Name of RETURNING Parameters
The ability to name a RETURNING parameter is not a common capability in many main- Use CHANGING Parameters Sparingly
stream programming languages. In those languages, a method simply returns the out- CHANGING parameters should be reserved for cases where an existing structure or inter-
put with a special statement, for example, return 42. nal table that is potentially already filled with data is changed, like messages in the val-
Good method names obviate the need to name the RETURNING parameter. The RETURN- idate method example.
ING parameter name would do little more than parrot the method name or repeat Use input parameters for object references that you work with, since your method can
something obvious, perhaps even create conflict with other members of the class. still call instance methods on the parameter to change its internal state.
Consumers also rarely refer to the RETURNING parameter name when invoking your If you fill up or replace the parameter completely (i.e., you assign a new value to the
method. They either assign the result of the method to a variable, use it as part of a parameter), an EXPORTING parameter or a RETURNING parameter is more appropriate.
larger expression, or ignore the result altogether.
110 111
4 Methods 4.2 Parameters
DATA messages TYPE message_table. ABAP has important optimizations for value copy semantics. When a value is assigned
LOOP AT entities INTO DATA(entity). to another variable or parameter, a copy is only made when needed, usually when
entity->validate( CHANGING messages = messages ). changing something in the copy. This approach is commonly referred to as copy-on-
ENDLOOP. write optimization.
Listing 4.24 CHANGING Parameter Usage Pass-by-reference is when a reference to the original value is passed to the method. If 4
the method can reassign the value, the calling method will also be impacted by the
To eliminate the CHANGING parameter of the validate method, you can introduce a class change.
that represents a message container, which will collect messages and also provide
Pass-by-reference is the default for IMPORTING, EXPORTING, and CHANGING parameters.
many more convenient methods for a list of messages. As an example, look at the mes-
Pass-by-value is the only accepted option for RETURNING parameters. As a result, you’ll
sage_container class in Listing 3.16, discussed in Chapter 3, Section 3.1.3.
always see the VALUE modifier in RETURNING parameters. This modifier can also be used
The refactored validate method should look like Listing 4.25. for other parameter categories to make them pass-by-value.
METHODS validate Although rarely used, the syntax for pass-by-reference can also be made explicit with
IMPORTING the REFERENCE modifier. For example, the code shown earlier in Listing 4.10 can be
message_container TYPE ref to message_container. rewritten into the code shown in Listing 4.27.
Listing 4.25 Refactored CHANGING Parameter to IMPORTING Reference METHODS add_item
IMPORTING
This version is also easier to consume since the method now doesn’t have a CHANGING REFERENCE(product) TYPE REF TO product
parameter, as in Listing 4.26. REFERENCE(quantity) TYPE quantity.
4.2.8 Pass-by-Value and Pass-by-Reference To make the quantity parameter shown in Listing 4.27 pass-by-value, you can end up
Apart from the input or output category of parameters, you can also declare parame- with the declaration shown in Listing 4.28.
ters to be pass-by-value or pass-by-reference. METHODS add_item
Pass-by-value is when a copy of the parameter value is made before calling the method, IMPORTING
and the method parameter is assigned to that copy. Note that, when you pass an object REFERENCE(product) TYPE REF TO product
reference by value, a copy of the reference is made, which is just a pointer that points to VALUE(quantity) TYPE quantity.
the same object in memory. Listing 4.28 Pass-by-Value Input Parameter
112 113
4 Methods 4.3 Method Body
...
Mind the Semantics of EXPORTING Parameters, Prefer Pass-By-Value
Parameters passed by reference ultimately point to existing memory areas that may ENDMETHOD.
have already been filled. EXPORTING parameters that are passed by reference will retain Listing 4.30 Initializing EXPORTING Parameters
their original value before the method was called. This makes them work like CHANGING 4
parameters (Section 4.2.7). If you change the EXPORTING parameters to pass-by-value, as shown in Listing 4.31, the
To make an EXPORTING parameter passed by reference behave like a true output param- parameters will be initial by default when entering the method, and there’ll be no need
eter, it’s important to actually assign a value to it. It might make sense to clear the to clear or assign them to their initial value.
value at the beginning of the method if the parameter could end up unassigned, per-
haps because of the method logic or an exception that is raised early on. METHODS try_parse_int
IMPORTING
Another option is to make the EXPORTING parameter into a pass-by-value parameter,
text TYPE string
which will make it behave like a RETURNING parameter. EXPORTING parameters that are
EXPORTING
passed by value are handed over as new, separate memory areas that are empty.
VALUE(success) TYPE abap_bool
There’s no need to preemptively clear them, just like there’s no need to clear RETURNING
VALUE(result) TYPE int4.
parameters.
Therefore, prefer pass-by-value EXPORTING parameters. Listing 4.31 Pass-by-Value EXPORTING Parameters
METHOD try_parse_int.
4.3.1 Do One Thing
success = abap_false. To be easier to read, test, and maintain, a method should not only have a single respon-
clear result. sibility, but it should perform that responsibility in the simplest way possible. A
method should do one thing, and only one thing.
114 115
4 Methods 4.3 Method Body
Many clean ABAP rules we discuss in this book help make your methods more focused log_line( line ).
and closer to the goal of doing only one thing. A method probably only does one thing ENDLOOP.
if it follows the following rules:
" move to the previous exception
쐍 It has a small number of input parameters.
current_exception = current_exception->previous.
쐍 It doesn’t include Boolean parameters. 4
IF current_exception IS BOUND.
쐍 It has exactly one output parameter. log_line( `---- Exception has previous exception` ).
쐍 It only throws one type of exception. ENDIF.
ENDWHILE.
쐍 It is small.
ENDMETHOD.
쐍 It stays at a single level of abstraction.
Listing 4.33 log_exception First Implementation
쐍 You cannot extract other meaningful methods.
쐍 You cannot meaningfully group its statements into sections. The supporting log_line method logs a single line of text to the log file, and the split_
Let’s start by looking at the definition of a method for logging exceptions, as shown in text_into_lines method splits a long text into multiple lines using a fixed number of
Listing 4.32. columns for each line. This method returns a table of strings representing the lines.
Even though the log_exception method has a single responsibility, many steps are
METHODS
needed to perform its tasks, for instance, the following:
log_exception
IMPORTING 1. Store the exception in a local variable.
exception_instance TYPE REF TO cx_root. 2. Start a loop while the exception is bound (not null).
Listing 4.32 Definition of a Method to Log Exceptions 3. Get the class name of the exception.
4. Log a header including the class name.
The log_exception method will be used by some batch processing code whenever the
5. Split the exception text into lines.
batch processing program encounters an exception. The code will call log_exception to
6. Loop and log each line.
write information about the exception_instance to a log file and then abort the batch
process. Log files only accept a maximum number of characters per line. A user can 7. Move to the previous exception.
later read these logs and get more information about the exception to determine what 8. Repeat the first loop.
went wrong with the processing.
These steps hint at many things that the method does: It loops to log the previous
Our first implementation of the log_exception method is shown in Listing 4.33. exception, queries the exception class name, and splits the exception text into lines.
METHOD log_exception. The next section will discuss a clean ABAP rule that improves the log_exception
DATA(current_exception) = exception_instance. method until the method finally does only one thing in as few steps as possible.
WHILE current_exception IS BOUND.
" log a header with the exception class name
4.3.2 Descend One Level of Abstraction
DATA(class_name) =
cl_abap_classdescr=>get_class_name( current_exception ). A method should tell a story that’s easy to follow and understand. Its body should stay
log_line( at the same level of abstraction, which is just below the responsibility denoted by its
|---- Exception occurred: { class_name }| ). name.
If more details of the story are needed, you can delve into the methods called by the
" split the exception text into lines and log them
first method until one of two things happen. Either you’ll reach basic statements of the
DATA(exception_text) = current_exception->get_text( ).
language that implement some low-level algorithm, or you’ll reach a method call that
DATA(lines) = split_text_into_lines( exception_text ).
belongs to an interface.
LOOP AT lines into data(line).
116 117
4 Methods 4.3 Method Body
Either way, you should have a complete understanding of how a part of your code does and splitting the exception text into lines is at a level of abstraction below the level
its work and whether the code coordinates with other dependencies. For more infor- we’re interested in. We’re talking about details we’re not ready to delve into just yet.
mation on class design and the crucial role of interfaces, check out Chapter 3. Taking a step back and thinking about what the method should accomplish, we might
That’s the beauty of well-crafted abstractions. The design is decoupled enough that you come up with the following steps, which are at the same level of abstraction:
only need to understand the parts of the system that you currently require. You won’t 4
1. Log a header for the exception.
need to read the whole codebase to understand what a certain part of the system does.
2. Log a body for the exception.
3. Log the previous exception, if any.
Descend One Level of Abstraction
Statements in a method should be one level of abstraction below the method name This series of steps will translate into the final methods shown in Listing 4.34.
itself. All these statements should be on the same level of abstraction. METHOD log_exception.
This rule is called the “Stepdown Rule” in the book Clean Code: A Handbook of Agile log_exception_header( exception_instance ).
Software Craftsmanship (Pearson, 2008) and called the “Single Level of Abstraction log_exception_body( exception_instance ).
Principle (SLAP)” in the book The Productive Programmer (O’Reilly, 2008). The concept log_previous_exception( exception_instance->previous ).
probably first appeared in the book Smalltalk Best Practice Patterns (Prentice Hall, ENDMETHOD.
1996), where it was called the “Composed Method Pattern.”
METHOD log_exception_header.
DATA(class_name) =
How can you keep a method focused on a single level of abstraction? One approach is cl_abap_classdescr=>get_class_name( exception_instance ).
to explain what the method does in a few sentences or steps, which should all be log_text(
related to its goal. These steps should not go into more detail than is needed to under- |---- Exception occurred: { class_name }| ).
stand the responsibility of the method. The steps then should become the downstream ENDMETHOD.
methods the method calls or the statements it executes.
METHOD log_exception_body.
DATA(exception_text) = exception_instance->get_text( ).
Extract Method Refactoring log_text( exception_text ).
The extract method refactoring is a fundamental refactoring approach presented in ENDMETHOD.
the book Refactoring: Improving the Design of Existing Code (Addison-Wesley, 1999).
METHOD log_previous_exception.
You extract cohesive parts of a method into new methods, which are then called by the
CHECK exception_instance IS BOUND.
original method in the place from which the functionality was extracted.
log_text( `---- Exception has previous exception` ).
This refactoring is supported by ABAP Development Tools (ADT). Select the section of a log_exception( exception_instance ).
method you want to extract and press (Alt)+(Shift)+(M) on Windows or ENDMETHOD.
(Cmd)+(Alt)+(M) on macOS to start the extract method refactoring wizard.
METHOD log_text.
DATA(lines) = split_text_into_lines( text ).
The log_exception method shown previously in Listing 4.33 is divided into sections of
log_lines( lines ).
statements with separate responsibilities, delimited by clarifying comments. The sec-
ENDMETHOD.
tion comments in the method describe the following steps:
1. Log a header with the exception class name. METHOD log_lines.
LOOP AT lines INTO DATA(line).
2. Split the exception text into lines and log them.
log_line( line ).
3. Move to the previous exception (and repeat). ENDLOOP.
ENDMETHOD.
Not all these sections are at the same level of abstraction. We want to know at a high-
level what it means to log an exception. Details about getting the exception class name Listing 4.34 Each Method at a Single Level of Abstraction
118 119
4 Methods 4.3 Method Body
These methods are now each at the same level of abstraction and one level below the clsdeferrd TYPE vseocdefer,
responsibility implied by their names. intdeferrd TYPE vseoidefer,
new_clskey_save TYPE seoclskey.
Apart from making your methods simple and easy to understand, breaking down
methods in this way might unearth interesting possibilities in the design. Whole new Listing 4.35 Too Many Data Declarations: A Prelude to a Huge Method
classes and subfeatures that were tangled up in the code may come to light and provide 4
you with an enriched vocabulary for your project. Your design becomes less coupled,
more cohesive, and much cleaner. Keep Methods Small
You can start thinking about logging the exception body, not just logging the excep- How small a method should be can’t be easily quantified. Methods should be as small
tion text. This approach might mean, later on, that you’ll also include the exception as possible, but not smaller.
stack trace with the text. You might start to think how to separate the formatting from As a rule of thumb, methods should have less than 20 statements, but optimally 5
the logging, and a whole new exception_formatter class or interface, with its own set of statements or less. Note that we’re measuring in statements, not lines of code.
responsibilities, might emerge. Using the rules in this chapter, like the single level of abstraction principle, and extract-
ing meaningful methods to create new, smaller methods will get you closer to this
goal.
4.3.3 Keep Methods Small
ABAP is a notoriously verbose language. Coupled with a ton of legacy code, you may Look at the original log_exception method shown earlier in Listing 4.33. You might
find gargantuan methods or function modules spanning thousands of lines of code. have thought this method was reasonably sized. However, as shown earlier in Listing
These sprawling methods are hard to understand, never mind debug and change. 4.34, still many cohesive parts could be made into simpler methods. The resulting
When you’re confronted with a data declaration section as big as the code shown in methods were much smaller than the original and much cleaner. The resulting log_
Listing 4.35, you already know this method does way more than one thing. exception method reads like the steps it implements. You can read it and understand
DATA: what it does at a high-level quickly without even delving into the other methods.
class TYPE vseoclass, Now, look at the log_exception_body method, shown in Listing 4.36.
attributes TYPE seoo_attributes_r,
methods TYPE seoo_methods_r, METHOD log_exception_body.
events TYPE seoo_events_r, DATA(exception_text) = exception_instance->get_text( ).
types TYPE seoo_types_r, log_text( exception_text ).
aliases TYPE seoo_aliases_r, ENDMETHOD.
implementings TYPE seor_implementings_r, Listing 4.36 The log_exception_body Method
inheritance TYPE vseoextend,
friendships TYPE seof_friendships_r, You might think you can still extract another method from it, resulting in the code
typepusages TYPE seot_typepusages_r, shown in Listing 4.37.
clsdeferrds TYPE seot_clsdeferrds_r,
intdeferrds TYPE seot_intdeferrds_r, METHOD log_exception_body.
attribute TYPE vseoattrib, log_exception_text( exception_instance ).
method TYPE vseomethod, ENDMETHOD.
event TYPE vseoevent,
type TYPE vseotype, METHOD log_exception_text.
alias TYPE seoaliases, DATA(exception_text) = exception_instance->get_text( ).
implementing TYPE vseoimplem, log_text( exception_text ).
friendship TYPE seofriends, ENDMETHOD.
typepusage TYPE vseotypep, Listing 4.37 The Extracted log_exception_text Method Is Redundant
120 121
4 Methods 4.3 Method Body
A new log_exception_text method could have a place, perhaps if log_exception_body The step_fan constructor first calls the superclass constructor and then validates its
did more than just log the exception text. At this point, however, the new method is input parameter and raises an exception right away if it’s invalid. It’s important to add
simply a reiteration of the old one and doesn’t add much semantic value over the exist- as much information to the exception as possible. In this case, the custom invalid_
ing method. argument_exception includes the argument name and the invalid argument value.
Stop extracting methods when you feel comfortable that the method expresses its 4
intent clearly and simply through its statements. Focus on the Happy Path or Error Handling
A method body should emphasize the happy path it’s built for. If it needs to perform
error handling, it’s important that this error handling code doesn’t divert attention
4.3.4 Fail Fast
from the main intent of the method. If it does, put the error handling code in a dedi-
Often, when an error occurs or an exception is thrown, the root cause of the problem cated method. For more information on this topic, refer to Chapter 11.
can be traced to some parameter having an invalid value introduced earlier in the pro-
gram flow. The closer that exception is to the place the error was introduced, the easier
As it stands, the step_fan constructor error handling code dominates its logic. It makes
the error is to find and fix.
sense to break it down so that it’s more readable, as shown in Listing 4.39.
METHOD constructor.
Fail Fast
super->constructor( ).
Document and check the input parameters to your methods and fail with an exception validate_step( step ).
as early as possible if they are not valid for the execution of the method. me->step = step.
This recommendation is especially important for public and protected methods. Pri- ENDMETHOD.
vate methods could also benefit from validation (or using ASSERT) should the program
and the assumptions that they make change, but usually you can rely on the validation METHOD validate_step.
already performed by the methods that call them. IF step < 1 OR step > max_intensity.
RAISE EXCEPTION NEW invalid_argument_exception(
Validating later is not only hard to spot and understand but might waste important
argument_name = `step`
resources. Not validating might make your code fail in hard-to-predict ways and might argument_value = step ).
result in invalid data and undesirable behaviors. ENDIF.
ENDMETHOD.
The step_fan class, shown earlier in Listing 4.8, is not validating its step input parame-
Listing 4.39 Separate Error Handling Method
ter to the constructor. This value is used to step over a fixed amount when changing
the fan intensity. A negative value or zero wouldn’t work, and a value that’s bigger than Note that this kind of validation is meant to aid other developers fix their calling code,
the maximum intensity wouldn’t make sense. The code should validate this value and and not for end users, since this validation is very technical in nature. End users could
fail at the earliest possible spot, which is on construction, as shown in Listing 4.38. get business-relevant validation errors in the form of messages that are presented to
METHOD constructor. them. Earlier in Section 4.2.7, Listing 4.26, we presented the code to validate a list of
super->constructor( ). entities. If this is part of a larger method that does some processing with the entities,
IF step < 1 OR step > max_intensity. failing early might mean failing if any of those validations generated an error message.
RAISE EXCEPTION NEW invalid_argument_exception( Adding in some refactoring, we might end up with the code shown in Listing 4.40.
argument_name = `step`
DATA(message_container) = NEW message_container( ).
argument_value = step ).
validate_entities( message_container ).
ENDIF.
message_container->raise_if_in_error( ).
me->step = step.
ENDMETHOD.
...
Listing 4.38 Constructor Validation
Listing 4.40 Raising When a Message Container Has Error Messages
122 123
4 Methods 4.4 Calling Methods
In this case, the message_container class has a method that raises an exception if it con- This step adds another indentation level, which might break the visual flow of the code.
tains any error messages. Validation messages are added to the exception, which could However, how you or your team feel about using CHECK statements is up to you. Com-
be caught by an upper layer and then shown to end users in a suitable manner. For munity discussion might suggest that the statement is so unclear that few people will
example, they could be OData error messages that are then displayed in a message pop- understand its intended behavior.
over in an SAPUI5 application. No matter what you choose, you should not use CHECK outside of the initialization sec- 4
tion of a method. The statement behaves differently in different positions and may
4.3.5 CHECK versus RETURN lead to unclear, unexpected effects.
Another type of validation is when you simply return early if the arguments to a For example, a CHECK statement inside a LOOP ends the current iteration of the loop and
method don’t meet its expectations. In these cases, it’s fine for the method to simply proceeds to the next iteration. In this context, a reader might mistakenly expect the
return instead of raising an exception. CHECK statement to end the method or exit the loop. In this case, we recommend using
an IF statement in combination with CONTINUE instead, since CONTINUE can only be used
Earlier in Listing 4.34, you saw an example of this “return early” behavior for the
inside loops.
method log_previous_exception. If the exception_instance parameter is not bound
(which means that the value is null), the method will return early without completing
its work.
4.4 Calling Methods
Another method that would benefit from this kind of validation is the main log_excep-
tion method itself. If the exception instance is not bound, the method simply returns At this point, we’ve explored many aspects of calling a method in ABAP, from calling
without doing any work, as shown in Listing 4.41. static methods, where you’ll specify the class name using a fat arrow (=>), to calling
instance methods, where’ll you need a reference to an instance of the class and use the
METHOD log_exception.
thin arrow syntax (->).
CHECK exception_instance IS BOUND.
log_exception_header( exception_instance ). Interface methods can be called the same way as class methods if you have a reference
log_exception_body( exception_instance ). pointing to the interface type. If, however, you have a reference to a class and want to
log_previous_exception( exception_instance->previous ). call an interface method on it, you need to add the interface name and a tilde (~) to the
ENDMETHOD. start of the method call. For example, if you have an instance of a thermal_switch
(shown earlier in Listing 4.7) in the my_thermal_switch variable, you can call its interface
Listing 4.41 Check If the Exception Instance Is Bound
method switchable~is_on in the following way:
Both methods now use the CHECK statement. This statement reads perfectly fine but is DATA(is_on) = my_thermal_switch->switchable~is_on( ).
not a common statement and might cause some confusion. What happens when the
check condition evaluates to false might not be clear. The class can also alias the interface method to make the call look like a normal class
instance method call. An example of an aliased interface method and its usage can be
Another way to implement this kind of validation is to use a condition check followed
found in Chapter 3, Section 3.1.2.
by a RETURN statement, as shown in Listing 4.42.
With regard to how parameters are passed to methods, many options are available,
METHOD log_exception. depending on how the method is declared. In this section, we’ll explore some guide-
IF exception_instance IS NOT BOUND. lines to make your method invocations clearer and more readable.
RETURN.
ENDIF.
log_exception_header( exception_instance ). 4.4.1 Passing Input Parameters
log_exception_body( exception_instance ).
Listing 4.43 shows a possible declaration of the method split_text_into_lines, which
log_previous_exception( exception_instance->previous ).
we used earlier in Listing 4.33.
ENDMETHOD.
124 125
4 Methods 4.4 Calling Methods
METHODS: split_text_into_lines(
split_text_into_lines EXPORTING
IMPORTING text = text
text TYPE string columns_per_line = 80
columns_per_line TYPE int4 DEFAULT 40 RECEIVING
4
RETURNING result = DATA(lines) ).
VALUE(lines) TYPE string_table.
Listing 4.46 Using the RECEIVING Keyword
Listing 4.43 split_text_into_lines Declaration
When only providing input parameters to a method and assigning its RETURNING param- Omit the RECEIVING Keyword
eter to a variable, you can simply call the method, as shown in Listing 4.44. The call style using the RECEIVING keyword is unnecessarily verbose and forces you to
specify the EXPORTING keyword for input parameters.
DATA(lines) =
split_text_into_lines( To make the code more readable, omit the RECEIVING keyword and capture the return
text = text value of the method directly.
columns_per_line = 80 ).
Listing 4.44 Calling a Method with Input Parameters and a RETURNING Parameter
The EXPORTING parameters from a method are captured by using the IMPORTING keyword
in a call. You’ve already seen an example of a call like this earlier in Listing 4.19. Another
You can also explicitly annotate the parameter category before the parameter list. In example is shown in Listing 4.47, which calls the try_parse_int method declared earlier
the case of IMPORTING parameters, the caller must use the counterpart keyword EXPORT- in Listing 4.29.
ING (Section 4.2.5), as shown in Listing 4.45. try_parse_int(
DATA(lines) = EXPORTING
split_text_into_lines( text = `42`
EXPORTING IMPORTING
text = text success = DATA(parse_succeeded)
columns_per_line = 80 ). result = DATA(parsed_int) ).
Listing 4.45 Explicitly Using EXPORTING Listing 4.47 Capturing EXPORTING Parameters with the IMPORTING Keyword
Any time an EXPORTING or CHANGING parameter is used, you must declare the parameter
Omit the Optional EXPORTING Keyword category with the proper keyword in the method call. As described earlier in Section 4.2,
EXPORTING parameters are called with the IMPORTING keyword, and CHANGING parameters
When all you have are input parameters and possibly a returning parameter, the
are called with the CHANGING keyword, as shown earlier in Listing 4.24. This rule also
EXPORTING keyword is optional in a method call.
forces you to explicitly define the keyword EXPORTING for IMPORTING parameters.
However, this style is unnecessarily verbose and redundant. Omit the optional EXPORT-
ING keyword in these cases.
4.4.3 The CALL METHOD Construct
Another way to call a method in ABAP is to use a style reminiscent of the way function
4.4.2 Capturing Output Parameters modules are called, with the CALL METHOD construct, as shown in Listing 4.48.
RETURNING parameters can be simply assigned as a value coming out of the method call This call style doesn’t use parentheses around the parameters. With this approach, you
itself, as we’ve seen in Listing 4.44. are forced to declare all keywords for capturing parameters, including the RECEIVING
A RETURNING parameter from a method can also be captured alongside the parameter keyword for a RETURNING parameter.
list by using the RECEIVING keyword on a method call, as shown in Listing 4.46.
126 127
4 Methods 4.4 Calling Methods
4.4.5 Self-Reference
Reserve CALL METHOD for Dynamic Method Calls In the code inside instance methods, the self-reference me is implicitly set by the system
The CALL METHOD construct for calling methods is obsolete and unnecessarily verbose. and can be used to access the current class instance. This self-reference is equivalent to
Use the call style with parentheses to make the code more consistent and easier to the self-reference this in languages like Java and C#.
read and to better support other clean code patterns discussed in this chapter.
Picking up on the version of the log_exception method shown earlier in Listing 4.41, we
Only use the CALL METHOD construct for dynamic method calls, where the class or the could implement the same code by explicitly using the self-reference me, as shown in
method name is resolved at runtime, as in Listing 4.49. Listing 4.50.
CALL METHOD modify->(method_name)
METHOD log_exception.
EXPORTING
CHECK exception_instance IS BOUND.
node = my_bo_c=>node-item
me->log_exception_header( exception_instance ).
key = item->key
me->log_exception_body( exception_instance ).
data = item
me->log_previous_exception( exception_instance->previous ).
changed_fields = changed_fields.
ENDMETHOD.
Listing 4.49 CALL METHOD for Dynamic Method Calls
Listing 4.50 Using the Self-Reference me to Call Instance Methods
However, we recommend you design your application around interfaces and avoid
using dynamic method calls whenever possible.
Omit the Self-Reference When Not Needed
You should omit the self-reference me when calling instance methods or accessing
4.4.4 Optional Parameter Name instance members of the containing class. Using me is redundant and doesn’t add any
When a method has a single non-optional input parameter or a PREFERRED PARAMETER, clarity to the code.
the caller can provide a single unnamed argument for that parameter. This call style, However, if a parameter or a variable name shadows a class instance member, then
when using a properly named variable or constant, can make the calling code more you’re forced to use me to disambiguate, for example, in the step_fan constructor
concise and still clean and readable, as in the following code: shown in Listing 4.51.
car->drive( speed = 50 ).
128 129
4 Methods 4.5 Summary
Then, we took you on a grand tour of how parameters work and how to design them,
while exploring the following recommendations:
쐍 Aim for as few input parameters as possible.
쐍 Split the behavior instead of adding optional parameters.
쐍 Use a preferred parameter sparingly.
쐍 Create separate methods instead of using Boolean parameters.
쐍 Minimize the number of EXPORTING parameters.
쐍 Prefer RETURNING to EXPORTING.
쐍 Consider using result as the name of RETURNING parameters.
쐍 Use CHANGING parameters sparingly.
쐍 Avoid using more than one kind of output parameter.
쐍 Do not reassign IMPORTING parameters passed by value.
쐍 Mind the semantics of EXPORTING parameters, prefer pass-by-value.
쐍 Pass-by-value CHANGING parameters don’t make sense.
In Section 4.3, we delved into some important considerations when designing the body
within methods:
쐍 A method should do one thing, and only one thing.
쐍 Descend one level of abstraction.
쐍 Keep methods small.
쐍 Fail fast.
쐍 Focus on the happy path or error handling.
Finally, we ended this chapter with a discussion of several clean ABAP aphorisms
related to invoking methods:
쐍 Omit the optional EXPORTING keyword.
130 131
Contents
Foreword .................................................................................................................................................. 21
SAP S/4HANA: A New ERP Platform ................................................................................................ 23
PART I Foundation
7
Contents Contents
2.2 ABAP RESTful Application Programming Model ..................................................... 49 4.3.5 Use Case Examples ................................................................................................ 109
2.2.1 Defining and Developing Business Objects ................................................... 49 4.3.6 Intelligent Situation Automation ..................................................................... 110
2.2.2 Defining Business Services .................................................................................. 56 4.3.7 Message-Based Situation Handling ................................................................. 111
2.2.3 Runtime Architecture ............................................................................................ 59 4.4 Summary ................................................................................................................................... 111
2.3 Summary ................................................................................................................................... 66
5 Extensibility 113
3 Simplified Experience 67
5.1 Key User Extensibility .......................................................................................................... 113
3.1 User Experience ...................................................................................................................... 67 5.1.1 Stability Criteria for Extensibility ...................................................................... 114
3.1.1 SAP Fiori ..................................................................................................................... 67 5.1.2 Principles of In-App Key User Extensibility .................................................... 116
3.1.2 User Experience Adoption Strategy ................................................................. 68 5.1.3 Field Extensibility ................................................................................................... 117
3.1.3 SAP Fiori Launchpad .............................................................................................. 69 5.1.4 Integration Extensibility ...................................................................................... 119
3.1.4 SAP Fiori Apps .......................................................................................................... 72 5.1.5 Custom Business Logic ......................................................................................... 119
3.1.5 SAP Fiori Elements Apps ....................................................................................... 74 5.1.6 Custom Business Objects .................................................................................... 121
5.1.7 Custom CDS views ................................................................................................. 122
3.2 Search ......................................................................................................................................... 77
5.1.8 Lifecycle Management ......................................................................................... 122
3.2.1 Search Architecture ............................................................................................... 77
3.2.2 Enterprise Search Extensibility .......................................................................... 80 5.2 Side-by-Side Extensions ..................................................................................................... 123
5.2.1 Introduction to Cloud-Native Applications ................................................... 124
3.3 Summary ................................................................................................................................... 82
5.2.2 SAP Cloud Platform and Programming Models ........................................... 128
5.2.3 Cloud Foundry Environment ............................................................................... 128
5.2.4 Kyma Runtime ......................................................................................................... 128
4 Intelligence and Analytics 83 5.2.5 Integrating with SAP S/4HANA Using the SAP Cloud SDK ....................... 129
5.3 Summary ................................................................................................................................... 134
4.1 Analytics .................................................................................................................................... 83
4.1.1 SAP S/4HANA Embedded Analytics Architecture Overview .................... 84
4.1.2 Embedded Analytical Applications ................................................................... 87
4.1.3 Modeling Analytical Artifacts ............................................................................. 88 6 Integration 137
4.1.4 Analytics Extensibility ........................................................................................... 89
4.1.5 Enterprise Analytics Applications ..................................................................... 91 6.1 SAP S/4HANA Integration Interface Technologies ................................................. 137
6.1.1 OData Services ........................................................................................................ 137
4.2 Machine Learning .................................................................................................................. 92
6.1.2 SOAP Services ........................................................................................................... 138
4.2.1 Machine Learning Architecture ......................................................................... 93
6.1.3 Remote Function Call ............................................................................................ 138
4.2.2 Embedded Machine Learning ............................................................................. 94
6.1.4 BAPIs ........................................................................................................................... 138
4.2.3 Side-By-Side Machine Learning Architecture ................................................ 96
6.1.5 IDoc ............................................................................................................................. 138
4.2.4 Machine Learning in SAP S/4HANA Applications ........................................ 97
6.1.6 SAP S/4HANA API Strategy .................................................................................. 139
4.3 Intelligent Situation Handling ......................................................................................... 100
6.2 SAP API Business Hub .......................................................................................................... 139
4.3.1 Example: Contract is Ready as Source of Supply ......................................... 101
4.3.2 Technological Background .................................................................................. 102 6.3 Interface Monitoring and Error Handling with SAP Application
4.3.3 Intelligent Situation Handling Concept .......................................................... 104 Interface Framework ............................................................................................................ 140
4.3.4 User Experience ...................................................................................................... 105
8 9
Contents Contents
6.4 Communication Management in SAP S/4HANA Cloud ........................................ 142 8.1.2 Product Hierarchy ................................................................................................... 180
6.4.1 Communication Scenario .................................................................................... 144 8.1.3 Data Migration ........................................................................................................ 182
6.4.2 Communication User ............................................................................................ 144 8.1.4 Product SOAP Service API ..................................................................................... 183
6.4.3 Communication System ....................................................................................... 145 8.1.5 Product Master Extensibility .............................................................................. 183
6.4.4 Communication Arrangement .......................................................................... 145 8.1.6 Self-Service Configuration ................................................................................... 184
6.4.5 Calling Inbound Services with User Propagation ........................................ 145 8.2 Bill of Materials, Characteristics, and Configurations .......................................... 185
6.5 Cloud Connector ..................................................................................................................... 146 8.2.1 Bill of Materials (BOM) ......................................................................................... 185
6.5.1 Cloud Connector Principles ................................................................................. 146 8.2.2 Classification System ............................................................................................ 187
6.5.2 RFC Communication with SAP S/4HANA Cloud ........................................... 148 8.2.3 Variant Configuration ........................................................................................... 188
8.2.4 Variant Classes ........................................................................................................ 190
6.6 Integration Middleware ..................................................................................................... 148
8.2.5 Super BOM ................................................................................................................ 190
6.7 Event-Based Integration .................................................................................................... 150 8.2.6 BOM with Class Items ........................................................................................... 191
6.7.1 SAP Cloud Platform Enterprise Messaging .................................................... 151 8.2.7 Variant Configuration Profiles ........................................................................... 191
6.7.2 Business Events Architecture in SAP S/4HANA ............................................ 152 8.2.8 Object Dependencies in Variant Configuration ........................................... 191
6.7.3 Business Events in SAP S/4HANA ...................................................................... 153 8.2.9 User Interface and Grouping .............................................................................. 192
6.7.4 Event Channels and Topic Filters ...................................................................... 154 8.2.10 Extensibility .............................................................................................................. 192
6.8 Data Integration .................................................................................................................... 154 8.2.11 High-Level and Low-Level Configuration ....................................................... 192
6.8.1 CDS-Based Data Extraction ................................................................................. 155 8.2.12 Embedded Analytics for Classification and Configuration Data ............ 193
6.8.2 Data Replication Framework .............................................................................. 157 8.3 Business Partner ..................................................................................................................... 195
6.8.3 Master Data Integration Services ..................................................................... 158 8.3.1 Architecture of Business Partner Master Data ............................................. 196
6.9 Summary ................................................................................................................................... 159 8.3.2 SAP S/4HANA System Conversion Scenarios ................................................ 201
8.3.3 Data Protection and Policy .................................................................................. 203
8.3.4 Extensibility .............................................................................................................. 203
8.3.5 Business Partner APIs ............................................................................................ 204
7 Data Protection and Privacy 161
8.4 Summary ................................................................................................................................... 205
7.3 Summary ................................................................................................................................... 169 9.2 Sales Documents Structure ............................................................................................... 209
8.1 Product Master ....................................................................................................................... 175 9.8 Claims, Returns, and Refund Management ............................................................... 215
8.1.1 Product Master Data Model ................................................................................ 176
10 11
Contents Contents
12 13
Contents
12.6.4 Serial Number Management .............................................................................. 286 14.5 Financial Planning and Analysis ..................................................................................... 330
12.6.5 Inter-/Intracompany Stock Transport ............................................................. 287 14.5.1 Budgetary Accounting .......................................................................................... 330
12.7 Logistics Integration Scenarios ........................................................................................ 287 14.5.2 Predictive Accounting ........................................................................................... 332
12.7.1 Warehouse Management ................................................................................... 287 14.5.3 Financial Planning .................................................................................................. 336
12.7.2 Manufacturing Execution Systems .................................................................. 288 14.5.4 Margin Analysis ....................................................................................................... 340
14.5.5 Overhead Cost ......................................................................................................... 342
12.8 Summary ................................................................................................................................... 288
14.5.6 Production Cost ....................................................................................................... 344
14.6 Payables Management ....................................................................................................... 347
14.6.1 Supplier Invoicing ................................................................................................... 347
13 Extended Warehouse Management 289 14.6.2 Open Payables Management ............................................................................. 348
14.6.3 Automatic Payment Processing ......................................................................... 348
13.1 Architecture Overview ........................................................................................................ 289 14.7 Receivables Management ................................................................................................. 349
13.2 Organizational Structure ................................................................................................... 291 14.7.1 Open Receivables Management ........................................................................ 350
14.7.2 Credit Evaluation and Management ............................................................... 354
13.3 Master Data ............................................................................................................................. 292
14.7.3 Customer Invoicing ................................................................................................ 357
13.4 Stock Management .............................................................................................................. 292 14.7.4 Dispute Resolution ................................................................................................. 358
13.5 Application Components ................................................................................................... 294 14.7.5 Collection Management ...................................................................................... 360
14.7.6 Convergent Invoicing ............................................................................................ 361
13.6 Monitoring and Reporting ................................................................................................. 297
14.7.7 Contract Accounting ............................................................................................. 365
13.7 Process Automation ............................................................................................................. 297
14.8 Treasury Management ........................................................................................................ 369
13.8 User Interface .......................................................................................................................... 298 14.8.1 Advanced Payment Management .................................................................... 370
13.9 Technical Frameworks ......................................................................................................... 299 14.8.2 Bank Integration Using SAP Multi-Bank Connectivity ............................... 372
14.8.3 Connectivity to Payment Service Providers and Payment Gateways ... 374
13.10 Warehouse Automation ..................................................................................................... 300
14.8.4 Cash Management ................................................................................................. 375
13.11 Summary ................................................................................................................................... 300 14.8.5 Treasury and Risk Management ........................................................................ 378
14.9 Central Finance ....................................................................................................................... 382
14.9.1 Replication ................................................................................................................ 384
14 Finance, Governance, Risk, and Compliance 303 14.9.2 Mapping .................................................................................................................... 386
14.9.3 Accounting Views of Logistics Information ................................................... 387
14.1 Finance Architecture Overview ....................................................................................... 305 14.9.4 Central Payment ..................................................................................................... 390
14.9.5 Cross-System Process Control ............................................................................ 390
14.2 Accounting ................................................................................................................................ 306
14.2.1 General Ledger ........................................................................................................ 309 14.10 Finance Extensibility ............................................................................................................ 394
14.2.2 Fixed Asset Accounting ........................................................................................ 309 14.11 SAP Governance, Risk, and Compliance ...................................................................... 394
14.2.3 Inventory Accounting ............................................................................................ 311 14.11.1 Overview of SAP GRC Solutions ......................................................................... 395
14.2.4 Lease Accounting .................................................................................................... 313 14.11.2 SAP GRC Solutions and SAP S/4HANA Integration ..................................... 397
14.2.5 Service and Sales Accounting ............................................................................. 314 14.11.3 SAP S/4HANA Integration with Enterprise Risk and Compliance .......... 397
14.2.6 Group Reporting ..................................................................................................... 318 14.11.4 SAP S/4HANA Integration with International Trade Management ...... 398
14.2.7 Financial Closing ..................................................................................................... 324 14.11.5 SAP S/4HANA Integration with Access Governance ................................... 399
14.3 Tax and Legal Management ............................................................................................. 326 14.11.6 SAP S/4HANA Integration with SAP Privacy Governance ......................... 400
14.4 Enterprise Contract Management and Assembly ................................................... 328 14.12 Summary ................................................................................................................................... 401
15
Contents Contents
15 Localization in SAP S/4HANA 403 17.2 Managing Users, Roles, and Catalogs .......................................................................... 432
17.2.1 Communication Arrangements ......................................................................... 433
17.2.2 User Types ................................................................................................................. 433
15.1 Advanced Compliance Reporting ................................................................................... 403
17.2.3 SAP PFCG Roles and Business Catalogs ........................................................... 434
15.2 Document Compliance ........................................................................................................ 406 17.2.4 Management of Users, Roles, and Catalogs by Customers ...................... 436
15.2.1 Motivation ................................................................................................................ 406 17.2.5 Auditors ..................................................................................................................... 438
15.2.2 Architecture Overview .......................................................................................... 407
17.3 Summary ................................................................................................................................... 440
15.2.3 Recent Developments and Future Outlook ................................................... 409
15.3 Localization Toolkit for SAPS/4HANA Cloud ............................................................. 409
15.3.1 Components of the Toolkit ................................................................................. 409
15.3.2 Extensibility Scenario Guides and the Community .................................... 410 18 Output Management 441
PART III SAP S/4HANA Cloud-Specific Architecture 18.3 Email ............................................................................................................................................ 444
17 Identity and Access Management 425 19.4 Software Maintenance ....................................................................................................... 461
19.4.1 Maintenance Events .............................................................................................. 461
17.1 Architecture Concepts of Identity and Access Management ............................. 425 19.4.2 Blue-Green Deployment ...................................................................................... 462
17.1.1 ABAP Authorization Concept .............................................................................. 426 19.5 Built-in Support ...................................................................................................................... 463
17.1.2 Authentication ........................................................................................................ 426 19.5.1 Support Journey without Built-in Support .................................................... 464
17.1.3 Identity and Access Entities and Their Relationships ................................. 427 19.5.2 Built-in Support Architecture ............................................................................. 466
17.1.4 Identity and Access Management Tools ......................................................... 430
19.6 Summary ................................................................................................................................... 468
17.1.5 SAP Fiori Pages and Spaces ................................................................................. 431
16 17
Contents Contents
18 19
Index
A Actions ......................................................................... 57
Affixes .............................................................. 140–141
ABAP ..................................................................... 23, 33 Aliases .......................................................................... 81
comments ........................................................... 212 Alignment ............................................................... 221
exceptions ................................................. 233, 236 assignment statements ................................. 221
messages ............................................................. 229 ragged .................................................................. 226
object orientation ............................................... 41 variable declarations ..................................... 222
packages .............................................................. 299 vertical ................................................................. 226
programming paradigm .................................. 37 Annotations ........................................................... 255
test tools .............................................................. 288 Append statement ............................................... 174
ABAP Authority Check Test Helper API ....... 289 Application hierarchies ..................................... 305
ABAP CDS Test Double Framework ............... 288 Arguments .............................................................. 224
ABAP Data Dictionary ............................. 51, 53, 64 Array-like tables .................................................... 172
ABAP Development Tools (ADT) ............ 77, 118, ASSERT statements .............................................. 251
138, 217, 219, 239, 246, 254, 260, 310 Assertions ....................................................... 255, 269
ABAP Docs ............................................ 212, 258, 268 constraints ......................................................... 277
ABAP Objects .............................................. 51–52, 95 custom ................................................................. 275
implementation inheritance .......................... 65 expected exceptions ....................................... 272
ABAP Programming Guidelines ........................ 30 failure ................................................ 269, 271, 274
ABAP Runtime Type Services (RTTS) ................ 86 methods ...................................................... 269, 277
ABAP SQL Test Double Framework ................ 288 writing .................................................................. 270
ABAP Test Cockpit ............................... 28, 243, 325 Assignment operators ........................................ 221
ABAP Test Double Framework ......................... 284 Assignment statements .................................... 221
configure calls ................................................... 287 Automated executions ...................................... 312
when to use ......................................................... 288 Automated testing ............................ 253, 292, 333
ABAP Unit ............................................. 253, 256, 262 Avoidable errors ................................................... 247
call sequence ...................................................... 262
ABAP Workbench .................................................. 308 B
abap_bool type ...................................................... 162
abap_false ...................................................... 162–163 Backlog items ............................................................ 27
abap_true ................................................................. 162 Base classes ................................................................ 59
abap_undefined .................................................... 162 Black grade .............................................................. 322
abapGit ......................................................................... 29 Blank lines ............................................................... 220
abaplint ........................................................................ 29 Blank spaces ........................................................... 220
ABAP-Managed Database Procedures Block operations ................................................... 182
(AMDPs) .................................................................. 35 Block processing ................................................... 181
abapOpenChecks ..................................................... 29 Booleans .......................................................... 161, 163
Abbreviations ......................................................... 136 conditions ........................................................... 191
Abstract classes ................................................. 59, 63 naming ................................................................ 137
rules .......................................................................... 61 parameters ......................................................... 106
Abstract factory ........................................................ 91 Bottlenecks ............................................................. 320
Abstract final .......................................................... 155 Boy Scout Rule ....................................... 27, 201, 212
Abstract types ............................................................ 53 Branch coverage .......................................... 294, 326
Abstraction .................................. 24, 52, 55, 81, 270 Branches .................................................................. 148
levels ...................................................................... 117 IF statements ..................................................... 188
Accessor methods ................................................... 82 nesting depth .................................................... 190
Accidental architecture ...................................... 316 Broken window effect ......................................... 323
Accounts ...................................................................... 53 examples ............................................................. 324
341
Index Index
Builder class ............................................................... 89 Classes (Cont.) Code rewrite ............................................................ 324 Constructors (Cont.)
Builder pattern .......................................................... 89 dependencies ........................................................ 85 Code steward .......................................................... 321 dependencies ........................................................ 86
Built-in object class ................................................. 66 enumeration ....................................................... 154 Code under test ..................................................... 266 error handling ................................................... 123
friendship ............................................................... 81 isolate ................................................................... 279 injection .............................................................. 280
C global ....................................................................... 76 Cohesion ......................................................... 297, 299 scope and visibility ............................................ 83
immutable ............................................................. 82 Collecting parameters ......................................... 111 specialized ............................................................. 97
CALL FUNCTION statement .............................. 231 inheritance .............................................. 39, 59, 65 Collective code ownership ................................ 320 static ................................................................. 49, 90
Call method ................................................... 127, 189 instance .................................................................. 96 steps ....................................................................... 320 CONTINUE statement ......................................... 201
camelCase ................................................................ 140 local .......................................................................... 77 Command ................................................................... 56 Control flow ................................ 185, 193, 203, 273
Capitalization ......................................................... 217 messages .............................................................. 230 Commented code ................................................. 211 pseudo loops ...................................................... 200
CASE blocks ............................................................. 198 naming ................................................................. 136 Comments ............................................................... 205 Converting expressions ..................................... 195
CASE keyword ........................................................ 185 production ........................................................... 254 IF branches .......................................................... 210 Copy-on-write optimization ............................ 113
CASE statements ................................................... 196 small ........................................................................ 36 instructive ........................................................... 211 Core data services (CDS) views ................. 51, 288
hide ........................................................................ 199 stateful .................................................................... 75 issues ..................................................................... 205 naming ................................................................ 140
reusing .................................................................. 199 static ........................................................................ 61 method names .................................................. 268 Coupling ................................................................... 297
versus IFs ............................................................. 197 stub ......................................................................... 281 placement ........................................................... 208 undesired ............................................................ 309
CATCH blocks ............................................... 202, 249 test .......................................................................... 254 pseudo .................................................................. 213 Coverage report ........................................... 260, 294
CATCH keyword .................................................... 249 test helper ............................................................ 259 remove .................................................................. 210 CREATE OBJECT ........................................................ 93
Catching exceptions ............................................ 248 utility ................................................................ 61, 97 special ................................................................... 212 Creational patterns ................................................. 89
visibility .................................................................. 81 what to avoid ..................................................... 208 Credit score service class ................................... 106
cleanup ................................................................. 250
wrap with functions .......................................... 43
Chaining ......................................................... 150, 166 when to use ......................................................... 207 Cross-functional teams ............................. 334–335
Classic exceptions ....................................... 234–235
IFs ........................................................................... 200 Common understanding ......................... 319, 321 Currency conversion .......................................... 290
convert .................................................................. 241
Changing parameters .......................................... 111 Communication style ......................................... 328 service ...................................................................... 53
Clean ABAP .................................... 23, 29, 33, 35–37
pass by value ...................................................... 115 Communities of practice ................................... 336 Custom assertions ...................................... 270, 275
back story .............................................................. 25
Character limits ..................................................... 219 Community engagement ..................................... 30 constraints ......................................................... 277
community engagement ................................. 30
CHECK keyword ..................................................... 186 Compatible reference variable ........................... 91 parameters ......................................................... 276
get started ............................................................. 26
CHECK statements .................. 124, 186, 200, 203 Complex conditions ............................................ 195 Custom stubs ......................................................... 284
repository .............................................................. 31
Checks ................................ 148, 164–165, 189, 200 Composing object .................................................... 74 CX_DYNAMIC_CHECK ....................................... 244
rules .......................................................................... 26
automatic .............................................................. 28 Composition .............................................................. 70 CX_NO_CHECK ..................................................... 243
Clean ABAP open-source style guide ............ 327
basic ...................................................................... 165 constraints .......................................................... 279 superclass ........................................................... 246
Clean code ............................ 23, 185, 205, 249, 319
packages .............................................................. 308 versus inheritance ............................................... 73 CX_STATIC_CHECK .................................... 242, 247
messages .............................................................. 232
result ..................................................................... 109 COND statements ................................................. 187 Cyclic dependency ............................................... 309
Clean code advisor ................................................ 330
suppress ............................................................... 213 Condensing ............................................................. 220 Cyclomatic complexity metric .............. 190, 325
Clean Code Developer Initiative ..................... 322
Child classes ....................................................... 66, 69 Conditions ............................................ 186, 190, 195
Clean islands ............................................................. 28
Circular dependency ........................................... 309 Clean test properties ............................................ 292 complex ............................................................... 195 D
CL_OSQL_REPLACE statement ........................ 288 Cleanup ..................................................................... 251 deconstruct ......................................................... 196
Class declaration statement ................................ 83 CLEANUP keyword ................................................ 250 enhance ................................................................ 192 Data keyword ......................................................... 146
Class instances .......................................................... 59 Client code ................................................ 81, 91, 107 inline ..................................................................... 195 chaining .............................................................. 150
Class interfaces ...................................................... 266 Client packages ....................................................... 300 positive formulation ....................................... 190 Database tables ..................................................... 173
Class member visibility ......................................... 81 Closing brackets ..................................................... 223 raising exceptions ............................................ 248 Decision trees ........................................................ 190
Class under test ..................................................... 266 Code base .................................................................... 35 reusing .................................................................. 193 Declaration .................................................... 145–146
naming ................................................................. 268 Code coverage ............................................... 325–326 Consistency ................................................... 137, 216 alignment ........................................................... 222
Class-based exceptions ................... 233, 235–237, Code editor .............................................................. 219 Constant pattern ................................................... 155 anonymous ........................................................ 147
242, 245 Code Inspector .................................................. 28, 37 Constants ....................................................... 152, 159 chaining .............................................................. 149
raising ................................................................... 247 Code optimization ................................................ 115 grouping .............................................................. 159 inline ..................................................... 44, 146, 227
Classes .................................................................. 51, 57 Code retreat ................................................... 330–331 handling ............................................................... 154 scope ..................................................................... 149
abstract ................................................................... 59 Code review ..................................................... 25, 326 Constraints .............................................................. 277 strings .......................................................... 160–161
builder ...................................................................... 89 feedback culture ................................................ 327 classes ................................................................... 278 up front ................................................................ 149
composition .......................................................... 70 managers ............................................................. 329 Constructors ........................................ 61, 63, 83, 87 Declarative programs ............................................ 38
constants ............................................................. 154 prefix ..................................................................... 326 ADT ........................................................................ 239 Deconstruction ..................................................... 196
constraint ............................................................ 278 rules ........................................................................ 328 declare multiple ................................................... 86 Default constructor ................................................ 84
definition ................................................................ 59 visibility ................................................................ 327 default ..................................................................... 84 Default fail method ......................................... 56, 88
342 343
Index Index
Default ignore methods ........................................ 56 Error handling (Cont.) Failure modes ............................................................ 75 Hash operator ........................................................ 147
Default keys ............................................................ 174 exceptions ........................................................... 236 Feature code ............................................................ 229 Hashed tables ......................................................... 173
Default parameter values .................................. 104 messages .............................................................. 229 Feedback culture ......................................... 327, 329 append ................................................................. 175
Depended-on components (DOC) .................. 279 package checks .................................................. 313 Fellowship ................................................................ 332 Higher level tests .................................................. 257
Dependencies ...................................... 158, 250, 279 raising and catching ....................................... 245 Field-symbol ................................................. 152, 188 Hungarian notation ......................... 138, 142, 267
circular ................................................................. 315 relocating ............................................................. 249 Filter keyword ........................................................ 148
implement ........................................................... 281 return codes ........................................................ 232 Fixed row data ........................................................ 171 I
return code ......................................................... 234 Error messages ....................................................... 229 FIXME prefix ........................................................... 212
test classes .......................................................... 256 Exceptions ........................ 116, 124, 181, 186, 202, Flaky tests ................................................................ 325 IF blocks ........................................ 187, 190, 197, 200
Dependency injection ........................ 85, 280, 293 233, 235–236, 272 FOR TESTING annotation .................................. 259 IF branches .............................................................. 186
Dependency inversion principle ............. 99, 280 catching ................................................................ 248 Foreign code ........................................................... 218 comments ........................................................... 210
DESCRIBE TABLE statement ............................. 182 class-based ................................................ 233, 237 Foreign tests .................................................. 258, 260 IF keyword ............................................................... 185
Descriptive names ................................................ 133 classes ..................................................................... 99 Formatting .............................................................. 215 where to put ....................................................... 189
Design patterns .............................................. 48, 138 CX_DYNAMIC_CHECK .................................... 244 Friendship ......................................................... 81, 266 IF statements ................................................. 179, 188
mixing patterns ................................................... 49 CX_NO_CHECK .................................................. 243 Function groups ....................................................... 38 versus CASE ........................................................ 196
Development objects .......................................... 300 CX_STATIC_CHECK .......................................... 242 no inheritance ...................................................... 39 IF_T100_DYN_MSG interface .......................... 241
Development packages ...................................... 300 dependencies ...................................................... 250 no instantiation ................................................... 38 Immutability ............................................... 64–65, 75
Direct assignments .............................................. 147 details .................................................................... 118 no interfaces ......................................................... 40 Implicit knowledge .............................................. 195
DO 1 TIMES statement .............................. 200, 202 dynamically checked ....................................... 244 no method encapsulation ............................... 41 Indentation .................................................... 217, 225
Dojo .................................................................. 330–331 expected ............................................................... 272 no method namespaces ................................... 39 inline declarations .......................................... 227
Domain fixed values ........................................... 154 fail fast .................................................................. 122 weak substitution ............................................... 40 keywords ............................................................. 227
Domain terms ........................................................ 134 handling ................................................................. 36 weak variable encapsulation ......................... 41 Indexes .................................................. 172, 175, 177
Don’t-repeat-yourself principle ... 165, 193, 199 messages .............................................................. 247 Function modules ............ 95, 209, 233, 235, 290 Individual code ownership ............................... 320
Double negations ........................................ 191–192 OTHERS ................................................................. 233 exceptions ........................................................... 233 Individual learning .............................................. 323
Drivers ............................................................. 331, 333 raise .............................................................. 247, 273 wrapping ............................................................. 236 Infixes ....................................................................... 140
Dumps ....................................................................... 251 request .................................................................. 315 Functional language constructs ........................ 44 Information messages ....................................... 230
Duplicate entries ................................................... 175 static ...................................................................... 274 examples ................................................................ 45 Inheritance ..................................... 39, 52, 65, 69, 95
Duration ......................................................... 255, 260 superclass ............................................................ 245 Functional programs .............................................. 38 design ...................................................................... 70
Dynamic dispatch ............................................ 69, 95 text IDs .................................................................. 239 exceptions .......................................................... 245
Dynamic method calls ........................................ 128 types ....................................................................... 238 G hierarchies ............................................................. 69
Dynamic programming ........................................ 88 unchecked ............................................................ 243 method redefinitions ..................................... 102
Dynamically checked exceptions ................. 244, unexpected .......................................................... 274 Gang-of-four (GoF) design patterns ................. 37 test classes .......................................................... 257
246–247, 249 Exit messages .......................................................... 230 Generalists ............................................................... 335 test fixture methods ....................................... 262
Explicit constructor ................................................ 61 get_messages method ........................................ 146 tree ............................................................................ 65
E Explicit false values .............................................. 162 GitHub .......................................................................... 25 utility classes ........................................................ 63
Exporting keyword ............................................... 126 Given sections ..................................... 265, 267, 284 versus composition ............................................ 73
ELSE branches ............................................... 148, 186 Exporting parameters ......................................... 108 Given-then-when style ....................................... 265 Inline assignments ..................................... 187, 198
Empty key ................................................................ 174 capturing ............................................................. 127 Global classes ............................................................. 77 Inline conditions .................................................. 195
Encapsulation .................................... 41, 52, 76, 300 pass by value ...................................................... 115 constructors .......................................................... 84 Inline declarations .............. 34, 44, 146, 148, 151
Endifs ......................................................................... 210 pass by value versus pass by reference .... 114 Global container classes ..................................... 257 indent ................................................................... 227
Enum keyword ....................................................... 155 quantity ................................................................ 108 Global field catalog convention ...................... 140 reduce ................................................................... 167
Enumeration classes ..................................... 99, 154 versus returning ................................................ 110 Global namespace ................................................... 76 string literals ..................................................... 160
conditions ........................................................... 193 Extended program check ..................................... 29 Global scope ............................................................... 76 Inlining ........................................................................ 36
messages ............................................................. 232 External interfaces ................................................ 213 Global unit test classes ....................................... 257 Input parameters ................................. 44, 102, 111
patterns ................................................................ 155 Extract method refactoring .............................. 118 Grades ........................................................................ 322 Boolean ................................................................ 106
Enumerations ......................................................... 155 Green grade ............................................................. 322 business partner ............................................... 108
CASE statements ............................................... 197 F optional ........................................................ 42, 103
SWITCH operators ........................................... 199 H pass by value versus pass by reference ... 113
Error cases ................................................................ 236 Factories ...................................................................... 91 passing ................................................................. 125
Error handling .............................. 36, 123, 229, 231 Factory method ................................ 55, 70, 89, 199 Habits .............................................................. 330, 333 preferred .............................................................. 105
assertions ............................................................ 271 Fail fast ....................................................................... 122 Harmonization ......................................................... 34 quantity ............................................................... 103
dumps ................................................................... 251 Failure handling ..................................................... 234 Has-a relationships ................................................. 70 reassignment ..................................................... 113
344 345
Index Index
Input-output parameters .................................. 102 Layer-based hierarchies ...................................... 306 Meta-quality ........................................................... 272 Naming conventions (Cont.)
Insert statement .................................................... 175 Layers ............................................................... 135, 305 Methods ..................................... 26, 34, 95, 188, 223 descriptive .......................................................... 133
Instance methods .......................................... 96, 111 Leadership styles ................................................... 321 abstraction levels ............................................. 117 domain terms .................................................... 134
self reference me ............................................... 129 Learning techniques ............................................ 330 assertion .................................................... 269, 277 Hungarian notation ....................................... 138
Instantiation ...................................................... 38, 91 Legacy code ................... 26, 33, 120, 218, 292, 319 body ............................................................. 115, 123 layers .................................................................... 135
Integration tests .......................................... 265, 289 declarations ........................................................ 149 Boolean parameters ....................................... 107 legacy code ......................................................... 142
Interface segregation principle .................. 54–55 inheritance ............................................................ 70 calling ................................................................... 125 noise words ........................................................ 137
Interfaces ........................................ 40, 51–52, 58–59 learning techniques ......................................... 333 CASE statements ............................................... 197 packages ............................................................. 308
account ................................................................... 52 naming ....................................................... 142, 269 CHECK statements ........................................... 187 plural or singular ............................................. 135
calling ................................................................... 125 test seams ............................................................ 290 check versus return ......................................... 124 reduce operations ............................................ 167
constants ............................................................. 154 Line breaks ..................................................... 220, 224 closing brackets ................................................ 223 term consistency .............................................. 137
exceptions ........................................................... 241 Line lengths ............................................................. 219 define outputs ................................................... 108 unit testing ......................................................... 267
factory ..................................................................... 91 LINE_EXISTS function ......................................... 177 do one thing ....................................................... 115 Navigators ...................................................... 331, 333
global ....................................................................... 76 Lines ............................................................................ 183 exceptions ................................................. 238, 242 Neat code ................................................................. 215
members ................................................................. 55 Liskov substitution principle ............ 55, 69, 102 funtion module wrapping ............................ 236 Negative conditions ................................... 191–192
method takeover ................................................. 42 Literals ....................................................................... 153 IF statements ..................................................... 189 Nested IF statement ................................... 178–179
naming ................................................................. 136 string ..................................................................... 160 inheritance .......................................................... 102 Nested types ........................................................... 159
option methods ................................................... 56 Local area .................................................................... 77 line breaks ........................................................... 226 Nesting depth ............................................... 188, 190
public .................................................................... 293 Local classes ........................................................ 77, 79 namespaces ........................................................... 39 levels ..................................................................... 190
public instance methods .................................. 99 constructors .......................................................... 85 naming ....................................................... 110, 137 NEW operator ........................................................... 92
static creation methods ................................... 87 Local friends ............................................................ 266 nesting ..................................................................... 45 No-check exceptions ........................................... 243
visibility ................................................................... 81 LOOP AT statement .......................... 176, 178–180 object-oriented programming ....................... 95 Noise words ..................................................... 65, 137
Internal package interfaces ............................... 302 Looping variables ........................................ 149, 151 overloading ................................................. 86, 103 Non-object-oriented code .................................... 43
Internal tables .............................................. 148, 171 Loops ................................... 125, 149, 151, 176, 178 parameters ......................................................... 102 Normalized hierarchy ........................................ 102
append .................................................................. 174 pseudo ......................................................... 185, 200 parameters formatting .................................. 223 NOT IS statements ............................................... 193
categories ............................................................ 171 undefined signature ........................................ 203 redefinition ......................................................... 100 NOT keyword ................................................ 193–194
declaring .............................................................. 173 refactoring .......................................................... 202 Nouns ........................................................................ 136
default keys ........................................................ 173 M remove comments ........................................... 206 Number of statements ....................................... 218
insert ..................................................................... 175 size ......................................................................... 120
looping variables ............................................. 151 Magic numbers ...................................................... 153 small ......................................................................... 36 O
number of rows ................................................. 182 assertion ............................................................... 271 split the behaviors ........................................... 104
populating ............................................................. 46 Main packages ........................................................ 299 takeover by interfaces ....................................... 42 Object orientation ............................................ 37, 41
retrieve contents ..................................... 176–177 Maintenance ................................................. 196, 216 test ...................................................... 255, 259, 262 Object pattern ............................................... 157–158
unnecessary table reads ................................ 180 Managers .................................................................. 329 test fixture ........................................................... 262 Object references .................................................. 111
Invariants .................................................................... 75 Meaningful names ................................................ 133 Metrics ...................................................................... 325 Object-oriented programming ............ 38, 51, 58
Invoking methods ................................................ 102 Measurements ......................................................... 37 Mob programming .................................... 330, 333 characteristics ...................................................... 51
Irrelevant constructs .............................................. 34 MESSAGE statements ................................ 229, 231 Mocks ......................................................................... 285 methods .................................................................. 95
IS INITIAL statements ......................................... 193 Messages ...................................... 160, 202, 229, 237 instances ................................................................. 98 naming ................................................................ 136
IS NOT INITIAL keyword .................................... 165 add to exceptions ............................................. 247 when to use ......................................................... 288 Objects ......................................................................... 58
IS NOT statements ................................................ 193 ADT ......................................................................... 239 Multiple parameter calls .................................... 224 allowed ................................................................ 310
Is-a relationships ...................................................... 69 classes ......................................................... 230, 241 Mutation testing ................................................... 333 bundle .................................................................. 303
I-shaped profile ...................................................... 335 clean code ............................................................ 232 expose .................................................................. 314
Iterations .................................................................. 167 comments ............................................................ 211 N mock ..................................................................... 285
Iterator pattern ......................................................... 78 containers ............................................................ 112 naming ................................................................ 136
error ....................................................................... 271 Name collisions ..................................................... 139 regrouping .......................................................... 297
K handling ............................................................... 229 prefixes ................................................................. 140 Obsolete language constructs ............................ 48
ID ............................................................................. 230 Naming conventions ........................................... 133 Obsolete language elements .............................. 46
Kata ............................................................................. 330 map to exceptions ............................................ 238 ABAP ...................................................................... 138 Open communication ........................................ 143
number ................................................................. 230 abbreviations ..................................................... 136 Open SQL .......................................................... 51, 288
L raising ................................................................... 161 affixes ................................................................... 140 Open-closed principle ........................................... 55
types ....................................................................... 229 classes and methods ....................................... 136 Optimization .......................................................... 216
Latest constructs ...................................................... 34 variables ............................................................... 231 collisions .............................................................. 139 Optional methods ................................................... 56
346 347
Index Index
Optional parameter names .............................. 128 Partial implementations ...................................... 59 Q Rows (Cont.)
Orange grade .......................................................... 322 Pass-by-reference parameters .......................... 113 discern number ................................................. 182
OTHERS exceptions ............................................. 233 exporting ............................................................. 114 Quick fixes ............................................................... 246 find ........................................................................... 46
Output parameters ........................... 102, 109, 112 input ...................................................................... 113 insert ..................................................................... 175
capturing ............................................................. 126 Pass-by-value parameters .................................. 112 R read ....................................................................... 177
Overloading ............................................................... 41 changing .............................................................. 115 Runtime ................................................................... 207
exporting ............................................................. 114 Ragged alignments ............................................... 226 test ......................................................................... 256
P input ...................................................................... 113 RAISE EXCEPTION keyword .............................. 247
Performance .................................................... 35, 207 RAISE SHORTDUMP statements ..................... 252 S
Package checks ............................................. 308, 310 Pipe operator .......................................................... 161 RAISING cx_root clause ..................................... 275
automated execution ..................................... 312 Plugin architecture ................................................. 55 Raising exceptions ............................................... 247 SAP assurance and compliance software ...... 36
best practices ..................................................... 315 Plugins ....................................................................... 245 conditions ........................................................... 248 SAP GUI ........................................ 138, 229, 231, 310
errors ..................................................................... 313 Plural or singular forms ...................................... 135 with messages ................................................... 247 SAP HANA .................................................................. 36
manual execution ............................................ 310 Polymorphism ........................................ 52, 69, 199 READ TABLE statement ............................ 176, 178 Scenarios .................................................................. 265
Package hierarchies ................................... 297, 304 Positive conditions ............................................... 191 Readability ............................. 23, 47, 215–216, 220 Scope ......................................................................... 149
by applications .................................................. 305 Pragmas ..................................................................... 213 Read-only attributes ............................................... 82 conditions ........................................................... 191
layer-based ......................................................... 306 Precise code ............................................................. 205 Receiving keyword ............................................... 127 package interfaces .......................................... 301
translation relevance ..................................... 306 Predefined variables ............................................ 146 Red grade .................................................................. 322 test classes .......................................................... 257
Package interfaces ...................................... 301, 309 Preferred parameters ................................. 105, 128 Redefined methods .............................................. 102 Self-reference me ................................................. 129
expose objects ................................................... 314 Prefixes ............................................................ 138, 140 Reduce operations ................................................ 166 omit ....................................................................... 129
scope ..................................................................... 302 code review ......................................................... 326 concerns ............................................................... 168 Server packages ..................................................... 300
Packages ............................................................ 52, 297 comments ............................................................ 211 naming ................................................................. 167 Setter injections .................................................... 280
best practices ..................................................... 303 examples .............................................................. 140 Refactoring .............................. 27, 71–72, 118, 123, Setup methods ................................... 262, 264–265
breakdown .......................................................... 308 packages .............................................................. 308 143, 168, 201, 207, 211, 324 Severity ..................................................................... 159
cohesion ............................................................... 299 test classes ........................................................... 267 loops ......................................................................... 28 Short text ................................................................. 230
design .................................................................... 304 Pretty printer .......................................................... 217 remove comments ........................ 206, 210–211 Side effects ................................................................. 44
encapsulated ...................................................... 300 Primary code checks .............................................. 28 References ................................................................ 152 Single Level of Abstraction Principle
errors ..................................................................... 313 Primary keys ........................................................... 172 Regrouping .................................................... 297–298 (SLAP) ................................................................... 118
naming ................................................................. 308 Print margins .......................................................... 219 Regular expressions .......................... 145, 164–165 Single parameter calls ........................................ 224
no strategy .......................................................... 316 Private constructors ............................................. 266 complex ............................................................... 166 Single row operations ......................................... 182
reuse levels .......................................................... 298 Private methods .................................................... 122 simple .................................................................... 164 Single-responsibility principle ......... 55, 75, 201
roles ....................................................................... 300 Private visibility ....................................................... 81 Remote function calls (RFCs) .............................. 43 Singleton .............................................................. 48, 89
trigger checks ..................................................... 310 Procedural language constructs ........................ 43 Renaming ................................................................. 143 Small tables ............................................................. 172
types ...................................................................... 299 Procedural programs ............................................. 38 Restricted package interface .................. 302, 315 snake_case .............................................................. 140
use cases .............................................................. 298 Procedure coverage .............................................. 294 Resumability ................................................. 243, 248 Software breakdown ........................................... 304
Pair programming ...................................... 330, 332 Process methods ..................................................... 57 Return codes ........................................................... 232 SOLID principles ...................................................... 55
different roles ..................................................... 333 Production classes ................................................ 254 errors ..................................................................... 234 Sorted access .......................................................... 172
Parameters .................................................... 102, 223 Programs .................................................................... 95 failure handling ................................................ 234 Sorted tables ........................................................... 172
Boolean ................................................................ 106 Propagation ............................................................. 242 RETURN statement ............................................... 124 append ................................................................. 175
changing .............................................................. 111 Property ...................................................................... 82 Returning parameters .............................. 109, 126 Split-up expressions ........................................... 166
exporting ............................................................. 108 Protected constructor ........................................... 61 capturing ............................................................. 126 Standard tables ...................................................... 172
indent .................................................................... 225 Protected members ................................................ 61 naming ................................................................. 110 append ................................................................. 175
input ...................................................................... 103 Proxies ......................................................................... 73 Returning tables ....................................................... 37 State .............................................................................. 75
optional .................................................................. 42 Pseudo comments ................................................ 213 Reuse levels ............................................................. 298 Stateful classes ......................................................... 75
optional names ................................................. 128 Pseudo loops ................................................. 185, 200 Revisions ..................................................................... 35 Statement coverage .................................... 294, 326
pass by reference .............................................. 113 Public constants .................................................... 238 Risk level ......................................................... 256, 260 Statement Coverage report .............................. 261
pass by value ...................................................... 112 Public instance methods ............................... 98–99 Roles .............................................................................. 59 Static classes .............................................................. 61
placement ........................................................... 224 Public interface ........................................................ 81 Rollback work ......................................................... 256 Static code check .................................................. 325
returning ............................................................. 109 test .......................................................................... 293 Root exception class ............................................ 237 issues .................................................................... 324
vertical alignment ........................................... 226 Public package interface ........................... 302, 315 Rows ........................................................................... 171 Static constructor ............................................. 49, 90
Parent classes .................................................... 65, 69 Public reuse ............................................................. 298 append .................................................................. 174 Static creation methods .................. 49, 86, 89, 97
Pareto principle ..................................................... 310 block processing ............................................... 181 interfaces ............................................................... 87
348 349
Index Index
Static exceptions ................................................... 274 Technical debt .............................................. 316, 324 Transparent tables ................................................ 136 Value operator ....................................................... 147
forward ................................................................. 275 Technical packages ............................................... 305 T-shaped profile ........................................... 334–335 Value semantics ....................................................... 63
multiple ................................................................ 275 Template method .................................................... 61 Type keyword ......................................................... 150 Variables .................................................................. 145
Static methods ........................................... 55, 63, 95 design pattern ...................................................... 70 Type safety ............................................ 155, 157, 162 alignment ........................................................... 222
call ............................................................................. 98 Termination ............................................................ 251 assignment ............................................................ 45
Status messages .................................................... 230 Test classes ............................................................... 254 U Boolean ................................................................ 163
Strings ....................................................................... 160 executing ............................................................. 260 branches and scope ........................................ 148
building ................................................................ 161 given/when ......................................................... 267 Ubiquitous language ........................................... 135 comments ........................................................... 206
literals ................................................................... 160 global ..................................................................... 257 Unavailable constructs .......................................... 34 control flow ........................................................ 193
static ...................................................................... 160 higher level tests ............................................... 257 Unchecked exceptions .................... 243, 246, 251 declaring ............................................................. 146
Structure packages ............................................... 299 isolate .................................................................... 293 Understandable code ................ 24, 188, 195, 207 helper .................................................................... 167
Stubs ................................................................ 281–282 local .................................................... 254, 257–258 Uniformity .............................................................. 217 looping ................................................................. 151
custom .................................................................. 284 resetting ............................................................... 265 Unit testing ....................... 147, 188, 253, 257, 289 messages ............................................................. 231
when to use ......................................................... 288 scope ...................................................................... 257 assertions ............................................................ 269 strings ................................................................... 161
Style guide ..................................................... 327, 329 Test code ................................................................... 292 class under test ................................................. 266 Verbs .......................................................................... 137
Subclasses ................................................................ 100 Test coverage .......................................................... 294 classes ................................................................... 254 Vertical alignment ............................................... 226
Sub-methods .......................................................... 190 Test doubles ................................ 279–280, 282, 293 coverage .............................................................. 260 Vertically dense code .......................................... 220
Subpackages .................................................. 307–308 ABAP Test Double Framework .................... 287 enumeration ............................................ 154, 156 Visibility ...................................................................... 81
Subroutines ................................................................ 95 mock object ......................................................... 287 executing ............................................................. 260 constructors .......................................................... 83
Substitution ....................................................... 40, 69 test tools ............................................................... 288
messages ............................................................. 231
Test execution ........................................................ 255
Suffixes .............................................................. 65, 140
Test fixture methods ........................................... 262
methods ............................................................... 262 W
packages .............................................................. 308 naming ................................................................. 267
Test helper classes ....................................... 259, 276
Superclass ............................................. 61, 65, 68–69 principles ............................................................. 291 Warnings .................................................................. 213
Test injections ........................................................ 290
exceptions ................................................. 237, 245 test doubles ........................................................ 279 messages ............................................................. 230
Test methods ...................................... 255, 259, 262
test ......................................................................... 259 test seams ............................................................ 289 WHEN block ............................................................ 197
executing ............................................................. 262
Superfluous statements ..................................... 180 Units ........................................................................... 253 When sections .................................... 265, 267, 284
isolation ..................................................... 263, 293
SWITCH operations .............................................. 198 Unnamed arguments .......................................... 128 Where-used list ..................................................... 232
naming ................................................................. 268
reusing .................................................................. 199 Unstructured programs ........................................ 37 White grade ............................................................ 322
scenarios .............................................................. 265
Synonyms ................................................................ 137 Unsuitable names ................................................. 134 Whitespaces ............................................................ 220
static exceptions ............................................... 275
Syntax ........................................................................ 193 Upfront declaration ............................................. 149 Wrapping ................................................................. 236
Test relations ................................................. 258, 288
warnings ........................................... 242–244, 246 Use access ............................................. 309, 313–314 classes with functions ....................................... 43
Test seams ................................................................ 289
System administrators ....................................... 307 Utility classes ........................... 61, 63, 97, 259, 267
Test superclass ........................................................ 259
sy-subrc .................................................. 231, 233–234 rules .......................................................................... 63 X
Test-driven development (TDD) .................... 250,
field ........................................................................ 191 Utility functions ....................................................... 63
271, 291
Testing subclasses ................................................. 291 Utility methods ........................................................ 97 XSDBOOL method ................................................ 163
T TEST-SEAM block ................................................... 290 XXX prefix ............................................................... 212
Text IDs ..................................................................... 239 V
T100 exception ............................................ 238, 242 The Stepdown Rule ............................................... 118 Y
T100 messages ............................................. 238, 241 Then sections ............................. 265, 267, 269, 284 Validation messages ............................................ 124
Tab key ...................................................................... 227 Thermal protector ................................................... 99 Value copies ............................................................ 113 Yellow grade ........................................................... 322
Table GTADIR ......................................................... 141 Thermal switch ........................................ 71, 99, 280 Value objects ............................................... 63, 78, 99
Tables ......................................................................... 148 Timely tests ............................................................. 291 attributes ................................................................ 65
categories ............................................................ 172 TODO prefix ............................................................ 212 naming .................................................................... 65
hashed .................................................................. 173 Transaction
naming ................................................................. 168 CHECKMAN ........................................................... 29
read ........................................................................ 176 SAUNIT_CLIENT_SETUP ................................ 255
sorted .................................................................... 172 SE11 ......................................................................... 141
Target currency ........................................................ 53 SE24 ........................................................................ 217
Teams ........................................................................ 321 SE80 ................................................... 138, 217, 312
learning ................................................................ 323 SE91 ........................................................................ 142
members .............................................................. 334 Translation relevance .......................................... 306
Teardown methods .................................... 262, 265 options .................................................................. 307
350 351
First-hand knowledge.