I think we're falling on the side of pedantism over practicality. I'd say any interface with "start" and "stop" should do this internal state check, for robustness in two situations:
(a) The caller doesn't know if it's started yet, but needs it started; and
(b) The caller doesn't know if it's stopped yet, but needs it stopped.
For the caller to guarantee "preconditions" means each caller must track or query the state of the object being started/stopped, which is dangerous and redundant.
I think we're falling on the side of pedantism over practicality. I'd say any interface with "start" and "stop" should do this internal state check, for robustness in two situations:
(a) The caller doesn't know if it's started yet, but needs it started; and
(b) The caller doesn't know if it's stopped yet, but needs it stopped.
For the caller to guarantee "preconditions" means each caller must track or query the state of the object being started/stopped, which is dangerous and redundant.