N-Tier Architecture와 프로젝트의 계층 간의 우려 분리를 얼마나 엄격하게 따르나요?

StackOverflow https://stackoverflow.com/questions/533311

문제

나는 대부분의 개발자들이 다층 아키텍처에 대한 아이디어를 가지고 있다고 생각합니다. 우리는 DAL (데이터 액세스 계층), BLL (비즈니스 로직 계층)이 있으며 UI가있는 도로 끝 근처 어딘가에 있습니다. 어떻게 든 이러한 원칙을 따르는 프로젝트가 있다면, 개념적으로 속한 것들을 유지/적어도 유지하기 위해 유지 (또는 최소한 시도)? 나는 당신이 다른 많은 사람들과 함께 일하는 대기업 응용 프로그램에 특히 관심이 있습니다. 분명히 개인 장난감 프로젝트로 원하는 모든 것을 할 수 있고, 모든 종류의 건축물을 발명하고 고수 할 수 있습니다. 많은 사람들이 소프트웨어 나 전반적인 혼란에 기여한 큰 프로젝트에서는 쉽지 않습니다.

예를 들어, UI 구성 요소와 같은 것들이 데이터베이스로 직접 이동하여 BL이 제공하지 않는 "누락 된"추가 데이터를 가져 오는 것을 보았습니다. 이러한 작업은 하위 레벨, 즉 DAL로 향합니다. 선임 개발자와 이야기를 나눈 후 나는 그가 이것에 전혀 문제를 보지 못했다는 것을 알았을 때 특히 슬 sad습니다.

물론 우리는 저와 저의 관점을 공유하는 사람이 단지 완벽 주의자라고 가정 할 수 있지만, 나는 일부 "평행 한"경로를 추적하기 위해 일부 작업에서 연장 된 시간이 걸렸다는 점에서 매우 불리한 결과를 보았습니다. 데이터는 데이터베이스를 오가는 여행이며 내가 구현 한 새로운 기능의 영향을받을 수있는 사람과 어떤 방식으로 영향을받을 수 있는지 식별합니다. 내가 보는 방식으로, 이들은 누군가가 물건을 신속하게 해킹하고 가능한 빨리 작업을 닫기로 결정했을 때 약간의 저축을 과체중시키는 추가 개발 / 유지 보수 비용이 증가합니다.

당신은 "순수한"프로젝트입니까, 아니면 오래 전에 층들 사이에 명확한 선을 유지한다는 아이디어를 포기 했습니까? 여전히 올바르게 유지한다면, 이런 것들을 이해하지 못하거나 "커스텀"솔루션을 구축하고 해킹 해킹 해킹을 항상 구축하는 데 관심이없는 동료들과 어떻게 대처합니까? 또는 어느 시점에서 당신은 풍차와의 싸움을 중단하고 그것을 당신의 처벌로 받아 들였습니까?. 편집 : 많은 사람들 이이 문제에 관심이 없다는 것에 대해 다소 놀랐습니다. 그게 가장 신경 쓰지 않는 표시인가?

도움이 되었습니까?

해결책

응용 프로그램이 더 복잡할수록 우려 사항이 더 중요한 분리됩니다.

100 KLOC에서 응용 프로그램은 하나의 큰 블로브였으며, 다른 곳과 마찬가지로 양식 클래스의 비즈니스 코드와 비즈니스 클래스의 양식 방법으로 전화를 걸었습니다. 치아가 많이 울려 퍼지고 gnashing으로, 우리는 디스플레이 로직에서 비즈니스 로직을 분리했습니다. 진행 상황을 사용자에게 알리는 데 필요한 모든 수업은 UI가 침몰 한 이벤트를 제기했습니다. 그리고 잠시 동안 모든 것이 세상에 옳았습니다.

약 200 개의 KLOC, 우리는 데이터 계층을 추가했습니다. 응용 프로그램의 아키텍처는 대부분의 데이터가 들어 와서 즉시 폐기하자마자 처리 된 것입니다. 대부분의 구성 정보는 우리가 공생 관계를 공유하는 타사 응용 프로그램에 저장되었습니다. 그러나 모든 종류의 홀수 코너에서 설정이 축적되기 시작했습니다. 우리는 세 가지 구성 관리 시스템으로 상처를 입었습니다. 모두 비즈니스 논리에 복잡하게 짜여져 있습니다. 광범위한 재 작성을 통해 구성 정보를 자체 계층으로 분리하고 스트리밍 데이터 처리를 다른 계층으로 분리 할 수있었습니다.

250 KLOC 라인 근처에서, 우리는 타사 공급 업체와의 관계를 끝내고 응용 프로그램을 혼자서 만들기로 결정했습니다. 우리는 대규모 재 작성을 시작했으며 처음으로 애플리케이션에 실제 데이터베이스를 추가했습니다. 스트리밍 정보, 데이터 스토리지 및 비즈니스 로직 사이에 명확한 선이 있었기 때문에 이것은 상당히 완벽하게 통합되었습니다.

이제 500 명의 KLOC에 접근하여 응용 프로그램을 그리드 기반 아키텍처로 옮기고 있습니다. UI가 다른 컴퓨터의 비즈니스 로직에서 분리 될뿐만 아니라, 인용문의 실제 계산 및 응용 프로그램이 발송하는 주문은로드 균형을 잡고 효율성을 극대화하기 위해 확산됩니다. N-Tier 아키텍처 없이는 불가능합니다.

성장의 각 단계에서, 우리는 깨끗한 분리로 도움을 받았거나 우리 자신의 의사 소통, 데이터, 비즈니스 및 UI의 머들로 방해를 받았습니다. 이 응용 프로그램을 만들 때 그 분리보다 더 중요한 관심사는 없었을 것입니다.

