# Clean Code - 6 Objects and Data Structures
## Data Abstraction
> Hiding implementation is about abstractions!
To not expose the details of data, use:
- interface
- getters and setters
## Data/Object Anti-Symmetry
> Objects hide their data behind abstractions and expose functions that operate on that data.
#### Objects and data structures are different
- Objects
- Data is hidden behind abstractions, and use getters and setters (expose functions) to operate data
- Data structure
- Data is exposed to the outside, and there are no meaningful functions
#### OOP solution
Polymorphism
#### Procedural code (code using data structures) vs OO code
| | Procedural code | OO code |
|:--------------- |:----------------------------------------------------------------- |:---------------------------------------------------------- |
| **Easy when..** | Add new functions (no need to change the existing data structure) | Add new classes (no need to change the existing functions) |
| **Hard when..** | Add new data structure (need to change all existing functions) | Add new functions (need to change all existing classes ) |
| **When to use** | Want to add new functions instead of new types | Want to add new types than new functions |
> the idea that everything is an object is a myth. Sometimes you do want simple data structures with procedures operating on them.
## The Law of Demeter
> a module should not know about the innards of the objects it manipulates.
Another good resource to read:
https://betterprogramming.pub/demeters-law-don-t-talk-to-strangers-87bb4af11694
### Train Wrecks
> Chains of calls like this are generally considered to be sloppy style and should be avoided.
When `ctxt`, `Options`, and `ScratchDir` are merely data structures without behaviors, the following codes do not violate the Law of Demeter:
```
const outputDir: string = ctxt.options.scratchDir.absolutePath;
```
### Hybrids
> half object and half data structure.
>
> hybrids make it hard to add new functions but also make it hard to add new data structures. So should avoid using it.
### Hiding Structure
When `ctxt`, `options`, and `scratchDir` are objects with real behavior:
- We should ask it to do something instead of knowing how it works inside
## Data Transfer Objects
Quintessential form of a data structure (data transfer object, or DTO):
- A class that has public variables but does not have functions
- Useful for databases communication, or parsing messages from sockets
### Active Record
- Special forms of Data Transfer Objects
- Are data structures with public variables
- Usually have navigational methods such as `save` and `find`
- The good practice is to treat Active Record as data structures
## Conclusion
> Objects expose behavior and hide data; Data structures expose data and have no significant behavior.
More flexible when:
| | Objects | Data types and procedures |
|:---------------------- |:-------:|:-------------------------:|
| **Add new data types** | V | |
| **Add new behaviors** | | V |
###### tags: `learn` `clean code` `test automation`