Pregunta

Entonces, ¿cuál será la mejor manera de inicializar los registros?

Con una 'fábrica de función':

TMyRecord = record
  valueX: integer;
  valueY: integer;
end;

function MyRecord(const AValueX, AValueY: integer): TMyRecord;
begin
  result.valueX := AValueX;
  result.valueY := AValueY;
end;

var
  myrec: TMyRecord;
begin
  myrec := MyRecord(1, 2);
end;

o un constructor:

TMyRecord = record
  valueX: integer;
  valueY: integer;
  constructor Create(const AValueX, AValueY: integer);
end;

constructor TMyRecord.Create(const AValueX, AValueY: integer);
begin
  self.valueX := AValueX;
  self.valueY := AValueY;
end;

var
  myrec: TMyRecord;
begin
  myrec := TMyRecord.Create(1, 2);
end;

Siento que el constructor de las cosas más encapsulado, pero es fácil confundirse cuando la lectura del código.Esto hace que se vea como una clase que falta una llamada gratuita.También es más de tipo...

¿Por qué preferir una sobre la otra?

¿Fue útil?

Solución

Yo prefiero clases, pero si tengo que usar registros, me gustaría tratarlos lo más similar posible de clases. Así que uso el constructor registro.

Pero hay un molesto error con los registros y unidades. Si una función devuelve un registro (con métodos), se produce un error interno, si desea acceder a estos métodos. Puede evitar este asignándole a otra variable:

type 
  TMyRec = record
    ..
    procedure X;
  end;


function GetRec: TMyRec;



procedure Test;
var
  r1, r2 : TMyRec;
begin
  r1 := GetRec;
  r1.X; // internal error
  r2 := r1;
  r2.X; // No internal error;

Otros consejos

Prefiero "método de fábrica" como

  function TMyRecord.CreateRec(const AValueX, AValueY: integer): TMyRecord;

Aparte de fábrica la función de fugas incapsulation y registro de constructores acaba de confundir en mi humilde opinión.

En un proyecto de Delphi que creé, he utilizado los registros en lugar de clases para reducir la cantidad de sobrecarga en una lista. Me gustaría tener varios cientos de registros en una matriz dinámica así que creé dos registros. El primer disco fue para el artículo en sí mismo. Los campos fueron hechas privada (sí, puede utilizar privado / protegido con registros) y se añade propiedades de sólo lectura a la sección pública. Un constructor adicional se añadió también al inicializar el registro en la forma correcta. Esta configuración permite que proteja el contenido de este registro de otros desarrolladores. El segundo disco fue sólo un envoltorio alrededor de una matriz dinámica del anterior tipo de registro. La matriz sería privada y yo añadido métodos para obtener, agregar y eliminar registros en esta lista. Como resultado, toda la lista está protegido contra el mal uso por otros desarrolladores y también tiene mucha menos sobrecarga que una solución periódica TList / TObjectList.

Tenga en cuenta que los registros no son clases. No se puede heredar los constructores y otros métodos. Tienen menos funcionalidad que verdaderas clases en entornos Win32. En .NET, sólo están promovidos a clases de nuevo. Y no es muy útil el uso de añadir un constructor cuando los desarrolladores pueden modificar fácilmente el contenido de cada uno y todos los campos de su registro. Debe utilizar constructores para proteger esos campos en su lugar.

Por lo general no crear constructores de registros. No es compatible con todas las versiones (y FPC). Además normalmente sólo se usan en un lugar y a menudo un FILLCHAR es suficiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top