principles:single_level_of_abstraction
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
principles:single_level_of_abstraction [2014-06-30 23:17] – origin, Further Reading christian | principles:single_level_of_abstraction [2021-09-02 18:14] – old revision restored (2021-05-11 22:25) 65.21.179.175 | ||
---|---|---|---|
Line 12: | Line 12: | ||
===== Principle Statement ===== | ===== Principle Statement ===== | ||
- | Each [[glossary: | + | Each method |
Line 19: | Line 19: | ||
All statements of a method should belong to the same level of abstraction. If there is a statement which belongs to a lower level of abstraction, | All statements of a method should belong to the same level of abstraction. If there is a statement which belongs to a lower level of abstraction, | ||
- | Often the body of a loop can be extracted resulting in a separate private method. Loops should ideally contain a single statement (usually a method call). Sometimes this is not achievable without other drawbacks but certainly large loop bodies can be considered a small. | + | Often the body of a loop can be extracted resulting in a separate private method. Loops should ideally contain a single statement (usually a method call). Sometimes this is not achievable without other drawbacks but certainly large loop bodies can be considered a smell. |
A further indicator for a missing method is the combination of a blank line, a comment and a block of code. In most of the cases the code block should go to a new private method. This also makes the comment obsolete as the new method carries a name which typically resembles the comment. | A further indicator for a missing method is the combination of a blank line, a comment and a block of code. In most of the cases the code block should go to a new private method. This also makes the comment obsolete as the new method carries a name which typically resembles the comment. | ||
Line 36: | Line 36: | ||
===== Caveats ===== | ===== Caveats ===== | ||
- | |||
See section [[#contrary principles]]. | See section [[#contrary principles]]. | ||
Line 42: | Line 41: | ||
===== Origin ===== | ===== Origin ===== | ||
- | Stated in | + | Stated in [[resources: |
- | {{page>resources: | + | |
===== Evidence ===== | ===== Evidence ===== | ||
Line 60: | Line 58: | ||
==== Specializations ==== | ==== Specializations ==== | ||
+ | * [[One Line Blocks]] | ||
==== Contrary Principles ==== | ==== Contrary Principles ==== | ||
- | |||
* [[More Is More Complex|MIMC]]: | * [[More Is More Complex|MIMC]]: | ||
* [[Principle of Separate Understandability|PSU]]: | * [[Principle of Separate Understandability|PSU]]: | ||
Line 77: | Line 75: | ||
===== Examples ===== | ===== Examples ===== | ||
- | ==== Example1: | + | ==== Example1: |
+ | |||
+ | A typical example for the application of SLA is a loop iterating over a certain data structure: | ||
+ | |||
+ | <code java> | ||
+ | public List< | ||
+ | List< | ||
+ | for (ResultEntity entity : resultSet) { | ||
+ | ResultDto dto = new ResultDto(); | ||
+ | dto.setShoeSize(entity.getShoeSize()); | ||
+ | dto.setNumberOfEarthWorms(entity.getNumberOfEarthWorms()); | ||
+ | dto.setAge(computeAge(entity.getBirthday())); | ||
+ | result.add(dto); | ||
+ | } | ||
+ | return result; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | There are two levels of abstractions in this method. First there is the loop which acts upon the whole result set and second there is the loop body which converts a single entity to a [[patterns: | ||
+ | |||
+ | <code java> | ||
+ | public List< | ||
+ | List< | ||
+ | for (ResultEntity entity : resultSet) { | ||
+ | result.add(toDto(entity)); | ||
+ | } | ||
+ | return result; | ||
+ | } | ||
+ | |||
+ | private ResultDto toDto(ResultEntity entity) { | ||
+ | ResultDto dto = new ResultDto(); | ||
+ | dto.setShoeSize(entity.getShoeSize()); | ||
+ | dto.setNumberOfEarthWorms(entity.getNumberOfEarthWorms()); | ||
+ | dto.setAge(computeAge(entity.getBirthday())); | ||
+ | return dto; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Now there are two smaller methods each of which is written in terms of a single level of abstraction. This is better readable as no mental grouping is necessary. Furthermore the two methods are still separately understandable ([[Principle of Separate Understandability|PSU]]) so no mental inlining is necessary and if you don't care about the details of the '' | ||
+ | |||
+ | ==== Example2: Comment Plus Code Block ==== | ||
+ | |||
+ | ==== Example3: Parameter Checking ==== | ||
+ | |||
+ | ==== Example4: Extracting Classes | ||
===== Description Status ===== | ===== Description Status ===== |
principles/single_level_of_abstraction.txt · Last modified: 2021-10-18 22:03 by christian