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

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
principles:single_level_of_abstraction [2014-07-01 09:44] – caveats, ... christianprinciples:single_level_of_abstraction [2020-09-09 15:26] – old revision restored (2014-07-01 11:12) 116.202.228.169
Line 43: Line 43:
 ===== Origin ===== ===== Origin =====
  
-Stated in  +Stated in [[resources:Clean Code]] (p. 36). The principle is maybe older, though.
-{{page>resources:Clean Code#reference}} (on page 36). The principles is maybe older.+
  
 ===== Evidence ===== ===== Evidence =====
Line 78: Line 77:
 ===== 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<>(); 
 +    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; 
 +
 +</code> 
 + 
 +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:Data Transfer Object|DTO]]. For the latter there is no syntactical grouping. The reader of the code has to find out that the first four lines of the loop body belong together. The code also doesn't explicitly state that these four lines convert an entity to a DTO. So the following 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) { 
 +    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: Commented Code Blocks ==== 
 + 
 +==== Example3: Algorithms ==== 
  
 ===== Description Status ===== ===== Description Status =====
principles/single_level_of_abstraction.txt · Last modified: 2021-10-18 22:03 by christian