principles:single_level_of_abstraction
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
principles:single_level_of_abstraction [2014-06-30 22:51] – Relations christian | principles:single_level_of_abstraction [2021-10-18 22:03] (current) – +++ restored +++ christian | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Single Level of Abstraction (SLA) ====== | ====== Single Level of Abstraction (SLA) ====== | ||
- | |||
===== Variants and Alternative Names ===== | ===== Variants and Alternative Names ===== | ||
+ | |||
+ | * One Level of Abstraction | ||
+ | * Don't Mix Different Levels of Abstractions | ||
===== Context ===== | ===== Context ===== | ||
Line 10: | Line 12: | ||
===== Principle Statement ===== | ===== Principle Statement ===== | ||
- | Each [[glossary: | + | Each method |
Line 17: | 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. | ||
- | Sometimes extracting the method would result in the new method having a large number of parameters. Alternatively the parameters could be converted to fields of the class. But this would often result in bad [[glossary: | + | Sometimes extracting the method would result in the new method having a large number of parameters. Alternatively the parameters could be converted to fields of the class. But this would often result in bad [[glossary: |
===== Rationale ===== | ===== Rationale ===== | ||
Line 34: | Line 36: | ||
===== Caveats ===== | ===== Caveats ===== | ||
- | |||
See section [[#contrary principles]]. | See section [[#contrary principles]]. | ||
Line 40: | Line 41: | ||
===== Origin ===== | ===== Origin ===== | ||
+ | Stated in [[resources: | ||
===== Evidence ===== | ===== Evidence ===== | ||
Line 46: | Line 48: | ||
/* * [[wiki: | /* * [[wiki: | ||
/* * [[wiki: | /* * [[wiki: | ||
- | /* * [[wiki: | + | |
+ | * [[wiki: | ||
/* * [[wiki: | /* * [[wiki: | ||
Line 54: | 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 71: | 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 ===== | ||
/* Choose one of the following and comment out the rest: */ | /* Choose one of the following and comment out the rest: */ | ||
- | [[wiki: | + | /*[[wiki: |
- | /*[[wiki: | + | |
+ | [[wiki: | ||
/ | / | ||
===== Further Reading ===== | ===== Further Reading ===== | ||
+ | * {{page> | ||
===== Discussion ===== | ===== Discussion ===== | ||
Discuss this wiki article and the principle on the corresponding [[talk: | Discuss this wiki article and the principle on the corresponding [[talk: | ||
+ |
principles/single_level_of_abstraction.txt · Last modified: 2021-10-18 22:03 by christian