문제

사람들은 인터페이스에 사용할 최고의 지침에 대해 어떻게 생각합니까?인터페이스에 들어가야 할 것과 들어가지 말아야 할 것은 무엇입니까?

나는 사람들이 일반적으로 인터페이스는 상태가 아닌 동작만 정의해야 한다고 말하는 것을 들었습니다.이것은 인터페이스를 의미합니까? 게터와 세터를 포함하면 안 되나요?

내 의견:아마도 setter에게는 그렇지 않을 수도 있지만, 때때로 나는 getter가 인터페이스에 배치되는 것이 유효하다고 생각합니다.이는 단지 구현 클래스가 해당 getter를 구현하도록 강제하고 클라이언트가 해당 getter를 호출하여 무언가를 확인할 수 있음을 나타내는 것입니다.

도움이 되었습니까?

해결책

일반적으로 선언 된 두 가지 유형의 인터페이스가 있다고 생각합니다.

  1. 서비스 설명. 이것은 같은 것일 수 있습니다 CalculationService. 나는 그 방법을 생각하지 않습니다 getX 이런 종류의 인터페이스에 있어야합니다 틀림없이 ~ 아니다 setX. 이들은 이러한 유형의 인터페이스의 작업이 아닌 구현 세부 사항을 분명히 암시합니다.
  2. 데이터 모델 - 시스템에서 데이터 객체의 구현을 추상화하기 위해서만 존재합니다. 이들은 테스트를 돕는 데 사용될 수 있습니다. 또는 일부 사람들은 (예를 들어) 지속성 프레임 워크를 사용하는 날을 기억하기 때문에 특정 슈퍼 클래스를 사용하는 날을 기억하기 때문일 수 있습니다 (즉, 전환 할 경우 인터페이스를 구현하도록 선택할 것입니다. 당신의 지속성 층). 이러한 유형의 인터페이스에 Javabean 방법이있는 것은 전적으로 합리적이라고 생각합니다.

참고 : 컬렉션 클래스는 아마도 유형 #2에 적합합니다.

다른 팁

인터페이스가 getter와 setter를 정의할 수 없는 이유를 알 수 없습니다.예를 들어, List.size() 효과적으로 게터입니다.인터페이스는 동작이 아닌 동작을 정의해야 합니다. 구현 하지만 - 당신이 어떻게 될지는 말할 수 없습니다 핸들 상태를 가져오거나 설정할 수 있다고 주장할 수 있습니다.

예를 들어 컬렉션 인터페이스는 모두 상태에 관한 것입니다. 하지만 서로 다른 컬렉션은 근본적으로 다른 방식으로 해당 상태를 저장할 수 있습니다.

편집하다:의견에 따르면 getter 및 setter는 백업 스토리지에 간단한 필드가 사용됨을 암시합니다.나는 이러한 의미에 격렬하게 동의하지 않습니다.내 생각에는 값을 가져오거나 설정하는 것이 "합리적으로 저렴"하다는 의미가 있지만 사소한 구현을 통해 필드로 저장된다는 의미는 아닙니다.


편집하다:댓글에서 언급했듯이 이는 자바빈즈 사양 섹션 7.1:

따라서 스크립트 작가가 b.Label = foo 에 대한 메서드 호출이 여전히 있습니다. target 객체를 사용하여 속성을 설정하고, 대상 개체에는 full이 있습니다. 프로그래밍 방식 컨트롤.

따라서 속성은 단순할 필요가 없습니다 data 필드는 실제로 계산된 값.업데이트에는 다음이 있을 수 있습니다. 다양한 프로그래밍 방식의 부작용.때문에 예제, Bean의 배경 변경 color 속성으로 인해 새로운 콩으로 다시 칠할 콩 색깔."


가정된 의미라면 ~이었다 사실, 속성을 필드로 직접 노출할 수도 있습니다.다행스럽게도 그 의미는 그렇지 않다 잡고 있다:getter와 setter는 사물을 계산할 권리가 완벽하게 있습니다.

예를 들어,

getWidth()
getHeight()
getSize()

거기에 세 가지 변수가 있다는 의미가 있다고 생각하시나요?다음 중 하나를 갖는 것이 합리적이지 않습니까?

private int width;
private int height;

public int getWidth() {
    return width;
}

public int getHeight() {
    return height;
}

public Size getSize() {
    return new Size(width, height); // Assuming an immutable Size type
}

또는 (바람직하게는 IMO):

private Size size;

public int getWidth() {
    return size.getWidth();
}

public int getHeight() {
    return size.getHeight();
}

public Size getSize() {
    return size;
}

여기서 크기 속성이나 높이/너비 속성은 단지 편의를 위한 것입니다. 그러나 이것이 어떤 방식으로든 유효하지 않다고는 볼 수 없습니다.

