Muchas gracias por sus valiosas respuestas.
He tenido la sensación de estar enfocando mal el problema, pero algo me dice quizá no voy tan mal. Elevar excepciones desde el interior de un constructor es algo normal cuando no están dadas las condiciones estrictamente necesarias para que la instancia exista. Pero a veces la instancia puede o no puede existir, sin que lo último amerite generar un error o aviso.
Hice un ejemplo un poquitín menos "abstracto":
Código Delphi
[-]type
TXFile = Class
Constructor Create (Const Path :String);
Class Function Make (Path :String) :TXFile;
End;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
public
XFile1, XFile2, XFile3 :TXFile;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Constructor TXFile.Create (Const Path :String);
Begin
End;
Class Function TXFile.Make (Path :String) :TXFile;
Begin
If Not FileExists (Path) Then Begin
Path := 'C:\Respaldos\' + ExtractFileName (Path);
If Not FileExists (Path) Then Begin
Result := Nil; Exit;
End;
End;
Result := Create (Path);
End;
procedure TForm1.FormCreate(Sender: TObject);
begin
XFile1 := TXFile.Make ('C:\Hugo.x');
XFile2 := TXFile.Make ('C:\Paco.x');
XFile3 := TXFile.Make ('C:\Luis.x');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
XFile1.Free;
XFile2.Free;
XFile3.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
If XFile1 <> Nil Then
If XFile2 <> Nil Then
If XFile3 <> Nil Then
end;
Lo de
Make fue por buscar un sinónimo de
Create, algo que, quizá (y ahí tengo mi mayor duda) pudiera llegar a ser acuñado y con el tiempo dejar de sonar confuso o ambiguo. Una palabra que "insinúe" una acción semejante a la del constructor, pero que al mismo tiempo se diferencie de éste, entendiéndose que podemos obtener un Nil si cierta condición (que podría estar documentada) no se cumple en la llamada a ese método especial.
«Oh, mire compañero, la clase tiene método
Make, hay que usarlo en esta parte del programa. Según dice aquí, devuelve Nil cuando...»
Me empieza a gustar el nombre
TryCreate que propusieron en mensajes anteriores.
TryOrNil se entiende también, pero se pierde un poco el sentido de "crear".
Otro camino es que este tipo de métodos se definan con nombres más explícitos y acomodados a cada clase y situación en particular, con lo cual ya no tendríamos una
candidatura a estándar.
Y bueno, también está la opción de crear una función normal o de otra clase, que haga la tarea, pero creo que es más correcto que la propia clase se encargue de validar o verificar lo que a la clase concierne. ¿No creen?
Bueno, a alguna conclusión habremos de llegar entre todos.
¡Saludos!