Interleaving computation and I/O at a fine-grained level throughout the code is an anti-pattern.
Consider two ways to write a parser:
The second involves the anti-pattern. It's bad because:
So less flexible, almost impossible to test thoroughly and performs badly.
Note that using async/await [] doesn't change any of this (indeed performance is even worse because async I/O has more overheads than synchronous I/O)
The anti-patterns location transparency and orthogonal persistence are aimed at making this anti-pattern "easier" by promoting the interleaving of computation and I/O by making it implicit. This is achieved in many software tools and libraries, such as Hibernate which aims to provide persistence transparency.