Interesante hilo Edgar.
Concuerdo con los que dicen que lo mejor es aprovechar un poco de cada mundo. La propia VCL utiliza CamelCase con una especial variación para las "constantes de grupo" similar a la Notación Húngara, pero cuyo prefijo, en este caso de dos letras minúsculas, no necesariamente indica el tipo de dato sino además (o en lugar de eso, cuando son enteros y no enumerados) el grupo al cual pertenecen. Un ejemplo clásico son las constantes dsBrowse, dsEdit y dsInsert que pertenecen al tipo enumerado TDataSetState (el "grupo" de estados de conjuntos de datos).
En particular, cuando se trata de alguna biblioteca de propósito general (es decir, no código particular de una aplicación específica), utilizo un prefijo en minúsculas para los nombres de sus funciones (no así los métodos) que identifica la biblioteca a la que pertenecen dichas funciones. Y para las constantes de grupo, en lugar de utilizar dos letras como lo acostumbra Borland, utilizo tres, además del prefijo que identifica a qué biblioteca pertenecen.
Para dar una idea, estas son algunas muestras de lo que he escrito últimamente:
Código Delphi
[-]
TghSavePointAction = (ghspaNone, ghspaConfirm, ghspaRestore);
Código Delphi
[-]
TMagiaClientDataSetSavePoint = Class (TghCustomSavePoint)
Protected
State :Integer;
Procedure InternalConfirm; Override;
Procedure InternalRestore; Override;
Procedure InternalSave; Override;
Procedure Invalidate (
DetailAction :TghSavePointAction = ghspaNone); Override;
End;
Código Delphi
[-]
Function TMagiaSQLConnection.ExecProc (Const Proc :String;
Const Params :Variant) :Variant;
Var
I :Integer;
AParams :Variant Absolute Params;
Begin
With TSQLStoredProc.Create (Self) Do
Try
SQLConnection := Self;
StoredProcName := CasedName (Proc);
If VarIsArray (AParams) Then
For I := 0 To VarArrayHighBound (AParams, 1) Do
ghInputParam (Params, I).Value := AParams [i]
Else
ghInputParam (Params).Value := AParams;
ExecProc;
I := ghOutputParamCount (Params);
Case I Of
0 : Result := Null;
1 : Result := ghOutputParam (Params).Value;
Else
Begin
Result := ghVariantArray (I);
For I := 0 To I - 1 Do
Result [i] := ghOutputParam (Params, I).Value;
End
End;
Finally
Free;
End;
End;
Ésta última me da un poco de pena porque, como bibliotecario partidario de la atomización, hago mucho hincapié en que las rutinas no tengan más de 20 o 30 líneas de código, y ese método en particular tiene 43.
Nótese que los identificadores y comentarios están en inglés, y esto es porque se trata de bibliotecas de propósito general que cualquier programador del mundo podrá llegar a utilizar. Pero cuando es código particular de una aplicación, por lo general empleo el idioma español para sus identificadores y comentarios.
Y como habrán visto, soy poco convencional con el asunto de las mayúsculas, las minúsculas, la separación de bloques y paréntesis y la declaración de elementos tipificados. Es el resultado de un estilo que fui desarrollando con los años, pienso yo para bien, y que procuro respetar al pie de la letra manteniendo consistente mi código.
Nada que ver con la manera en que programaba en 1993, durante mi época de estudiante
:
Código Delphi
[-]
PROCEDURE FORMAR;
BEGIN
TEXTCOLOR (0);
YANO := FALSE;
Y := - (ANY - 1);
REPEAT
INC (Y, ANY);
X := - (ANX - 1);
REPEAT
INC (X, ANX);
TEXTBACKGROUND ( ARCOLOR [RANDOM (MAXCOLOR)] );
VENTIW (X, Y, X + (ANX - 1), Y + (ANY - 1) );
UNTIL X >= 75;
UNTIL Y >= 21;
END;
¡No me pregunten para qué era esa rutina!
Por cierto, otra cosa que acostumbro es no utilizar más allá de la columna 75 por aquello de querer imprimir el código o mostrarlo en una pantalla de menor tamaño. Además de que resulta
más cómodo de leer un texto que no es muy ancho (de ahí el estilo de los diarios).
Un abrazo a todos.
Al González.