Design patterns
Modèle d'objet nul
Recherche…
Remarques
Null Object est un objet sans valeur référencée ou avec un comportement neutre défini. Son but est de supprimer le besoin de vérification de pointeur / référence null.
Modèle d'objet nul (C ++)
En supposant une classe abstraite:
class ILogger {
virtual ~ILogger() = default;
virtual Log(const std::string&) = 0;
};
Au lieu de
void doJob(ILogger* logger) {
if (logger) {
logger->Log("[doJob]:Step 1");
}
// ...
if (logger) {
logger->Log("[doJob]:Step 2");
}
// ...
if (logger) {
logger->Log("[doJob]:End");
}
}
void doJobWithoutLogging()
{
doJob(nullptr);
}
Vous pouvez créer un enregistreur d'objets Null:
class NullLogger : public ILogger
{
void Log(const std::string&) override { /* Empty */ }
};
puis changez doJob
dans ce qui suit:
void doJob(ILogger& logger) {
logger.Log("[doJob]:Step1");
// ...
logger.Log("[doJob]:Step 2");
// ...
logger.Log("[doJob]:End");
}
void doJobWithoutLogging()
{
NullLogger logger;
doJob(logger);
}
Objet Null Java utilisant enum
Étant donné une interface:
public interface Logger {
void log(String message);
}
Plutôt que d'utiliser:
public void doJob(Logger logger) {
if (logger != null) {
logger.log("[doJob]:Step 1");
}
// ...
if (logger != null) {
logger.log("[doJob]:Step 2");
}
// ...
if (logger != null) {
logger.log("[doJob]:Step 3");
}
}
public void doJob() {
doJob(null); // Without Logging
}
Étant donné que les objets nuls n'ont pas d'état, il est logique d'utiliser un singulier enum, ce qui signifie qu'un objet null doit être implémenté comme suit:
public enum NullLogger implements Logger {
INSTANCE;
@Override
public void log(String message) {
// Do nothing
}
}
Vous pouvez alors éviter les vérifications nulles.
public void doJob(Logger logger) {
logger.log("[doJob]:Step 1");
// ...
logger.log("[doJob]:Step 2");
// ...
logger.log("[doJob]:Step 3");
}
public void doJob() {
doJob(NullLogger.INSTANCE);
}
Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow