java.util.Map
같은 유연한 인터페이스는 기능이 많지만 오용될 수 있음.Map<String, Sensor>
을 사용하는 코드는 특정 유형으로 변환하는 책임이 클라이언트에 있음.Map<String, Sensor> sensors = new HashMap<>();
Sensor sensor = sensors.get(sensorId);
Map
을 캡슐화한 Sensors
클래스를 만들어 변경 영향을 최소화하고 인터페이스를 깔끔하게 유지.public class Sensors {
private Map<String, Sensor> sensors = new HashMap<>();
public Sensor getById(String id) {
return sensors.get(id);
}
}
@Test
public void testLogCreate() {
Logger logger = Logger.getLogger("MyLogger");
logger.info("hello");
}
log4j
를 이해하고 독자적인 로거 클래스로 캡슐화.public class LogTest {
private Logger logger;
@Before
public void initialize() {
logger = Logger.getLogger("logger");
logger.removeAllAppenders();
Logger.getRootLogger().removeAllAppenders();
}
@Test
public void basicLogger() {
BasicConfigurator.configure();
logger.info("basicLogger");
}
@Test
public void addAppenderWithStream() {
logger.addAppender(new ConsoleAppender(
new PatternLayout("%p %t %m%n"), ConsoleAppender.SYSTEM_OUT));
logger.info("addAppenderWithStream");
}
@Test
public void addAppenderWithoutStream() {
logger.addAppender(new ConsoleAppender(new PatternLayout("%p %t %m%n")));
logger.info("addAppenderWithoutStream");
}
}
Transmitter
클래스 사용.public interface Transmitter {
void transmit(double frequency, byte[] data);
}
public class FakeTransmitter implements Transmitter {
@Override
public void transmit(double frequency, byte[] data) {
// Fake implementation for testing
}
}
public class CommunicationsController {
private Transmitter transmitter;
public CommunicationsController(Transmitter transmitter) {
this.transmitter = transmitter;
}
public void send(double frequency, byte[] data) {
transmitter.transmit(frequency, data);
}
}
public class TransmitterAdapter implements Transmitter {
private ExternalTransmitterAPI externalTransmitter;
public TransmitterAdapter(ExternalTransmitterAPI externalTransmitter) {
this.externalTransmitter = externalTransmitter;
}
@Override
public void transmit(double frequency, byte[] data) {
externalTransmitter.sendSignal(frequency, data);
}
}