I use a template that creates what you might called "structured comments" when I start a file, this provides a section (analogous to the C# #regions) for each classification of member, so the breakdown is like
internal members
internal static members
internal constant members
private members
//etc
protected members
//etc
public members
//etc
then repeat above with properties
then the constructors
then repeat above with
commands:pub,prt,pvt (fns that return void)
event handlers
functions:pub,prt,pvt
end of class
This forces you to think of and remember the role a member has, before and after its creation. As development proceeds, I generally put new functions at the bottom of the proper section until they mature, then migrate them to a position in the section that is dependency or functionally based.
Once you have that in place, make some macros so you can quickly jump to the end of a section, I use a popup menu -
internal,public,protected,private
|[static,const]
|members,properties,ctors,commands,functions
so the keystrokes are alt-q, (popup), 1,3,2 -- to take me to internal const properties
(sorry about the lingo, a const property is simply one with no setter)
To add to this, I create an expansion macro that will popup a dialog asking for name, params and retval -- then it creates the stub according to the section you are in.
I have found that this type of boundary grouping works best, compared to clusters of members or some other scheme -- it forces you to think about architecture.
Here is a snippet of what it looks like in real life
//#+, public members
//;
//#+*, public static members
// ReSharper disable UnaccessedField.Local
// ReSharper disable InconsistentNaming
/// <summary>
/// Public Static Members
/// </summary>
private static object __UtilsWin32_public_static_members;
// ReSharper restore InconsistentNaming
// ReSharper restore UnaccessedField.Local
#region "public_static_members"
// Z_DOT typedef EnumWindowsProc(int hwnd_, int lparam_):bool ::UtilsWin32::UtilsCL:UtilsWin32.cs z.1711900400436177.2009.05.18.07.08.11|+*,
/// <summary>
/// Delegate for EnumWindowsProc
/// </summary>
/// <param name="hwnd_">The window</param>
/// <param name="lparam_">The lparam</param>
/// <returns><c>true</c> to keep enumerating</returns>
public delegate bool EnumWindowsProc(int hwnd_, int lparam_);
// Z_DOT typedef EnumWindowsProcIntPtrIntPtr(IntPtr hwnd_, IntPtr lparam_):int ::UtilsWin32::UtilsCL:UtilsWin32.cs z.3908448500234277.2011.06.16.12.14.08|+*,
/// <summary>
/// Delegate for EnumWindowsProcIntPtrIntPtr
/// </summary>
/// <param name="hwnd_">The window</param>
/// <param name="lparam_">The lparam</param>
/// <returns><c>true</c> to keep enumerating</returns>
public delegate int EnumWindowsProcIntPtrIntPtr(IntPtr hwnd_, IntPtr lparam_);
//;
#endregion
//#+*@, public static const members
//;
//#+@, public const members
//;
//;
//#%, protected members
//;
//#%*, protected static members
//;
//#%*@, protected static const members
//;
//#%@, protected const members
//;
//;
The //; is the expansion macro point mentioned above.