Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-03-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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
    { Private declarations }
  public
    { Public declarations }
    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  // Si el archivo indicado no existe
  Begin
    // Intentamos con uno de respaldo
    Path := 'C:\Respaldos\' + ExtractFileName (Path);

    If Not FileExists (Path) Then  // Si el respaldo tampoco existe
    Begin
      Result := Nil;  // No hay archivo con ese nombre, situación aceptable
      Exit;
    End;
  End;

  Result := Create (Path);
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
  { Sin el método TXFile.Make (o una función que haga lo mismo que Make),
    este bloque de código sería más grande: }
  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!
Responder Con Cita
  #2  
Antiguo 07-03-2013
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Build?

// Saludos
Responder Con Cita
  #3  
Antiguo 07-03-2013
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Al González
Y bueno, también está la opción de crear una función normal o de otra clase, que haga la tarea
Podría ser algo así:

Código Delphi [-]
TXFile = class
  ...
end;

TXFileFactory = class
public
  [class] function Create(Path: String): TXFile;
end;

// Saludos
Responder Con Cita
  #4  
Antiguo 07-03-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Gracias Román.

Una hora más temprano que ayer, pongo una breve lista de posibles nombres:
  • Make
  • TryCreate
  • Build
  • CreateBy
  • Produce
  • Generate
  • Construct
Me estoy inclinando por Produce. Make da la simple idea un tanto vaga de "hacer algo", mientras que Produce es más concreto y sugiere la "construcción de algo" (un objeto) y a la vez sugiere que "produce un resultado" (que podría ser Nil).
Responder Con Cita
  #5  
Antiguo 07-03-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.340
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Creo que alguien ha comentado el CreateOrNil. No suena muy bien, pero es descriptivo 100%. Recordemos que Delphi ya cuenta con un FreeAndNil.
Es por si ya te estabas decidiendo... Para que tengas un poco más de dudas...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 07-03-2013
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola Al, creo que el concepto o palabrita que buscas es Materializar, o Materialize en inglés.
Este término se emplea en los frameworks de persistencia, y a mi ver Materializar no es propio de la persistencia en bases de datos, sino en su forma abstracta. Asi que no veo el porqué no aprovecharlo.

Ahora, respecto a la utilidad del código, si me lo permites quisiera preguntar algo ¿Donde o que clase "cliente" lo utilizará o invocará al método en cuestión? ¿O es que no existe un lugar concreto donde usarlo?
Como seguramente ya has visto un diseño de resultado booleano (objeto|nil) llevará a que al final se deba hacer una comprobación posterior, o bien hacer uso de try.
Ahora bien, si en verdad nil es un resultado realmente válido (tiene un significado real y está aceptado en el contexto) y no deja al objeto que cumple el rol del creador en un estado inconsistente no hay problemas. Pero si este nil en realidad no responde a un resultado aceptable y tolerable lo correcto sería que no se devolviese nil sino que se eleve una excepción. Como nombre podría sugerir EUnmaterializedException o ETXFileUnmaterializedException.

De este modo en donde se lo invoque simplemente se trabaja directamente con try y poder volver a un estado de calma sin estar alterando el flujo principal del código.

Por otro lado, Al... me huele a que estás diseñando una Fábrica.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 07-03-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 21
ozsWizzard Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
Creo que alguien ha comentado el CreateOrNil. No suena muy bien, pero es descriptivo 100%. Recordemos que Delphi ya cuenta con un FreeAndNil.
Es por si ya te estabas decidiendo... Para que tengas un poco más de dudas...
He sido yo

Tampoco ha puesto el nombre que sugerí de "Instanciar", no le habrá gustado, jeje.

Por otra parte, con la forma en la que crea los objetos, este trozo de código que ha puesto Al, petaría (daría una excepción):

Código Delphi [-]
procedure TForm1.FormDestroy(Sender: TObject);
begin
  XFile1.Free;
  XFile2.Free;
  XFile3.Free;
end;
__________________
La Madurez se llama...
~~~Gaia~~~
Responder Con Cita
  #8  
Antiguo 07-03-2013
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por ozsWizzard Ver Mensaje

Por otra parte, con la forma en la que crea los objetos, este trozo de código que ha puesto Al, petaría (daría una excepción):

Código Delphi [-]
procedure TForm1.FormDestroy(Sender: TObject);
begin
  XFile1.Free;
  XFile2.Free;
  XFile3.Free;
end;
¿Donde está el problema? Free es un método seguro. Si las instancias XFile1, XFile2 y XFile3 no fueran válidas (nil) Free lo detectará y no intentará liberar algo que ya fue liberado o bien nunca fue creado.

Un objeto se crea totalmente o no se crea nada. No hay términos medios.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 07-03-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por Neftali Ver Mensaje
Es por si ya te estabas decidiendo... Para que tengas un poco más de dudas...
Ahora mismo mis dudas es si la discusión estilo narco / mafia que se desarrolla justo afuera de mi ventana tendrá repercusiones en nuestra vida. Y si lograremos encontrar un sitio más económico (y seguro) antes de que la renta venza.



--------------

Volviendo al tema, es algo que implementaré en un par de clases de GH Freebrary. Cuando esté listo lo subiré y ya me dirán si estoy haciendo bien las cosas.

Descarto los nombres que llevan la palabra Create o Instantiate porque son demasiado "fuertes" en el sentido de que parece que forzosamente se creará un objeto. Y lo del AndNil / OrNil los veo como recursos léxicos baratos; lo identificadores debieran llevar lo menos posible preposiciones, conjunciones y similares (hago uso de ellos en contadas ocasiones).

Saludos.
Responder Con Cita
  #10  
Antiguo 07-03-2013
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por dec Ver Mensaje
pero, ¿serviría de algo lanzar la excepción en el constructor del objeto? Me refiero a si tiene sentido en el contexto en que nuestro amigo Al trabaja. Además no me queda muy claro el uso de excepciones tal que así:

Código Delphi [-]
try
  obj := TMyObject.Create();
except
  on E : Exception do
  begin
    // Manejamos la excepción, pero,...
  end;

  // ¿qué pasa con el código situado aquí debajo?

end;
Pues, por eso dije que lo sano según OO sería arrojar una excepción. Pero el contexto/uso/modo de esta problemática como que me rompe los moldes y no ando seguro.
Respecto al código de ejemplo, me hago la misma pregunta que tu. ¿Que pasa allí abajo?

Al, no es que esté mal o bien... sino que es diferente. Si no es mucha molestia, ¿Podrías concretar un poco más? Y como dije antes... me gustaría saber que significaría un resultado nil. Creo que ello ayudaría a entender mejor el panorama y ver alternativas.

Aunque admito que mi ración de neuronas despiertas del día son escasas... tengo un diagrama de estados para una clase que acaparó demasiados recursos y mi cerebro no ha logrado restablecer la electricidad

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Encontrar objeto por su nombre, encontrar metodo, ejecutar metodo coso Trucos 7 02-09-2011 00:23:13
Cambiar el nombre de la clase. rauros Varios 2 02-08-2008 20:56:44
Crear formularios a partir de su nombre de clase kes .NET 6 21-02-2008 08:06:07
Crear Objeto por su nombre de clase jlrbotella OOP 2 08-01-2008 23:44:37
nombre de variables de una clase Mariana OOP 8 25-10-2005 17:48:34


La franja horaria es GMT +2. Ahora son las 20:47:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi