You want to separate things because you can have a method process($products) and another one doSomething($products) and most likely there will also be doSomethingElse($products). Also, it helps to be able to have code between doSomething($products) and doSomethingElse($products). And when you call the doSomethingElse($products), most of the times you get to save the process iteration, and if you have multiple conditional processing, you end up with a cleaner code and easier to maintain. You can also extract all those types of things in some sort of config for different classes of items and you can change the order of things a lot easier. Especially if those doSomething calls are long calls, for generating files, sending notifications, computing complex things. Imagine you need to create some pdf files and send emails for some of the products, but not for all. It may not be the same type of email or PDF. Having this type of extraction, all you need to do is call the right method on processed data and it all works just fine. The extra "n" steps of iteration are nothing compared to the number of steps in making a file or sending an email or publishing things to rabbit, calling some api or whatever. Not to mention the fact that exception handling becomes a lot easier if you have the type of processing separated.