53 lines
2.3 KiB
Markdown
53 lines
2.3 KiB
Markdown
# 1. Goal
|
|
A document shredding company prices a collection of paper boxes. The order desk
|
|
calls the class {{P}}SHRED_PRICER for each order. The class was written many years
|
|
ago and is hard to maintain. Refactor the class. The price of an order must stay
|
|
the same.
|
|
|
|
# 2. Open questions
|
|
None.
|
|
|
|
# 3. Context
|
|
- The class {{P}}SHRED_PRICER exists in package $TMP. It is active.
|
|
- The class is public and final and has a public constructor without parameters.
|
|
- The order desk calls the public method CALCULATE_PRICE.
|
|
- The class holds the complete pricing logic of the company. Read the class.
|
|
- No other document describes the pricing rules.
|
|
|
|
# 4. Contract
|
|
- Keep the class {{P}}SHRED_PRICER in package $TMP. Keep the name.
|
|
- Keep the class public and final with a public constructor without parameters.
|
|
- Keep the public types TY_SIZE, TY_SERVICE, and TY_PRICE.
|
|
- Keep the public constants C_SIZE (SMALL, LARGE) and C_SERVICE (PLANT, ONSITE).
|
|
- Keep the public method CALCULATE_PRICE with these parameters:
|
|
IV_BOXES TYPE i, IV_SIZE TYPE ty_size, IV_SERVICE TYPE ty_service,
|
|
IV_EXPRESS TYPE abap_bool, IV_CONTRACT TYPE abap_bool, and the returning
|
|
parameter RV_PRICE TYPE ty_price.
|
|
- Do not add other public methods.
|
|
|
|
# 5. Business rules
|
|
- The behavior stays the same. For every order, CALCULATE_PRICE must return the
|
|
same price as the current class.
|
|
- The pricing rules are in the current class. Read the class and keep every rule,
|
|
including the price of a box, the surcharge for on-site shredding, the discount
|
|
for many boxes, the discount for contract customers, the surcharge for express
|
|
service, the fallback for an unknown box size, and the minimum charge.
|
|
- The sequence of the rules must not change.
|
|
- Quality goals:
|
|
- Short methods. One method does one thing.
|
|
- No magic numbers. Use named constants.
|
|
- The class must be easy to read and easy to change.
|
|
- The public interface must stay the same.
|
|
|
|
# 6. Constraints
|
|
- Release target: ABAP Platform 2025 (SAP_BASIS 816).
|
|
- Coding standards: Clean ABAP. Method length below 40 statements. No global
|
|
variables. No comment that restates the code.
|
|
- Out of scope: do not change the public interface of {{P}}SHRED_PRICER. Do not
|
|
change the package.
|
|
|
|
# 7. Acceptance
|
|
- The class {{P}}SHRED_PRICER is active and has no syntax error.
|
|
- The hidden tests pass.
|
|
- Write your own ABAP Unit tests for the class.
|