문제

그렇다면 레코드를 초기화하는 데 선호되는 방법은 무엇입니까?

'공장 기능' 사용:

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;

또는 생성자:

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;

생성자가 더 캡슐화되어 있다고 생각하지만 코드를 읽을 때 혼동되기 쉽습니다.무료 호출이 부족한 클래스처럼 보입니다.입력하는 것도 더 많습니다...

왜 다른 것보다 하나를 선호합니까?

도움이 되었습니까?

해결책

나는 수업을 선호하지만 수업을 사용해야한다면 레코드를 가능한 한 수업과 비슷한 것으로 취급하고 싶습니다. 그래서 나는 레코드 생성자를 사용합니다.

그러나 기록과 단위가있는 성가신 버그가 있습니다. 함수가 레코드를 반환하면 (메서드와 함께)이 메소드에 액세스하려면 내부 오류가 발생합니다. 다른 변수에 할당하여 이것을 우회 할 수 있습니다.

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;

다른 팁

나는 "공장 방법"을 선호합니다

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

별도의 공장 기능 누출 배출 및 레코드 생성자는 IMHO를 혼동합니다.

제가 만든 Delphi 프로젝트에서는 목록의 오버헤드 양을 줄이기 위해 클래스 대신 레코드를 사용했습니다.동적 배열에 수백 개의 레코드가 있으므로 두 개의 레코드를 만들었습니다.첫 번째 기록은 항목 자체에 대한 것이었습니다.필드는 비공개로 설정되었으며(예, 레코드로 비공개/보호를 사용할 수 있음) 공개 섹션에 읽기 전용 속성을 추가했습니다.올바른 방식으로 레코드를 초기화하기 위해 추가 생성자도 추가되었습니다.이 설정을 통해 다른 개발자로부터 이 기록의 내용을 보호할 수 있었습니다.두 번째 레코드는 이전 레코드 유형의 동적 배열을 둘러싼 래퍼였습니다.배열은 비공개이므로 이 목록에서 레코드를 가져오고 추가하고 삭제하는 메서드를 추가했습니다.결과적으로 전체 목록은 다른 개발자의 오용으로부터 보호되며 일반 TList/TObjectList 솔루션보다 오버헤드도 훨씬 적습니다.

기록은 수업이 아니라는 점을 명심하세요.생성자 및 기타 메서드는 상속할 수 없습니다.WIN32 환경에서는 실제 클래스보다 기능이 적습니다..NET에서는 다시 클래스로 승격됩니다.그리고 개발자가 레코드의 각 필드 내용을 쉽게 수정할 수 있는 경우 생성자 추가를 사용하는 것은 그리 유용하지 않습니다.대신 해당 필드를 보호하려면 생성자를 사용해야 합니다.

나는 보통 레코드 용 생성자를 만들지 않습니다. 모든 버전 (및 FPC)과 호환되지는 않습니다. 또한 일반적으로 그들은 한 곳에서만 사용되며 종종 필 차기로 충분합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top