To me Undo is one of those features that make a lot of sense internally because it forces a certain structure to your data. Whether you're doing it by commands or snapshots, the end result is a heavy separation of concerns that makes a product's internal architecture easier to maintain in the long run.
Having a user-facing "undo" action at that point is almost a side effect of just good internal metaphors.
Having a user-facing "undo" action at that point is almost a side effect of just good internal metaphors.