Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: DragoRosso - Ottobre 24, 2023, 11:48:07 am

Titolo: Porre a nil la "propria" istanza di un oggetto in creazione ....
Inserito da: DragoRosso - Ottobre 24, 2023, 11:48:07 am
Salve a tutti,

vorrei porre una domanda che sinceramente non mi sono mai posto, ma la cui risposta ora mi sarebbe utile.
Come porre a nil la risultante della creazione di un oggetto, però durante la creazione dello stesso oggetto (o meglio della sua istanza)?

Faccio un esempio concreto:

Codice: [Seleziona]
type TMiaClasse = Class
     .....
     .....
   public
      constructor Create(....): override;     
end;

constructor TMiaClasse.Create(....);
begin
   inherited Create;
   ....
   ....
  if qualcosa_è_andato_male then
    begin
       !!! Qui vorrei fare qualcosa per ritornare NIL invece del solito handle alla classe .....
       !!! Ovviamente dovrò anche andare ad effettuare il "destroy" in qualche modo, avendo effettuato il CREATE .....
    end;
end;

//Uso

var MiaClasse = TMiaClasse;

begin
    MiaClasse := TMiaClasse.Create(....); //QUI MIACLASSE DOVREBBE ESSERE A NIL SE QUALCOSA VA' STORTO.
end;

Attualmente, come penso facciano tutti, setto un flag interno se qualcosa non và e tramite un proprietà pubblica in sola lettura vado a vedere se il flag è settato e pongo a nil la variabile (eventualmente effettuando il free se non è già a nil).

L'alternativa è generare una eccezione e tracciare con il try / except e gestire come per il flag sopra descritto l'eccezione.

Diciamo che il modo naturale è l'eccezione, ma a me non piace molto perchè in passato qualche problema l'ho avuto e preferirei che le eccezioni rimangano relegate a livello di metodo senza uscire dal begin / end

Attendo vs. proposte

Grazie e ciao ciao
Titolo: Re:Porre a nil la "propria" istanza di un oggetto in creazione ....
Inserito da: nomorelogic - Ottobre 24, 2023, 12:07:55 pm
ciao
ora non riesco a provare con lazarus
mi verrebbe da dire se si riesce ad impostare self a nil da dentro il costruttore

forse l'ho sparata grossa  ;D


PS:
creare una factory in cui incapsulare il tutto?

Codice: [Seleziona]
var MiaClasse = TMiaClasse;

begin
    MiaClasse := MyClassFactory(TMiaClasse); // al rientro dalla funzione/factory basta impostare a nil
end;


Titolo: Re:Porre a nil la "propria" istanza di un oggetto in creazione ....
Inserito da: DragoRosso - Ottobre 24, 2023, 02:22:52 pm
Uhmm, la classfactory mi imporrebbe di creare dei doppioni per ogni classe gestita in quel modo, ma non risolve alla base il problema (@nomorelogic, brillante idea comunque) ... effettivamente provo a vedere il self .... potrebbe non essere così sciocca la pensata ... il metodo "constructor" è comunque statico e quindi non dovrebbe "crashare" al free del self e alla sua messa a nil ...

Provo velocemente e poi riporto.
Titolo: Re:Porre a nil la "propria" istanza di un oggetto in creazione ....
Inserito da: DragoRosso - Ottobre 24, 2023, 03:48:35 pm
L'uso del self sarebbe stata una bella idea ... troppo brillante ...

No non funziona. Di fatto durante la creazione è tutto OK, compresa il "free", ma ciò che accade una volta che il metodo Create termina ... ecco li stà il problema.

In pratica dopo il Create vengono gestiti altri metodi più o meno nascosti come l' AfterConstruction ove viene usata l'istanza della classe appena creata ( e distrutta ...  :'( ) e ovviamente viene generata una eccezione.

Dovevo comunque pensarci, dopo la creazione dell'istanza devono venire comunque gestiti tutta una serie di "dati di contorno" che servono ad ottimizzare l'istanza stessa rispetto al runtime (ad esempio il "reference counting").

Quindi questo non è un percorso percorribile, almeno non così semplicemente.

Il metodo naturale è quello di usare una eccezione, che se generata nel metodo Create fà in modo di ritornare un riferimento a nil della classe.

Ovviamente deve essere gestito il try / except nel blocco dove uso (cioè creo) la classe.

L'alternativa è la class factory suggerita da @nomorelogic.

Farò ulteriori test a riguardo.
Titolo: Re:Porre a nil la "propria" istanza di un oggetto in creazione ....
Inserito da: quack - Ottobre 24, 2023, 06:25:00 pm
Hai provato con Fail ?

https://www.freepascal.org/docs-html/rtl/system/fail.html (https://www.freepascal.org/docs-html/rtl/system/fail.html)

Ciao
Titolo: Re:Porre a nil la "propria" istanza di un oggetto in creazione ....
Inserito da: nomorelogic - Ottobre 24, 2023, 06:29:00 pm
Fail non lo conoscevo
Sembra fatto apposta per il problema di DragoRosso
Titolo: Re:Porre a nil la "propria" istanza di un oggetto in creazione ....
Inserito da: DragoRosso - Ottobre 24, 2023, 06:52:15 pm
Hai provato con Fail ?
https://www.freepascal.org/docs-html/rtl/system/fail.html (https://www.freepascal.org/docs-html/rtl/system/fail.html)
Ciao

Fail non lo conoscevo
Sembra fatto apposta per il problema di DragoRosso

Proprio lui ... più tardi lo provo. Grazie @quack.
Titolo: Re:Porre a nil la "propria" istanza di un oggetto in creazione ....
Inserito da: quack - Ottobre 24, 2023, 07:42:55 pm
Prego @DragoRosso, mi fa piacere essere stato d'aiuto.