Right now its standard practice for retrieval BUT i think it should be avoided whenever possible.
Whereas if you have a unique name for the same asset like:
now you have given real meaning to the URL - for humans and for search engines. and you have a flexible system. you can change the ID of that product, you can add variations and accessories, it can go out of stock - and the URL remains the same.
If you are using forms then you can pass the ID in a hidden form field. It also allows you to do other kinds of checks - like you can validate and check the value of that field in your constructor - and if no good - for example the form was filled in by a rogue bot - bounce to a different page or class before any other actions.