Je rencontre parfois des objets d'aide... Quelqu'un peut-il m'expliquer ce que sont ces objets d'aide et pourquoi nous en avons besoin ?
Réponses
Trop de publicités?Certaines opérations communes à plusieurs classes peuvent être déplacées vers des classes d'aide, qui sont ensuite utilisées via la composition d'objets :
public class OrderService {
private PriceHelper priceHelper = new PriceHelper();
public double calculateOrderPrice(order) {
double price = 0;
for (Item item : order.getItems()) {
double += priceHelper.calculatePrice(item.getProduct());
}
}
}
public class ProductService {
private PriceHelper priceHelper = new PriceHelper();
public double getProductPrice(Product product) {
return priceHelper.calculatePrice(product);
}
}
L'utilisation des classes d'aide peut se faire de plusieurs façons :
- Les instancier directement (comme ci-dessus)
- via l'injection de dépendances
- en rendant leurs méthodes
static
et d'y accéder de manière statique, comme par exempleIOUtils.closeQuietly(inputStream)
ferme uneInputStream
sans lancer d'exceptions. - au moins ma convention est de nommer les classes avec seulement des méthodes statiques et non des dépendances
XUtils
et des classes qui, à leur tour, ont des dépendances et doivent être gérées par un conteneur DI.XHelper
(L'exemple ci-dessus n'est qu'un exemple - il ne doit pas être discuté en termes de conception pilotée par le domaine).
Il s'agit d'objets qui se trouvent "à côté" du corps principal du code et qui effectuent une partie du travail pour l'objet. Ils "aident" l'objet à faire son travail.
Par exemple, de nombreuses personnes ont un objet d'aide Closer. Cet objet prend divers objets pouvant être fermés, par exemple java.sql.Statement, java.sql.Connection, etc. et ferme l'objet en ignorant les erreurs qui en découlent. Cela s'explique par le fait que si vous obtenez une erreur lors de la fermeture d'un objet, il n'y a pas grand-chose que vous puissiez faire de toute façon, alors les gens l'ignorent tout simplement.
Plutôt que d'avoir ce texte passe-partout :
try {
connection.close();
} catch (SQLException e) {
// just ignore… what can you do when you can't close the connection?
log.warn("couldn't close connection", e);
}
éparpillés dans le codebase, ils appellent simplement :
Closer.close(connection);
à la place. Par exemple, regardez la goyave procheQuietly .
Une méthode "d'aide" est généralement une méthode permettant de faire quelque chose plus facile peu importe ce que c'est. Parfois, ils sont utilisés pour rendre les choses plus lisibles/claires (certains peuvent le contester, mais c'est finalement très subjectif) :
public void doStuff() {
wakeUp();
drinkCoffee();
drive();
work();
goHome();
}
Alors que chaque "méthode d'aide" est en soi assez complexe, le concept devient vraiment clair et simple.
Une autre très bonne utilisation des méthodes d'aide consiste à fournir une fonctionnalité commune à plusieurs classes différentes. Le meilleur exemple en est la méthode Math
qui contient une tonne de méthodes d'aide statiques pour vous aider à calculer des choses comme le logarithme d'un nombre, l'exposant d'un nombre... etc.
La ligne de démarcation entre une méthode d'aide et une méthode normale est assez subjective, mais c'est l'essentiel. Les autres réponses sont également très bonnes.
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Helpers {
public static String getDate() {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
return dateFormat.format(new Date());
}
public static boolean isTimeABeforeTimeB(String timeA, String timeB) {
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm aa");
Date dA = dateFormat.parse(timeA);
Date dB = dateFormat.parse(timeB);
if (dA.getTime() < dB.getTime()) {
return true;
} else {
return false;
}
} catch (Exception e) {
//
}
return false;
}
public static String getDateAndTimeInput(String prompt) {
Scanner input = new Scanner(System.in);
String ans;
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm aa");
dateFormat.setLenient(false);
boolean dateValid;
do {
System.out.print(prompt);
ans = input.nextLine();
ans = ans.trim();
dateValid = true;
try {
Date d = dateFormat.parse(ans);
} catch (Exception e) {
dateValid = false;
}
} while (!dateValid);
return ans;
}
public static String getStringInput(String prompt) {
Scanner input = new Scanner(System.in);
String ans;
do {
System.out.print(prompt);
ans = input.nextLine();
ans = ans.trim();
} while (ans.length() == 0);
return ans;
}
public static double getDoubleInput(String prompt) {
Scanner input = new Scanner(System.in);
double ans = 0;
boolean inputValid;
do {
System.out.print(prompt);
String s = input.nextLine();
//Convert string input to integer
try {
ans = Double.parseDouble(s);
inputValid = true;
} catch (Exception e) {
inputValid = false;
}
} while (!inputValid);
return ans;
}
public static int getIntegerInput(String prompt) {
Scanner input = new Scanner(System.in);
int ans = 0;
boolean inputValid;
do {
System.out.print(prompt);
String s = input.nextLine();
// Convert string input to integer
try {
ans = Integer.parseInt(s);
inputValid = true;
} catch (Exception e) {
inputValid = false;
}
} while (!inputValid);
return ans;
}
public static int getIntegerInput(String prompt, int lowerBound, int upperBound) {
Scanner input = new Scanner(System.in);
int ans = 0;
boolean inputValid;
do {
System.out.print(prompt);
String s = input.nextLine();
// Convert string input to integer
try {
ans = Integer.parseInt(s);
if (ans >= lowerBound && ans <= upperBound) {
inputValid = true;
} else {
inputValid = false;
}
} catch (Exception e) {
inputValid = false;
}
} while (!inputValid);
return ans;
}
}
qui est un exemple de classe d'aide. Elle contient des méthodes qui sont utilisées par les autres classes du projet.
Par exemple, si quelqu'un veut entrer un nombre entier à partir d'une classe, il devra taper ceci : String num = Helpers.getIntegerInput("input your number") ;
L'invite est la sortie qui est montrée à l'utilisateur. D'autres exemples pour saisir une chaîne, un double, une date et une heure, etc.
- Réponses précédentes
- Plus de réponses