@dalias You can just do "ip addr replace" instead of "ip addr add", it always works even if the device didn't have an address already. Same with "ip route replace", functionality which the old route command didn't even have: you have to explicitly delete the old route. By this metric, route is stateful and complex where ip is not! You can just replace the route.
The only problem I see is that bringing the interface up still requires a separate "ip link set eth0 up", but it's a no-op if it's already up so you can just alias it to write less.