게터/세터에 대해 본질적으로 악한 것은 없습니다. 하지만:

  1. 나는 그들이 포함하는 필드와 관련하여 내 물체를 불변으로 (첫 번째로)로 만드는 경향이 있습니다. 왜요 ? 건설 단계에서 대부분의 것들을 인스턴스화합니다. 나중에 무언가를 바꾸고 싶다면 그 제한을 완화합니다. 따라서 내 인터페이스에는 getters가 포함되어 있지만 세터는 포함되지 않습니다 (다른 이점, 특히 스레딩이 있습니다).
  2. 나는 내 물건이 나를 위해 일을하기를 원합니다, 다른 방법은 아닙니다. 따라서 내 객체 중 하나가 다수의 getters를 획득하면 다른 데이터를 다른 작업을 수행하기 위해 모든 데이터를 노출시키는 대신 해당 객체가 더 많은 기능을 가져야하는지 묻기 시작합니다. 보다 이 답변 자세한 내용은.

이것들은 모두 지침입니다.

나는 콩이 일반적으로 그 위에 인터페이스를 가져야한다고 생각하지 않습니다. Javabean은보다 일반적인 의미의 인터페이스입니다. 인터페이스는 더 복잡한 것의 외부 계약을 지정합니다. Javabean의 외부 계약 및 내부 표현은 동일합니다.

그래도 인터페이스에 게스터가 없어야한다고 말하지는 않을 것입니다. Datathingiebean이 구현하는 readabledatathingie 인터페이스를 갖는 것이 완벽합니다.

나는 사람들이 일반적으로 인터페이스가 상태가 아니라 행동 만 정의해야한다고 말하는 것을 들었습니다. 이것은 인터페이스에 getters와 setter가 포함되어서는 안된다는 것을 의미합니까?

우선, 적어도 Java와 예외 선언을 제외하면 상태없이 완전한 동작을 정의 할 수 없습니다. Java에서는 인터페이스가 동작을 정의하지 않습니다. 그들은 할 수 없습니다. 그들이 정의하는 것은 유형입니다. 일부 조건 예외가 포함 된 일련의 기능 서명 세트를 구현하겠다는 약속. 그러나 그게 다야. 행동과 상태는 해당 인터페이스를 구현하는 클래스로 정의됩니다.

둘째, getters와 setter가 인터페이스에 정의 된 경우 실제로 완전한 동작을 정의하지 않습니다 (다른 하나는 읽기 용이며 하나는 속성을 쓰기위한 것입니다.) 세터와 게터 뒤에 복잡한 동작을 가질 수는 있지만 가능합니다. 실제 클래스에서만 구현됩니다. Java 언어에는 가장 제한적인 경우를 제외하고 인터페이스에서 동작을 자유롭게 정의 할 수있는 것은 없습니다.

이를 고려할 때, 인터페이스에 세터와 getter가있는 것이 잘못된 것은 없습니다.

응용 프로그램이 잘 수정되어 있고 문제로 인해 인터페이스가 세터와 getters를 정의 해야하는 경우 왜 그렇지 않습니까? 예를 들어 ServletResponse 인터페이스를 살펴보십시오.

이제 Javabeans 사양을 준수하는 클래스를 구현하는 관점에서 Getters와 Setter를 보면 인터페이스를 정의 할 필요가 없습니다.

그러나 콩과 같은 세터와 getter가 필요한 것들이 있고 Compile-Type (Bean mangle과 같이 런타임이 아님)에 꽂아야하고 여러 구현이 존재할 수있는 것들이 있다면 그렇다면 예, 그렇습니다. , 이것은 getters와 setters를 정의하는 인터페이스를 요구합니다.

도움이되기를 바랍니다.

이것은 전체 Getter/Setter 가이 사이트와 다른 곳에서 여러 번 해결되는 사악한 주제입니다.

인터페이스에 액세서가 없지만 구현에 생성자 인수를 사용하여 공동 작업자를 추가하는 경향이 있습니다.

무언가의 간단한 구현이 게터가 필요하다면 인터페이스에있는 것을 막아서는 안된다는 사실이라는 사실은 필요하다는 사실은 그것이 인터페이스에 있지 않아야합니다.

추가 읽기 : Java 프레임 워크 아키텍트의 실용적인 API 디자인 고백 (Jaroslav Tulach, 2008, Apress).

예를 들어 필드가 시작된 클래스가있는 등 이런 종류의 인터페이스를 사용했습니다. 그 분야는 많은 수업에 있었고 다른 객체에 대한 날짜를 얻어야하는 하나의 유스 케이스가 있었기 때문에 인터페이스를 추출했고 매우 행복했습니다 :)

기본적으로 "인스턴스로 작업하기 위해 [상태, 속성, 뭐든지 뭐든지 [상태, 속성, 뭐든지 알아야합니까?" 그렇습니다 ... 액세서는 인터페이스에 속합니다.

위의 John의 List.size ()는 인터페이스에서 정의 해야하는 getter의 완벽한 예입니다.

getters는 객체의 상태를 쿼리하는 데 사용됩니다. 인터페이스를 설계 할 때 실제로 피할 수 있습니다. 읽다 http://www.pragprog.com/articles/tell-dont-ask

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top