다른 팁

그것은 좋은 질문입니다! 모든 asp.net 개발자가 생각해야 할 것입니다. 당신은 아마 많은 답을 얻을 것입니다. 나는이 기본적인 상식 아이디어를 권장합니다.

-"순도"뿐만 아니라 "성공적인"아키텍처의 일환으로 단순성과 전달 속도. 건축 적 이상에 대한 보유와 실용성 사이의 균형을 유지하십시오.

-일반적으로 언급 한대로 코드를 레이어로 나누는 것이 합리적 인 것 같습니다. 페이지별로 논리의 경우 더 간단하고 빠르면 페이지에 남을 수 있다고 제안합니다. 왜 한 곳에서 사용되는 코드 용 일반 비즈니스 객체를 만들 수 있습니다. "조기 최적화는 모든 악의 근본입니다."라고 말하면서.

-코딩 시간을 줄이고 가독성과 유지 관리를 향상시키기 위해 레이어와 복잡성을 최소로 유지하십시오.

이 사이트에는 아키텍처 사이트를 위해 아키텍처를하고 싶어하는 많은 순수 주의자들이 있습니다. 아키텍처를 비즈니스 문제에 대한 솔루션을 제공하는 도구로 사용하여 자체적으로 예술품이 아니라 유용한 도구가되도록하십시오. 당신을 사용하는 것보다.

우려 사항을 별도로 유지하십시오. 매우 중요합니다. UI와 비즈와 비즈를 데이터 계층과 혼합하지 마십시오. 추상화로 작업하십시오. 추상화로 작업하면 테스트 (단위 테스트)가 더 쉬워집니다 (조롱). 나는 각 층을 그 위치에 엄격하게 유지합니다. 모든 프로젝트에서 가장 높은 비용은 유지 관리입니다. 문제를 혼합하면 유지 관리는 악몽이 될 것입니다.

WinForms 앱과 ASP.NET 앱이 있습니다. 둘 다 동일한 비즈니스 객체 프로젝트 (약 140 개 클래스)를 사용합니다.

Winforms 프로젝트는 약 350 개의 양식 및 사용자 제어 클래스로 구성되며 데이터베이스에서 자신에 대한 메타 데이터가 필요합니다 (<10).

ASP.NET 프로젝트에는 약 100 개의 .aspx 페이지가 있습니다.

우리는 5 개의 클래스로 구성된 데이터 액세스 계층이 있으며,이 클래스는 ado.net, 스레드 및 트랜잭션과 관련이 있습니다. 비즈니스 객체의 요청을 SQL Server 호출로 변환합니다.

UI 계층 (양식 사이징에 대한 메타 데이터가 필요한 몇 가지 클래스를 제외하고)은 데이터베이스 액세스 권한이 전혀 없습니다. 몇 가지 예외조차도 다른 것과 마찬가지로 달을 통과합니다.

비즈니스 계층은 데이터 액세스 계층의 내부 작업에 대해 아무것도 모르고 데이터가 필요할 때 DAL 클래스에서 공개 방법 만 호출합니다.

나는 이런 종류의 일에 관해서는 근본 주의자는 아니지만, 우리는 이것에 대한 코너를자를 필요가 없었습니다.

요컨대, 100% 순수합니다. 그것은 단순히 항상 그것을 제대로하기 위해 더 잘 작동했습니다.

우리는 지금 이것으로부터 멀어 질 좋은 이유가 있어야합니다.

코드 원숭이와 순수 주의자들은 인생의 다른 극단 주의자와 매우 흡사합니다.

우리는 극단적 인 오른쪽 날개와 극한 왼쪽 날개를 가지고 있습니다. 거의 한 사람이 정확히 하나 또는 다른 사람이 거의 없으며 앉아있는 중간 지점을 찾습니다. 극단 주의자들에게는 그렇지 않다면 우리는 경계가 어디에 있는지 알지 못할 것입니다.

코드가 진행되는 한. 나는 순수 주의자 방식을 듣는다. 나는 코드 원숭이가 그들의 방법에 대한 것을 본다. 나는 내 경험을 사용하여 제가 생산하는 데 필요한 시간과 실제로 할 수있는 돈의 양과 함께 적절한 양의 유연성과 관리 가능성을 제공하는 중간 근거를 선택합니다.

코드가 클수록 수명이 길수록 다른 사람들이 코드에서 (동시에 또는 수명 동안) 작업하는 것이 더 많을수록 레이어에서 분리하는 것이 더 중요합니다. 처음에는 조금 더 불필요한 작업 인 것처럼 보이지만 장기적으로는 여러 번 그 자체로 돈을 지불합니다.

분리 시행에 관해서는 : 이것이 선임 프로그래머 나 기술 건축가가 순수한 기술 기술뿐만 아니라 좋은 소프트 기술을 필요로하는 이유입니다. 기술적으로 분리를 시행하려고 시도 할 수 있지만 (아래 참조) 결국 큰 그림을 깨끗하게 유지하기 위해 개발자를 설득하거나 강요해야합니다.

그러나 이것은 분리를 시행하는 기술적 수단이 쓸모가 없다고 말하는 것은 아닙니다. 사실, 나는 "국경을 크로스 콜"하기가 다소 어렵다는 것을 알게되면 사람들이 국경 간 인터페이스에서 실제로 필요한 것에 대해 생각하는 데 더 많은 시간을 할애하여 더 깨끗한 인터페이스를 초래할 수 있습니다. 어려움이 기술적 인 경우 (COM 또는 CORBA를 사용해야하기 때문에) 또는 다른 것 (7 페이지 양식을 3 회 작성해야 함)이 중요하지 않습니다.

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