Ver Mensaje Individual
  #18  
Antiguo 04-11-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

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 [-]
    { Save Point Action type }
    TghSavePointAction = (ghspaNone, ghspaConfirm, ghspaRestore);
Código Delphi [-]
    { Magia Client Data Set Save Point class }
    TMagiaClientDataSetSavePoint = Class (TghCustomSavePoint)
      Protected
        { Fields }
        State :Integer;

        { Overridden methods }
        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;

    { Avoid conflicts with TSQLStoredProc.Params.  In cases like this, we
      prefer his method instead of to prefix the formal parameter with "A",
      so operative programmers don't feel confused (connection component
      has a Params property, "AParams" would be related with this
      property). }
    AParams :Variant Absolute Params;
  Begin
    With TSQLStoredProc.Create (Self) Do
      Try
        SQLConnection := Self;
        StoredProcName := CasedName (Proc);

        { Assign input parameters }
        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);

        { Return output parameter(s) or Null }
        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.

Última edición por Al González fecha: 10-12-2007 a las 06:20:54.
Responder Con Cita