I think the question is too general in nature so the only possible answer is "it depends."
The right way to structure the contract depends on what the contract is supposed to do. Deployment is a specific step in the lifecycle of the contract. What needs to happen at that stage?
For example, it might be unacceptable to have an instance of the contract in an unconfigured state. If so, then do it in the constructor so everyone can be sure that such a situation isn't possible.
Upgradeable contracts using the Proxy system cannot be initialized in the constructor. In that case, the choice is clear.
In practice, I would say every parameter needs to be looked at separately. Should it be set by the constructor? Should it be modifiable? Should it be immutable?
In the case that something should not be modifiable, it will actually be easier to codify that with a constructor - otherwise you have to work out logic to make sure it doesn't happen twice. You can also use
immutable to save on gas.
Hope it helps.