OVH Cloud OVH Cloud

Constructeur

7 réponses
Avatar
Fabian Vilers
Bonjour à tous,

Imaginons une classe dont au passe au constructeur une string représentant
le chemin absolu vers un fichier. Au sein du constructeur, on test si le
fichier existe. S'il existe, on continue. S'il n'existe pas, il faudrait que
l'objet ne soit pas créé. Comment puis-je faire? Utiliser des execeptions?

Test testObj = new Test("c:\fichier.txt");

if (testObj == null) Console.WriteLine("Le fichier n'existe pas");

7 réponses

Avatar
nicolas franchet
Plusieurs solutions possibles :

1. Soit par une propriete indiquant que le fichier n'est pas bon donc
faire un test du style if(!testObj.Valid) {...}
2. Soit par une methode statique pour creer l'objet
Test testObj=Test.Create("..."); et c'est le Test.Create qui retourne
un new Test() ou null en cas d'erreur
3. Soit par un Try/Catch
try {
testObj=new Test("..."); //C'est le constructeur de Test qui leve une
exception
} catch (Exception e) {
Console.WriteLine(".....");
}

La "meilleure" methode est la troisieme. Mais les autres fonctionnent
quand meme :)

Nicolas Franchet

Fabian Vilers wrote:
Bonjour à tous,

Imaginons une classe dont au passe au constructeur une string représentant
le chemin absolu vers un fichier. Au sein du constructeur, on test si le
fichier existe. S'il existe, on continue. S'il n'existe pas, il faudrait que
l'objet ne soit pas créé. Comment puis-je faire? Utiliser des execeptions?

Test testObj = new Test("c:fichier.txt");

if (testObj == null) Console.WriteLine("Le fichier n'existe pas");




Avatar
Fabien Bezagu
Lancer une exception me paraît adéquat et correspond bien à l'utilisation
des exceptions. Lorsqu'une exception est lancée depuis un contructeur,
l'instance n'est pas contruite et la référence de l'objet reste nul. Donc
pas de problème.

Par contre, il faut utiliser un bloc try...catch plutôt qu'un test de
nullité.

Fabien

"Fabian Vilers" a écrit dans le message de
news: 42dcc492$0$1827$
Bonjour à tous,

Imaginons une classe dont au passe au constructeur une string représentant
le chemin absolu vers un fichier. Au sein du constructeur, on test si le
fichier existe. S'il existe, on continue. S'il n'existe pas, il faudrait
que l'objet ne soit pas créé. Comment puis-je faire? Utiliser des
execeptions?

Test testObj = new Test("c:fichier.txt");

if (testObj == null) Console.WriteLine("Le fichier n'existe pas");



Avatar
Pascal Soveaux
"Fabien Bezagu" <fbezagu_at_novacor_dot_fr> wrote in message
news:42dccceb$0$18769$
Lancer une exception me paraît adéquat et correspond bien à l'utilisation
des exceptions. Lorsqu'une exception est lancée depuis un contructeur,
l'instance n'est pas contruite et la référence de l'objet reste nul. Donc
pas de problème.

Par contre, il faut utiliser un bloc try...catch plutôt qu'un test de
nullité.

Fabien

"Fabian Vilers" a écrit dans le message
de news: 42dcc492$0$1827$
Bonjour à tous,

Imaginons une classe dont au passe au constructeur une string
représentant le chemin absolu vers un fichier. Au sein du constructeur,
on test si le fichier existe. S'il existe, on continue. S'il n'existe
pas, il faudrait que l'objet ne soit pas créé. Comment puis-je faire?
Utiliser des execeptions?

Test testObj = new Test("c:fichier.txt");

if (testObj == null) Console.WriteLine("Le fichier n'existe pas");







A mon humble avis, j'utiliserais l'exception s'il s'agit d'une réellement
d'une exception (le fichier DOIT exister). Sinon, il ne s'agit pas d'une
exception et j'utiliserais plutôt une fonction du style Open(filename).
D'autre part, le fichier peut exister mais ne pas pouvoir être ouvert ou
exister à t et avoir été supprimé à t+1 donc un test d'existence ne suffit
pas.

Pascal
Avatar
Fabian Vilers
>




Merci à tous, il s'agit bien d'une exception car le fichier doit exister.
Avatar
Delf
Fabian Vilers wrote:

Imaginons une classe dont au passe au constructeur une string représentant
le chemin absolu vers un fichier. Au sein du constructeur, on test si le
fichier existe. S'il existe, on continue. S'il n'existe pas, il faudrait que
l'objet ne soit pas créé. Comment puis-je faire? Utiliser des execeptions?



Je vais peut être dire une bétise mais moi, je ne ferai pas de test dans
le constructeur : je ferai ceci :

- j'aurais un constructeur qui initialiserait mon membre m_File avec
la string en paramètre,
- puis j'aurais une méthode bool DoesFileExist() qui testerait
m_File... mais bon, dans ce cas, il y a création de l'objet :

Vous en pensez quoi ?

--
Delf
Avatar
Fabien Bezagu
Comme l'a justement soulevé Pascal, il s'agissait de savoir si le fich ier
DOIT exister. Fabian nous l'a confirmé.

Partant de là, la méthode de l'exception dans le constructeur est
clairement la meilleure solution car cela induit que l'existence d'une
instance dépend intimement de celle du fichier. Dans ta proposition - qui
peut être bonne dans certaines situations - on peut effectivement voir que
ce n'est pas le cas.

Fabien

On Tue, 19 Jul 2005 18:15:37 +0200, Delf wrote:

Fabian Vilers wrote:

Imaginons une classe dont au passe au constructeur une string
représentant le chemin absolu vers un fichier. Au sein du construct eur,
on test si le fichier existe. S'il existe, on continue. S'il n'existe
pas, il faudrait que l'objet ne soit pas créé. Comment puis-je fa ire?
Utiliser des execeptions?



Je vais peut être dire une bétise mais moi, je ne ferai pas de tes t dans
le constructeur : je ferai ceci :

- j'aurais un constructeur qui initialiserait mon membre m_File avec
la string en paramètre,
- puis j'aurais une méthode bool DoesFileExist() qui testerait
m_File... mais bon, dans ce cas, il y a création de l'objet :

Vous en pensez quoi ?

--
Delf


Avatar
Ambassadeur Kosh
> - j'aurais un constructeur qui initialiserait mon membre m_File avec la
string en paramètre,
- puis j'aurais une méthode bool DoesFileExist() qui testerait m_File...
mais bon, dans ce cas, il y a création de l'objet :

Vous en pensez quoi ?



que c'est se compliquer la vie.

type x = ...
...
f(x) ; // x contient il = une "bonne" ou une "mauvaise" valeur ?

alors qu'avec une logique d'exception, à chaque ligne, quand on voit x, il
contient une bonne valeur. si ça n'etait pas le cas, une exception aurait
claqué et on ne serait pas sur cette ligne.
les valeurs d'erreur obligent à multiplier les tests, augmentent la taille
du code considerablement, et tout ça, en definitive, pour rien.