There is not very much difference between get() and get_next_item(). The only difference is that get() will automatically call item_done() for you after it gets the next item.
With get_next_item(), you must call item_done() yourself. Your sequences will be blocked until item_done() is called.
You do not need to call put() unless you are returning a response form the driver. If you use get_next_item(), you must send the response through item_done(). One way is not “better” than the other. They both require two calls when sending a response. Actually, if there is no response, then get() will only require one call.
I prefer to use get() because of its similarity to other TLM functions. get_next_item(), in my opinion, is just there for backward compatibility, or for the occasional case where you want to keep your sequences blocked while your driver executes some code.
-Kurt