Approche Orienté Objet
Jiko-java
Messages postés
186
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour, Voilà je développe actuellement une mini api qui consiste a calculer le prix d'un appel téléphonique . Pour ce faire je dois faire appels à certaines classes extérieurs de la libraire Time qui me permettront de connaitre la durée de l'appel ainsi que la date et l'heure de celui-çi voici les classes requises : LocalDateTime et Duration . Cependant n'ayant pas l'habitude de manipuler des classes "extérieur" présentant des multitudes de méthodes je m'y perds un peu .... voici ma class :
Comme vous-avez pu le remarqué j'ai un doute en ce qui concerne l'initialisation de mes 2 attributs , sachant qu'ils ont pour type 2 class de la librairie Time je ne sais pas si C'est la bonne façon de les initialisés je m'explique ayant utilisé la class LocalDate auparavant pour initialisé mon attribut on m'a dis de procédé de cette façon : date = LocalDate.now(); du coup sachant que cette class aussi appartient a la librairie Time je me demandais si je devais procédé de la même façon et si c'est le cas Qu'elle est la différence entre ces 2 initialisations : this.date = date et date = LocalDate.now();. Je voudrais également savoir Quel Exception devrais-je prévoir Merci d'avance ! .
import java.time.LocalDateTime; import java.time.Duration; public class PhoneCall { private LocalDateTime callDate; private Duration callTiming ; public PhoneCall (LocalDateTime callDate, Duration callTiming) { this.callDate = callDate; // Pas certains qu'il faille l'initialisé de cette manière ... this.callTiming = callTiming // Pas certains qu'il faille l'initialisé de cette manière ... } public LocalDateTime getCallDate() { return callDate; } public Duration getCallTiming() { return callTiming; } }
Comme vous-avez pu le remarqué j'ai un doute en ce qui concerne l'initialisation de mes 2 attributs , sachant qu'ils ont pour type 2 class de la librairie Time je ne sais pas si C'est la bonne façon de les initialisés je m'explique ayant utilisé la class LocalDate auparavant pour initialisé mon attribut on m'a dis de procédé de cette façon : date = LocalDate.now(); du coup sachant que cette class aussi appartient a la librairie Time je me demandais si je devais procédé de la même façon et si c'est le cas Qu'elle est la différence entre ces 2 initialisations : this.date = date et date = LocalDate.now();. Je voudrais également savoir Quel Exception devrais-je prévoir Merci d'avance ! .
A voir également:
- Approche Orienté Objet
- Vente objet occasion entre particulier - Guide
- Objet interdit en cabine ryanair - Guide
- Identifier un objet à partir d'une photo - Guide
- Mesurer un objet - Guide
- Vous devez disposer d'autorisations d'accès en lecture pour afficher les propriétés de cet objet - Guide
1 réponse
Bonjour,
Je ne pense pas que le problème soit lié à l'utilisation des classes time, car tu pourrais (devrais) te poser les même questions pour n'importe quelle classe, même si c'était des String ou d'autres objets "plus simples" en paramètre du constructeur.
Tout dépend en fait ce que tu veux faire et quelles valeurs sont censés représenter tes attributs.
Si tu fais
À l'opposé ce que l'on peut faire c'est mettre aucun paramètre au constructeur et donner des valeurs par défaut... si ça a un sens !
Par exemple, quand on fait une
Dans ton cas, il faut donc se demander, est-ce que tous les paramètres du constructeur ont du sens, ou est-ce que l'on ne peut pas en supprimer certains au profit de valeurs par défaut ?
On peut aussi faire des calculs dans un constructeur, on donne quand même des paramètres dans le constructeur et on fait des calculs pour déterminer les valeurs des attributs. Par exemple : tu donnes la date de début et de fin de l'appel, tu calcules la durée en faisant fin-début...
Remarque : LocalDateTime et Duration ne sont pas des classes extérieures, elles sont inclues dans l'API standard Java au même titre que String, ArrayList et 4000 autres classes et interfaces. On considère qu'une classe est "extérieure" à partir du moment où tu dois télécharger un jar complémentaire et l'attacher à ton programme, ce n'est pas le cas de java.time.
De plus, ce ne sont pas des classes si complexes que ça, elles ont plein de méthodes (comme String peut en avoir aussi par exemple) mais elles représentent des choses assez simples, assimilables à un entier (comme pour la classe Date) et les méthodes permettent de faire des calculs (addition, soustraction) sur ces entiers.
Par exemple pour faire le calcul fin-début dont je parlais tout à l'heure pour calculer une durée, tu as la méthode minus :
Du coup pour ton problème, tout dépend ce que tu veux faire avec ta classe, sachant que tu peux aussi avoir plusieurs constructeurs qui offrent plusieurs manières d'initialiser ton objet.
Je ne pense pas que le problème soit lié à l'utilisation des classes time, car tu pourrais (devrais) te poser les même questions pour n'importe quelle classe, même si c'était des String ou d'autres objets "plus simples" en paramètre du constructeur.
Tout dépend en fait ce que tu veux faire et quelles valeurs sont censés représenter tes attributs.
Si tu fais
this.callDate = callDate; this.callTiming = callTiming;c'est lors de l'appel du
new PhoneCall(callDate, callTiming)qu'il faudra passer les bonnes valeurs à l'objet, ce qui donne la liberté au code appelant (celui qui fait le new) de mettre ce qu'il veut comme valeurs, quitte à être complètement incohérent (date farfelue, durée négative, valeurs null, etc.)
À l'opposé ce que l'on peut faire c'est mettre aucun paramètre au constructeur et donner des valeurs par défaut... si ça a un sens !
Par exemple, quand on fait une
new ArrayList();c'est implicitement une liste vide qui ne contient aucun élément, le tableau de données qui représente la liste est donc initialisé avec un tableau vide.
Dans ton cas, il faut donc se demander, est-ce que tous les paramètres du constructeur ont du sens, ou est-ce que l'on ne peut pas en supprimer certains au profit de valeurs par défaut ?
On peut aussi faire des calculs dans un constructeur, on donne quand même des paramètres dans le constructeur et on fait des calculs pour déterminer les valeurs des attributs. Par exemple : tu donnes la date de début et de fin de l'appel, tu calcules la durée en faisant fin-début...
Remarque : LocalDateTime et Duration ne sont pas des classes extérieures, elles sont inclues dans l'API standard Java au même titre que String, ArrayList et 4000 autres classes et interfaces. On considère qu'une classe est "extérieure" à partir du moment où tu dois télécharger un jar complémentaire et l'attacher à ton programme, ce n'est pas le cas de java.time.
De plus, ce ne sont pas des classes si complexes que ça, elles ont plein de méthodes (comme String peut en avoir aussi par exemple) mais elles représentent des choses assez simples, assimilables à un entier (comme pour la classe Date) et les méthodes permettent de faire des calculs (addition, soustraction) sur ces entiers.
Par exemple pour faire le calcul fin-début dont je parlais tout à l'heure pour calculer une durée, tu as la méthode minus :
LocalDateTime debut = ..., fin = ...; Duration duree = fin.minus(debut);
Du coup pour ton problème, tout dépend ce que tu veux faire avec ta classe, sachant que tu peux aussi avoir plusieurs constructeurs qui offrent plusieurs manières d'initialiser ton objet.
Voilà en gros l'idée sur quoi je voulais allé encore une fois je concedes mon absurdité sans équivalent que je viens de faire .
Après je penses aussi que les appels de méthodes que j'ai faites ne sont sans doute pas ce que j'aurais du privilégié mais je préféré m'en assuré
Les méthodes sont static, donc tu ne dois pas utiliser d'objet pour les appeler mais directement le nom de la classe : .
Cependant ici, il y a plus simple, ce serait de mettre dans ton constructeur les différentes valeurs que tu veux saisir, puis de t'en servir pour calculer tes attributs, ainsi l'appelant n'a pas besoin de savoir comment tu construit ton objet pour l'utiliser, il est inutile qu'il construise lui même l'objet LocalDateTime ou l'objet Duration, ce qui te laisse la liberté de changer l'implémentation sans impacter le client. Par exemple, je ne suis pas convaincu que stocker la durée soit pertinent, il paraît plus simple de stocker la date de fin, et calculer la durée à la demande.
Exemple :
Remarque : dans , tu as écris avec un 0 devant, c'est une notation en octale, pas en décimale. Pour 07 ça ne change rien, mais si tu écrivais par exemple 010 ce serait égal à 8, 0100 est égal à 64 etc.
lors du premier appel d'une methode , la methode plusHours() n'était pas disponible pourtant c'est bien une méthode disponible de la class Duration dois - je en conclure que le premier appel de la methode doit être une méthode de class (static) ? voici mes class :
Cela dépend du logiciel que tu utilises, mais parfois la vue des méthodes est limitée à celles qui sont compatibles avec le type de la variable que tu affectes.
Exemple, tu saisis l'éditeur peut ne proposer que les méthodes de l'objet dont le résultat est un , celles qui renvoient un autre type seront masquées ou alors listées plus loin dans la fenêtre.
Pour ton code, il y a des incohérences, par exemple l'usage de RATE. Normalement l'usage des noms en majuscules est limité aux constantes, or ici tu modifies sa valeur. De plus il est déclaré static mais est utilisé avec un contexte non-static comme dans qui est incorrect.
Plus largement je pense que tu devrais avoir (au moins) deux classes, une qui représente la durée de l'appel, et une autre qui calcule le montant, c'est dans cette deuxième classe que devrait apparaître ta notion de "rate".