It really cannot be stressed enough just how important keeping these two things are; by not doing so, you'll eventually end up with completely unmanageable code -- striving for a deterministic structure is crucial.
I'd suggest using the const keyword (C and C++), or whatever may be equivalent in your language of choice on your draw method and argument (if applicable). This makes it read-only, and helps to ensure that you cannot modify the rendering state. It can be a pain at times during early development of the engine, but is one of the many things that has definitely helped me in the longer run.
(I'm not saying you should necessarily use this structure, but showing just as an example...)
// Pure virtual abstract class for any object that can be rendered
class IDrawable
{
public:
IDrawable() {}
virtual ~IDrawable() {}
// Take care of object's frame logic needs here, i.e.: rendering
// coordinates or what not
virtual void update(float delta) = 0;
// const on the argument 'ctx' prevents me from modifying the global state
// of the rendering context, and const at the end of the method declaration
// prevents me from modifying the object's internal state.
//
// No doubt is this annoying at times, but has been great for me in
// encouraging careful consideration in how I structure things, ultimately
// leading to less bugs.
virtual void draw(const SDL_Renderer* ctx) const = 0;
};