I think the question is asked very generic, but I usually differ between concept and refinement when creating a GH definition.
In concept phase I build a geometry in multiple ways, not caring about any best practise. It’s just to find out which approach works best. In refinement phase I begin to limit Parameters, creating as many constants as possible. Furthermore I combine functionality in script components, because by writing code you can handle edge cases much better. I rather do care about Surface and Curve direction but some components may lead to loosing that order. So in my definitions its likely to find functionality to sort geometry. A positive side effect of introducing script components is the reduction of necessary tree manipulation. And then the right level of encapsulation and documentation is important as well. Furthermore I would advise not to do anything in Grasshopper, but use GH definition as an assisting tool. It may lead to a bit of repetitive work at some point, but it always leads to better geometry in the end. And as a general advise, I care about details from beginning on. Work as simple as possible but as complicated as required. For geometry, especially for Surfaces this means that the properties of my geometry should not contain more information to represent a shape as required.