Nie ma najlepszych praktyk. Podstawową rzeczą, jaką należy zrobić, jest jednak to, aby upewnić się, że zawsze jest jasne, kto jest odpowiedzialny za zniszczenie przedmiotu w danym momencie, nawet gdy wystąpi wyjątek.
Nie ma nic złego z funkcją tworzenia nowej instancji i zwrot. Taką funkcją jest factory. Można traktować go jak konstruktora klasy, więc należy upewnić się, że zachowuje się jak konstruktor: albo powrót ważny obiekt lub wyjątek. Nigdy nie zwraca referencji zerowej.
function Func: TMyObj;
begin
Result := TMyObj.Create;
try
Result.X := Y;
except
Result.Free;
raise;
end;
end;
To schemat obsługi wyjątków, którego nie widać zbyt często, ale jest ważny dla tego stylu funkcji. Wracając własności obiektu transfery z funkcji do rozmówcy, ale tylko wtedy, gdy uda się całkowicie wykonać. Jeśli musi wyjść wcześniej z powodu wyjątku, uwalnia obiekt, ponieważ osoba dzwoniąca nie ma możliwości jego uwolnienia. (Funkcje, które kończą się z powodu wyjątku nie mają wartości zwracanych.) Dzwoniący będzie go używać tak:
O := Func;
try
writeln(O.X);
finally
O.Free;
end;
Jeśli istnieje wyjątek w Func
następnie O
nigdy nie zostanie przypisany, więc nie ma nic dostępny dla rozmówcy do wolny.
Kiedy rozmówca tworzy obiekt i przekazać je do innej funkcji, aby ją zainicjować, nie rób parametru parametr „var”. Wprowadza to pewne ograniczenia dla osoby dzwoniącej, która musi używać zmiennej dokładnie typu żądanego przez funkcję, nawet jeśli został utworzony jakiś typ potomka.
Taka funkcja powinna , a nie uwolnić obiektu. Osoba dzwoniąca nie nadaje odpowiedzialności za funkcje, które wywołuje, szczególnie gdy planuje użyć obiektu po powrocie funkcji.
dziękuję za skontaktowanie się ze mną :) wspaniała odpowiedź –