Tengo una función en mi aplicación que necesita para devolver una matriz. He encontrado en un par de lugares de cómo hacer esto al declarar el tipo de matriz, por ejemplo,

type
  TStringArray = array of string; 

Y, a continuación, la declaración de mi función

function SomeFunction(SomeParam: Integer): TStringArray;

Mi problema es tratar de configurar esto en una forma que tiene la interfaz y la implementación. ¿Cómo puedo declarar mi tipo y tienen una función a la declaración de ese tipo en la interfaz ?

  • «La matriz de la cadena» es generalmente considerado «no idiomática» en Delphi. TStringList es generalmente preferido.
  • Normalmente yo uso el «DynArray» sufijo para la denominación de este tipo de definición, con el fin de hacer una distinción entre una dinámica y una matriz estática: TStringDynArray = array of string; TStringArray = array[0..(maxInt div sizeof(string))-1] of string; Pero no hay ningún oficial de la convención sobre ella.
  • P: tenga en cuenta que el nuevo FileIO unidad de usa que es parte de la XE RTL utiliza TStringDynArray ampliamente. Así que no estoy de acuerdo que no es idiomática. Especialmente si usted desea devolver la matriz y recorrer con un enumerador esto es muy conveniente (ver TDirectory.GetFiles para un ejemplo).
  • P: Un punto más: la devolución de un TStringList es aún menos idiomáticas, porque viola el «creador es responsable de la destrucción» principio
  • Normalmente, iba a pasar en una lista de cadenas en lugar de ello, Smasher. Eso significa que yo iba a escribir SomeFunction(other_parameters; outData:TStringList):Boolean; o SomeProcedure(other_parameters; outData:TStringList);. También no idiomática para volver a una asignación de objeto, como usted dice. Así que no.
  • Que utiliza FileIO? Quien escribió que va en contra de un convenio observa casi universalmente en otros lugares en el RTL y VCL.
  • ¿Cuál es el punto de esta convención? Me parece for FileName in TDirectory.GetFiles do ... mucho más elegante que el StrList := TStringList.Create; try TDirectory.GetFiles (StrList); for FileName in StrList do ... finally StrList.Free; end; ¿existen desventajas de la matriz de enfoque? De lo contrario, no hay ninguna razón para no usarlo en mi humilde opinión
  • BTW: yo estaba hablando acerca de IOUtils de curso

InformationsquelleAutor Joe | 2011-05-26

2 Comentarios

  1. 33
    unit Unit1;
    
    interface
    
    uses SysUtils;
    
    type
      TStringArray = array of string;
    
    function SomeFunction(SomeParam: integer): TStringArray;
    
    ...
    
    implementation
    
    function SomeFunction(SomeParam: integer): TStringArray;
    begin
      SetLength(result, 3);
      result[0] := 'Alpha';
      result[1] := 'Beta';
      result[2] := 'Gamma';
    end;
    
    ...
    
    end.

    La regla de oro es que la interfaz de la sección de una unidad describe los tipos de datos utilizados por la unidad, y los tipos, clases y funciones (sus firmas) que residen en la unidad. Esto es lo que todos otros unidades ver. La sección de implementación contiene la implementación de las clases y funciones. Esto no es visible para posterior de las unidades. Otras unidades de la necesidad de atención acerca de la interfaz de la unidad, el «contrato» firmado por la unidad y la unidad externa, no a los detalles de implementación que se encuentra en la sección de implementación.

  2. 13

    Si Delphi es bastante reciente, no es necesario declarar un nuevo tipo, declarándolo como TArray<String>.

    Ejemplo copiado y pegado de la respuesta anterior:

    unit Unit1;
    
    interface
    
    function SomeFunction(SomeParam: integer): TArray<String>;
    
    implementation
    
    function SomeFunction(SomeParam: integer): TArray<String>;
    begin
      SetLength(result, 3);
      result[0] := 'Alpha';
      result[1] := 'Beta';
      result[2] := 'Gamma';
    end;
    
    end.
    • +1 para el uso de genéricos
    • TArray<T> (y de Genéricos en general) no está exenta de algunos problemas, así que tenga cuidado con ella.

Dejar respuesta

Please enter your comment!
Please enter your name here