Design patterns
Nullオブジェクトパターン
サーチ…
備考
Nullオブジェクトは、参照値を持たないオブジェクト、または定義された中立の動作を持つオブジェクトです。その目的はnullポインタ/参照チェックの必要性を取り除くことです。
ヌルオブジェクトパターン(C ++)
抽象クラスを仮定します:
class ILogger {
virtual ~ILogger() = default;
virtual Log(const std::string&) = 0;
};
の代わりに
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);
}
Null Object Loggerを作成することができます:
class NullLogger : public ILogger
{
void Log(const std::string&) override { /* Empty */ }
};
次のようにdoJob
を変更します。
void doJob(ILogger& logger) {
logger.Log("[doJob]:Step1");
// ...
logger.Log("[doJob]:Step 2");
// ...
logger.Log("[doJob]:End");
}
void doJobWithoutLogging()
{
NullLogger logger;
doJob(logger);
}
列挙型を使用したNullオブジェクトJava
与えられたインターフェース:
public interface Logger {
void log(String message);
}
使い方よりも:
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
}
nullオブジェクトは状態を持たないので、そのためにenumシングルトンを使用することは理にかなっています。したがって、nullオブジェクトは以下のように実装されています。
public enum NullLogger implements Logger {
INSTANCE;
@Override
public void log(String message) {
// Do nothing
}
}
ヌルチェックを避けることができます。
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
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow