Java 인터페이스가 끔찍하지 않은 이유(단순히 엄격함)

6653 단어 javacoding
A는 오리 타이핑을 허용하는 언어에서 오는 Java 인터페이스를 처리할 때 몇 가지 문제를 설명했습니다.

결론은 이것입니다. 인터페이스가 있습니다:

public interface DynamoImpl {
  public PutItemResult putItem(PutItemRequest putItemRequest);

  public GetItemResult getItem(GetItemRequest getItemRequest);
}


그리고 클래스AmazonDynamoDB가 있습니다. 이 클래스에는 위의 두 가지 메서드가 있지만 훨씬 더 많습니다. 이제 프로그래머인 John은 AmazonDynamoDB의 이 두 메서드만 나머지 프로그램에 노출하려고 합니다. 수업에서 사용하려고 합니다Database.

public class Database {
    public DynamoImpl db;

    // code removed for simplicity

    public Database(DynamoImpl db) {
        this.db = db;
    }
}


현재: 덕 타이핑을 지원하는 언어에서는 클래스AmazonDynamoDB의 인스턴스를 생성자에 전달하고 두 메서드를 호출할 수 있습니다(클래스에 메서드가 있기 때문). 그러나 Java에서는 그렇지 않습니다. 문자 그대로 implements 인터페이스(또는 그렇게 하는 클래스를 확장)인 클래스의 인스턴스를 전달해야 합니다. 그러나 DynamoImpl는 해당 인터페이스를 구현하지 않습니다.

Java에서 동일한 목표를 달성하는 가장 쉬운 방법은 AmazonDynamoDB 인스턴스에 위임하는 래퍼를 만드는 것입니다.

public class AmazonDynamoDbWrapper implements DynamoImpl{

    private AmazonDynamoDB amazonDynamoDB;

    public AmazonDynamoDbWrapper(AmazonDynamoDB amazonDynamoDB) {
        this.amazonDynamoDB = amazonDynamoDB;
    }

    @Override
    public PutItemResult putItem(PutItemRequest putItemRequest) {
        return amazonDynamoDB.putItem(putItemRequest);
    }

    @Override
    public GetItemResult getItem(GetItemRequest getItemRequest) {
        return amazonDynamoDB.getItem(getItemRequest);
    }

}


예, 약간 장황하지만 패턴을 이해하면 매우 간단합니다. 이제 이 클래스의 인스턴스를 AmazonDynamoDB 의 인스턴스로 전달할 수 있습니다.

프로덕션 코드는 이 정도입니다. 테스트는 어떻습니까?

가장 쉬운 솔루션은 다음과 같이 Database 인터페이스의 최소 구현을 제공하는 것입니다.

public class StubbedDynamoImpl implements DynamoImpl {

    @Override
    public PutItemResult putItem(PutItemRequest putItemRequest) {
        return new PutItemResult(/* Test data here */);
    }

    @Override
    public GetItemResult getItem(GetItemRequest getItemRequest) {
        return new GetItemResult(/* Test data here */);
    }
}


다시 한 번 테스트에서 이 클래스의 인스턴스를 DynamoImpl 인스턴스의 생성자에 전달할 수 있습니다.

public class DatabaseTest {

    @Test
    public void createsDatabase() {
        Database database = new Database(new StubbedDynamoImpl());
        // Whatever your test assertions are, here
    }
    // ...
}


노출하려는 모든 것이 두 가지 방법인 경우 멋진 모의 프레임워크가 필요하지 않습니다.
이것이 내가 생각할 수 있는 가장 쉬운 해결책입니다. 유용하길 바랍니다.

추신
Java 규칙에 관한 한 마디: 인터페이스에 접미사 Impl을 사용하지 마십시오. 이것은 구체적인 구현 클래스(있는 경우)에 사용해야 합니다. 그렇지 않으면 많은 사람들이 혼동할 수 있습니다.

좋은 웹페이지 즐겨찾기