문제

당신이 나를 해결하는 데 도움을 줄 수 있을지에 대한 약간의 딜레마가 있습니다.

저는 오늘 간접 수준을 추가하기 위해 ASP.NET의 멤버십을 수정하는 작업을 해왔습니다.기본적으로 ASP.NET의 멤버십은 사용자와 역할을 지원하므로 모든 권한 부여 규칙은 사용자가 역할에 속하는지 여부에 따라 결정됩니다.

내가 해야 할 일은 사용자가 역할(또는 역할)에 속하고 역할에 하나 이상의 기능이 연결되어 사용자가 속해 있는지 여부에 따라 특정 작업을 승인할 수 있는 기능 개념을 추가하는 것입니다. 기능이 할당된 역할에 할당됩니다.

내 문제는 그것과 아무 관련이 없으며 일반적인 클래스 디자인 문제입니다.

함수를 생성하고 유지하기 위해 기본 RoleProvider 클래스에 추상 메서드를 제공하고 싶지만 해당 함수에 대한 설명을 저장하는 것은 선택 사항이므로 오버로드가 포함된 CreateFunction 메서드를 생성해야 합니다. 서명은 이름을 받아들이고 다른 서명은 이름과 설명을 받아들입니다.

다음과 같은 시나리오를 생각해 볼 수 있습니다.

  1. 추상 수정자를 사용하여 두 서명을 모두 만듭니다.이는 구현자가 하나의 오버로드가 정규화된 매개변수를 사용하여 다른 오버로드를 호출해야 하고 로직이 최종 로직(모든 매개변수가 포함된 로직)에만 있어야 한다는 모범 사례를 존중하지 않을 수 있다는 문제가 있습니다.게다가 개발자가 두 가지 방법을 모두 구현하도록 요구하는 것은 좋지 않습니다.

  2. 첫 번째는 가상처럼 만들고 두 번째는 추상처럼 만듭니다.첫 번째에서 두 번째를 호출하여 구현자가 동작을 재정의하도록 허용합니다.동일한 문제가 있습니다. 구현자는 이를 재정의할 때 "잘못된 결정"을 내릴 수 있습니다.

  3. 이전과 동일하지만 첫 번째 항목이 재정의되는 것을 허용하지 않습니다(가상 수정자 제거).여기서 문제는 구현자가 메서드가 null 설명과 함께 호출될 수 있다는 사실을 인식하고 해당 상황을 처리해야 한다는 것입니다.

제 생각에는 3번이 가장 좋은 선택인 것 같아요...

이 시나리오는 일반적으로 어떻게 처리됩니까?추상 클래스를 디자인하고 여기에 오버로드된 메서드가 포함되어 있는 경우.제 생각엔 그리 드문 일은 아닌 것 같은데...

도움이 되었습니까?

해결책

나는 DRYness와 계약 강제의 가장 좋은 조합이 다음과 같다고 생각합니다(의사 코드).

class Base {
  public final constructor(name) {
    constructor(name, null)
  end

  public abstract constructor(name, description);
}

또는 다음과 같이 하세요.

class Base {
  public abstract constructor(name);

  public final constructor(name, description) {
    constructor(name)
    this.set_description(description)
  }

  private final set_description(description) {
    ...
  }
}

이 결정을 지원하는 Java 규칙이 있습니다."생성자에서 최종이 아닌 메서드를 절대 호출하지 마세요."

다른 팁

게시물의 첫 번째 부분에 답변하려면 Windows에 내장된 AzMan(권한 부여 관리자)을 확인하세요.역할로 다시 결합하거나 사용자에게 직접 할당할 수 있는 작업을 지정하는 기능이 있습니다.

확인해 보세요

질문의 두 번째 부분에 답하기 위해 Abstract 클래스를 사용하지 않겠습니다.대신 생성자에 기능을 제공하고 완료하면 됩니다.지정된 동작을 원하고 변경을 원하지 않는 것 같습니다.왜 자손에게 구현을 제공하도록 강요합니까?

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