User Tools

Site Tools


principles:single_level_of_abstraction

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revisionBoth sides next revision
principles:single_level_of_abstraction [2014-06-30 22:36] – created christianprinciples:single_level_of_abstraction [2018-04-20 01:39] – [Example1: Loops] 40.130.190.160
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:module]] should be written in terms of a single level of abstraction.+Each method should be written in terms of a single level of abstraction.
  
  
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, it should go to a private method which comprises statements on this level. Doing so will result in smaller methods. 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, it should go to a private method which comprises statements on this level. Doing so will result in smaller methods.
  
-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 34: Line 36:
  
 ===== Caveats ===== ===== Caveats =====
- 
 See section [[#contrary principles]]. See section [[#contrary principles]].
  
Line 40: Line 41:
 ===== Origin ===== ===== Origin =====
  
 +Stated in [[resources:Clean Code]] (p. 36). The principle is maybe older, though.
  
 ===== Evidence ===== ===== Evidence =====
Line 46: Line 48:
 /*  * [[wiki:Proposed]]*/ /*  * [[wiki:Proposed]]*/
 /*  * [[wiki:Examined]]*/ /*  * [[wiki:Examined]]*/
-/*  * [[wiki:Accepted]]*/+ 
 +  * [[wiki:Accepted]]: Described in "Clean Code" 
 /*  * [[wiki:Questioned]]*/ /*  * [[wiki:Questioned]]*/
  
Line 54: Line 58:
  
 ==== Specializations ==== ==== Specializations ====
 +  * [[One Line Blocks]]
  
 ==== Contrary Principles ==== ==== Contrary Principles ====
 +  * [[More Is More Complex|MIMC]]: Adhering to SLA results in more methods and classes.
 +  * [[Principle of Separate Understandability|PSU]]: The purpose of SLA is to avoid [[glossary:mental grouping]]. On the other hand just adhering to SLA and neglecting PSU may result in the opposite: The reader of the code has to do [[glossary:mental inlining]]. Sometimes it can be more readable to allow a small amount of statements on the "wrong" level of abstraction (like having a guarding if statement in a higher level method).
  
 ==== Complementary Principles ==== ==== Complementary Principles ====
 +
 +  * [[More Is More Complex|MIMC]]: Adhering to SLA results in smaller methods.
 +  * [[High Cohesion|HC]]: Adhering to SLA by extracting methods may result in bad cohesion if you don't extract classes if necessary.
 +  * [[Model Principle|MP]]: MP tells how to find suitable abstractions when abstracting methods and classes in order to adhere to SLA.
  
 ==== Principle Collections ==== ==== Principle Collections ====
Line 64: Line 75:
 ===== Examples ===== ===== Examples =====
  
-==== Example1:  ====+==== Example1: Loops ==== 
 + 
 +A typical example for the application of SLA is a loop iterating over a certain data structure: 
 + 
 +<code java> 
 +public List<ResultDto> buildResult(Set<ResultEntity> resultSet) { 
 +    List<ResultDto> result = new ArrayList<>(); 
 +    forng code is better: 
 + 
 +<code java> 
 +public List<ResultDto> buildResult(Set<ResultEntity> resultSet) { 
 +    List<ResultDto> result = new ArrayList<>(); 
 +    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; 
 +
 +</code> 
 + 
 +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 ''toDto'' method, you can just read and understand ''buildResult'' without being distracted by unnecessary detail. 
 + 
 +==== 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:Stub]] +/*[[wiki:Stub]]*
-/*[[wiki:Incomplete]]*/+ 
 +[[wiki:Incomplete]] 
 /*[[wiki:Complete]]*/ /*[[wiki:Complete]]*/
  
 ===== Further Reading ===== ===== Further Reading =====
 +  * {{page>resources:Clean Code#reference}}
  
 ===== Discussion ===== ===== Discussion =====
  
 Discuss this wiki article and the principle on the corresponding [[talk:principles:Single Level of Abstraction|talk page]]. Discuss this wiki article and the principle on the corresponding [[talk:principles:Single Level of Abstraction|talk page]].
principles/single_level_of_abstraction.txt · Last modified: 2021-10-18 22:03 by christian