나는 당신이 게시 한 기사 링크를 읽었습니다 .Fowler는 몇 가지 좋은 점과 그가 말한 많은 것들을 만들었습니다. 나는 수년간 우리 팀과 옹호 해왔습니다.
IMO, 괜찮은 디자인을한다면 막 다른 상황에 빠지지 않아야합니다. 나는 항상 빌딩 블록 으로 구성된 소프트웨어를 보았다 . 나는 여전히 일부 초기 디자인을 믿지만, 주요 목표는 전체 제품을 디자인하는 것이 아니라 전체 아키텍처 / 방향을 제공하여 팀이 우리 모두가 진행하고있는 공통된 그림을 시각화 할 수 있도록하는 것입니다. 큐브와 삼각형 조각이 많은 경우 조각을 두드리기 전에 성이 어떻게 구성되는지 스케치하는 것이 좋습니다.
OO 랜드에서 왔기 때문에 각 블록은 클래스이며 해당 블록의 표면 영역은 공용 인터페이스입니다 (외부 또는 파생 클래스에서 볼 수있는 것). 훌륭한 SOLID 원칙을 따르는 경우 각 블록을 매우 간단하고 직관적 인 공용 인터페이스를 갖도록해야합니다. 내 비유로 돌아가서, 간단한 모양 만 작성하도록 코드를 작성하려고합니다. 너무 복잡한 클래스 (다수의 함수, 많은 변수)를 만들 때마다 요구 사항이 변경 될 때 재사용하기 어려운 셰이프를 만듭니다.
Fowler는 진화 설계에 대한 가장 큰 위험 / 도전은 설계 결정을 코딩 시간에 맡기고 각 개발자가 그러한 결정을 내리기를 기대한다는 점에서 Fowler에 동의합니다. 적절한 피드백 메커니즘이 없으면 시스템이 고장날 수 있습니다. 새로운 기능이 필요할 때마다 확장해야 할 함수를 찾고, 내부에 어떤 종류의 조건부를 넣은 다음 해당 함수 안에 코드 전체를 추가하는 것이 매우 유혹적입니다. 때로는 이것이 필요한 전부일 수도 있지만, 이것은 데드 엔드 구성 요소로 이끄는 가장 일반적인 관례이기도합니다. 이것은 진화적인 디자인과 관련이 없습니다. 이것이 "디자인 없음"입니다.
한 걸음 물러서서 잠시 기다려야하는 한,이 클래스에는 이미 15 개의 멤버 변수가 있습니다.이 중 6 개를 추출하여 자체 포함 된 클래스에 넣으면 소프트웨어가 매우 가벼워집니다. 가볍고 유연하며 재사용 가능한 빌딩 블록. PM이 와서 제품 요구 사항의 절반을 변경하는 경우 블록을 가져 와서 선반에 다시 놓고 새로운 성을 쌓아야 할 수도 있습니다 (성 구축시와 같이 모두 사용하지 못할 수도 있음) 실린더). 그러나 그 시점에서 그것은 사업을하는 것의 일부일뿐입니다. 요구 사항이 변경되었으며 코드를 유연하고 모듈 식으로 유지함으로써 새로운 비즈니스 방향에 맞게 제품을 변경할 수 있어야합니다.
디자인에 대한이 혁신적인 접근 방식은 모든 수준의 엔지니어 기술로 작동합니다. 개인적으로 저는 매우 오랫동안 소프트웨어를 개발했으며 팀이 민첩한 방법론으로 전환하기 전에 거의 모든 QA를 사용하여 개발자 PC의 몇 가지 주요 구성 요소를 거의 고객에게 직접 배송했습니다. 동시에 이러한 구성 요소는 항상 유연하고 유지 관리가 가능합니다.
나는 소프트웨어를 디자인하는 데 상대적으로 괜찮다고 생각하려고합니다. 동시에 100 페이지 디자인 문서를 작성하여 코더에게 제공하고 작동 할 것으로 예상하면 종이 봉지로 디자인 할 수 없었을 것입니다. 작업을 시작할 때 때로는 UML과 같은 (매우 단순화 된 전체 언어가 아닌) 다이어그램을 거의 스케치하지 않았지만 코딩을 시작할 때 필요에 따라 리팩터링하고 최종 코드는 내가 원래 그린 것과 전혀 같지 않습니다. 모든 세부 사항에 대해 한두 달을 생각하더라도 다른 사람이 내 다이어그램을 가져 와서 코딩 할 때 디자인을 수정하지 않고 견고한 소프트웨어를 만들 수는 없습니다.
스펙트럼의 다른 쪽 끝에서, 현재 우리 팀 (현재 민첩하고 완벽하게 지원하고 있음)에는 지난 15 년 동안 C 만 수행 한 임베디드 랜드에서 우리와 합류 한 두 사람이 있습니다. 나는 초기 계획과 수업 계획에 분명히 도움을 주었지만, 정기적 인 코드 검토와 브레인 스토밍 세션을 통해 SOLID의 적용과 설계 원칙에 대해 논의했습니다. 그들은 내가 약간 울부 짖는 스파게티 코드를 만들었지 만, 나에게서 약간의 조금 찔림으로 이미 생산 된 것을 리팩토링하기 시작했으며 재미있는 부분은 그들 중 하나가 며칠 후에 나에게 돌아와서 싫어한다는 것입니다. 말하자면 코드를 옮기고 나면 훨씬 더 읽기 쉽고 이해할 수 있습니다. 막 다른 골목을 피했다. 포인트 I ' OO를 완전히 처음 접하는 사람이라도 경험이 많은 멘토가있는 한 "진화 적 디자인"은 "디자인 없음"과 같지 않다는 점을 상기시키기 위해 다소 괜찮은 코드를 생성 할 수 있습니다. 심지어 그의 "더 복잡한"클래스들 중 일부는 각 클래스가 그다지 책임을 갖지 않기 때문에 무섭지 않습니다 (즉, 코드가 많지 않기 때문에). 그것을 이해하고 동일한 공용 인터페이스를 가진 대체 클래스를 작성하십시오 (지금까지는 우리가 작성한 것에서이 우연의 필요성을 보지 못했으며 일주일에 두 번 코드 검토를 수행했습니다).
마지막으로, 나는 또한 디자인 문서 (적어도 현재 팀의 비즈니스 조건에 대한)를 굳게 믿고 있지만 디자인 문서의 주요 목표는 조직 메모리입니다 . 따라서 실제 문서는 코드가 생성되고 작성된 후에 작성됩니다. 리팩토링. 코딩하기 전에 일반적으로 냅킨 / mspaint / visio의 클래스를 스케치하는 빠른 (때로는 그리 빠르지 않은) 디자인 단계가 있으며,이 단계에서는 청사진이 아니라 따라야 할 경로를 만들고 코딩을 시작할 때 항상 사람들에게 상기시킵니다. 이해가되지 않는 것은 바꾸어야합니다. 이러한 알림에도 불구하고, 새로운 사람들은 심지어 부 자연스럽게 느껴도 코드를 원래 디자인에 맞추려고 시도하는 경향이 있습니다. 이것은 일반적으로 코드 검토에서 나타납니다.
Dang, 나는 많이 썼다. 미안합니다.