문제

우리는 계층화 된 응용 프로그램이 있거나 적어도 하나로 전환하는 과정에서 다음과 같이 분류됩니다.

  • 인터페이스 (사용자-인터페이스 또는 응용 프로그램 인터페이스, 즉 웹 서비스 등)
  • 비즈니스 로직
  • 데이터 접근

이 질문의 나머지 부분을 더 구체적으로 만들려면 특정 사례를 설명하겠습니다.

사용자 인터페이스가 있는데, 그 뒤에는 컨트롤러 객체 (비즈니스 로직 계층)가 있습니다. 이 컨트롤러는 다른 객체 (데이터 액세스 계층)를 통해 데이터베이스와 대화합니다.

주어진 맥락에서 사용자 인터페이스를 통해 사용자는 직원을 선택하여 수행중인 작업을 연결할 수 있습니다. 사용자가 어떤 직원 (컨트롤러 외부의 모든 세계)에 관한 규칙이 있으므로 컨트롤러는 다음과 같은 두 가지를 제공합니다.

  • 선택할 수있는 직원 목록이 포함 된 읽기 가능한 부동산
  • 현재 선택된 직원이 포함 된 읽기/쓰기 가능한 부동산

사용자 인터페이스는 목록을 읽고 콤보 박스를 채우는 데 사용할 수 있습니다.

이 응용 프로그램의 버전 1에서 Combobox에는 직원의 식별 번호 + 직원 이름이 포함되어 있습니다.

모두 잘 ...

... 버전 1.1까지 버그 고정. 사용자는 자신이 선택할 수 없다고 불평합니다 지미 올슨 그리고 지미 올슨 응용 프로그램은 그가 어느 것이 무엇인지 알기에 충분히 쉽게 만들지 않기 때문입니다. 그는 영업 부서에는 하나의 지미가 있고 개발 부서에는 하나가 있다는 것을 알고 있으므로이 1.1 버전의 수정은 단순히 슬래시 + 콤보 박스의 부서 이름을 다루는 것입니다. 버전 2에서는 Combobox를 열 지지대가있는 Combobox로 교체하고 슬래시를 제거하는 것을 선택하지만 1.1에서는 추가 버그의 위험을 최소화하기 위해 선택된 것입니다.

다시 말해, 콤보 박스에는 다음을 포함합니다.

  • 1- 지미 올슨/판매
  • 2- 지미 올슨/개발
    • 다른 사람

그러나 사용자 인터페이스 코드에는 SQL 코드 나 해당 부서를 보유 할 수있는 방법이 없으므로 컨트롤러로 이동하여 코드를 살펴 봐야합니다. 컨트롤러는 부서가 필요하지 않으며 솔직히 말해서 직원의 이름이 필요하지 않으며 식별 번호가 충분하므로 컨트롤러에 부서에 어떤 것이없는 것이 없습니다. 따라서 데이터 액세스 계층으로 내려 가서 SQL을 변경해야합니다.

이 솔루션은 솔직히 냄새가납니다.

이 컨트롤러에 여러 인터페이스가있는 경우 요구 사항이 다르면 세 가지 가능한 솔루션이 있습니다.

  1. 데이터 액세스 계층을 변경하여 여러 인터페이스 (2 계층)의 (2 레이어)의 요구를 충족시키기 위해 모든 인터페이스가 필요한 모든 데이터를 얻을 수 있지만 필요한 모든 데이터를 얻을 수 있음을 의미합니다. 다른 인터페이스 중
  2. 사용자 인터페이스가 데이터 액세스 계층 (여전히 2 계층)을 알려주는 것을 추가하십시오.
  3. 어떻게 든 사용자 인터페이스 계층이 관련된 컨트롤러 또는 액세스 계층을 변경하지 않고 필요한 데이터를 보유하게 만들므로 어딘가에 더 많은 데이터 액세스 코드가 필요한 것처럼 들립니다.

위의 솔루션 중 어느 것도 기분이 좋지 않습니다.

내가 궁금해하는 것은 우리가 완전히 물론입니까? 어떻게 하시겠습니까? 위 3 개 아래에 네 번째와 다섯 번째 솔루션이 있습니까?

이 질문에 따라 : 우려의 분리, 허용 된 답변에는이 인용문이 포함되어 있습니다.

우려의 분리는 이러한 각 우려 사항에 대한 코드를 별도로 유지하는 것입니다. 인터페이스를 변경한다고해서 비즈니스 로직 코드를 변경할 필요는 없으며 그 반대도 마찬가지입니다.

이것은 단순히 모든 컨트롤러/데이터 액세스 계층이 우리에게 제공 해야하는 모든 일을 수행해야한다는 것을 의미합니다 (예 : 직원 식별 번호)는 사용자 인터페이스가 데이터베이스와 대화하고 자세한 정보를 요청해야합니다. ~에 대한 이 특정 직원?

도움이 되었습니까?

해결책

내가 보는 방식에는 두 가지 가능성이 있습니다.

  1. 하위 레이어를 보내도록하십시오 모두해당 정보의 많은 소비자가 모든 것을 필요로하지 않더라도 사람, XML 문서로서의 정보가 있습니다.
  2. 더 높은 레벨 레이어가 드릴 다운하고 필요한 정보를 얻을 수 있도록 API를 제공하십시오. 따라서 귀하가 제공하는 경우, 인터페이스가 비즈니스 계층에 사용자 ID가 주어진 부서의 데이터베이스 계층에 요청하도록 요청할 수있는 방법이 있습니다.

둘 다 트레이드 오프가 있습니다. 첫 번째는 해당 정보에 대한 권리가없는 소비자에게 훨씬 더 많은 정보를 노출시킵니다. 두 번째는 거래 당 정보가 훨씬 적지 만 더 많은 트랜잭션이 필요합니다. 첫 번째는 더 많은 정보가있을 때마다 API를 변경할 필요가 없지만 XML을 변경합니다. 두 번째는 기존 API의 인터페이스를 동일하게 유지하지만 필요에 따라 새로운 API를 제공합니다. 등등.

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