The recommended way to create updatable contracts is to create a proxy contract which then calls an origial contract. I haven’t worked with proxy contracts yet, but I’ve seen the code and it appeared to be complex for such a simple task.
Instead, why not store a file with the address of a smart contract in IPFS, and then fetch a file from a proxy contract? Whenever a smart contract is updated, edit a file in IPFS to reflect a change. This way, code will become way simpler and may not even require a proxy contract.