몇 가지 답변 을보고 Google에서 검색했지만 유용한 정보를 찾을 수 없었습니다 (예 : 불편한 부작용이 없음).
내 문제는 요약하자면, 나는 객체가 있고 그것에 대해 긴 일련의 작업 을 수행해야한다는 것입니다. 차를 만드는 것과 같은 일종의 조립 라인이라고 생각합니다.
이러한 객체는 Method Objects 라고 합니다 .
따라서이 예제에서는 어느 시점에서 installWithSeat, installFrontSeat, installWoodenInserts를 실행 해야하는 CarWithoutUpholstery가 있습니다 (작업은 서로 간섭하지 않으며 병렬로 수행 될 수도 있음). 이 작업은 CarWithoutUpholstery.worker ()에 의해 수행되고 CarWithUpholstery가 될 새로운 객체를 생성합니다.이 객체는 cleanInsides (), verifyNoUpholsteryDefects () 등을 실행합니다.
단일 단계에서의 작업은 이미 독립적입니다. 즉, 이미 임의의 순서로 실행될 수있는 하위 세트를 사용하고 있습니다 (전면 및 후면 좌석은 임의의 순서로 설치 가능).
내 논리는 현재 구현 단순화를 위해 Reflection을 사용합니다.
즉, 일단 CarWithoutUpholstery가 있으면 객체는 performSomething ()이라는 메소드를 스스로 검사합니다. 이때 모든 메소드를 실행합니다.
myObject.perform001SomeOperation();
myObject.perform002SomeOtherOperation();
...
오류와 물건을 확인하는 동안. 작업 순서 는 중요하지 않지만 , 결국 어떤 순서가 중요하다는 것을 알게되면 사전 편찬 순서를 할당했습니다. 이것은 YAGNI 와 모순 되지만 비용이 거의 들지 않습니다-간단한 sort ()-막대한 메소드 이름 바꾸기 (또는 테스트를 수행하는 다른 메소드, 예를 들어 메소드 배열)를 줄이면 절약 할 수 있습니다.
다른 예
차를 만드는 대신 누군가에 대한 비밀 경찰 보고서를 작성하여 내 사악한 대 군주 에게 제출해야한다고하자 . 내 마지막 개체는 ReadyReport입니다. 그것을 구성하기 위해 기본 정보 (이름, 성, 배우자 ...)를 수집하여 시작합니다. 이것은 나의 단계 A입니다. 배우자가 있는지 여부에 따라 B1 또는 B2 단계로 진행하여 한두 사람에 대한 성적 데이터를 수집해야 할 수도 있습니다. 이것은 나이트 라이프, 길거리 카메라, 섹스 샵 판매 영수증 등을 제어하는 다른 이블 미니언에 대한 여러 가지 쿼리로 구성됩니다. 그리고 등등.
피해자가 가족이 없다면, GetInformationAboutFamily 단계에 들어 가지 않을 것입니다. 그러나 그렇게한다면, 처음 아버지 나 어머니 또는 형제 자매를 대상으로하는지 여부는 관계가 없습니다. 그러나 FamilyStatusCheck를 수행하지 않으면 이전 단계에 속하면 그렇게 할 수 없습니다.
그것은 모두 훌륭하게 작동합니다 ...
- 추가 작업이 필요한 경우 전용 메소드 만 추가하면됩니다.
- 작업이 여러 단계에 공통적이라면 수퍼 클래스에서 상속받을 수 있습니다.
- 작업은 간단하고 독립적입니다. 한 작업의 가치가 다른 작업에 필요 하지 않습니다 ( 다른 단계에서 수행되는 작업 ).
- 줄 아래에있는 개체는 만든 개체가 해당 조건을 처음 확인하지 않은 경우 에도 존재 하지 않았기 때문에 많은 테스트를 수행 할 필요 가 없습니다. 대시 보드를 청소하고 대시 보드를 확인, 대시 보드에 삽입을 배치 할 때 즉, 내가 대시 보드가 실제로 있는지 확인 할 필요가 있다 .
- 쉽게 테스트 할 수 있습니다. 부분 개체를 쉽게 조롱하고 그에 대한 방법을 실행할 수 있으며 모든 작업은 결정적인 블랙 박스입니다.
...그러나...
I 첨가하면 문제가 발생 마지막 동작을 전체 모듈 ( "이하 N 전용 방법보다 ') 필수 복잡성 인덱스를 초과 발생 제에있어서의 물체 중 하나.
나는이 문제를 이미 위층에서 가져 왔고,이 경우에 많은 사적인 방법은 재난에 대한 이야기가 아니라고 제안했다. 복잡성 이다 가 있지만, 작업이 있기 때문에 거기에 있다 복잡하고, 실제로는 모든 것을 복잡 아니다 - 그것은 단지 오래 .
사악한 대 군주 예를 사용하여, 내 문제는 모든 대식 정보 를 요청한 사악한 대 군주 (일명 거부하는 사람 ) ,식이 하수인은 레스토랑, 간이 주방, 노점상, 라이센스가없는 노점상, 온실을 쿼리해야한다고 말합니다. 친밀로 알려진 - 등의 소유자 및 이블 (하위) 오버로드 또한 거부 할 수 없다 그는 - 나는 GetDietaryInformation 단계에서 너무 많은 쿼리를 수행하고있어 불평.
참고 : 여러 관점에서 이것은 전혀 문제가 아니라는 것을 알고 있습니다 (가능한 성능 문제 등 무시). 일어나고있는 것은 특정 측정 항목이 불만족 스럽다는 것입니다.
어떤 생각 내가 할 수있는
첫 번째 옵션 외에도 이러한 모든 옵션이 가능하며 방어 적이라고 생각합니다.
- 나는 비열한 방법을 반 내 선언 할 수 있음을 확인했습니다
protected
. 그러나 나는 테스트 과정에서 약점을 악용하고 있었고, 잡힐 때 자신을 정당화하는 것 외에는 이것을 좋아하지 않습니다. 또한, 그것은 스톱 갭 측정입니다. 필요한 작업 수가 두 배가되면 어떻게됩니까? 그렇지 않더라도, 그렇다면 어떻게해야합니까? - 이 단계를 임의로 AnnealedObjectAlpha, AnnealedObjectBravo 및 AnnealedObjectCharlie로 나눌 수 있으며 각 단계에서 수행되는 작업의 1/3을 가질 수 있습니다. 나는 이것이 실제로 시험을 통과하는 것 외에는 아무런 이점없이 복잡성 (N-1 더 많은 클래스)을 추가 한다는 인상 아래 있습니다. 물론 CarWithFrontSeatsInstalled와 CarWithAllSeatsInstalled는 논리적으로 연속적인 단계라는 것을 알 수 있습니다. 나중에 Alpha가 요구하는 Bravo 방법의 위험은 적으며, 잘 연주하면 더 작습니다. 그러나 여전히.
- 원격으로 비슷한 다른 작업을 단일 작업으로 묶을 수 있습니다.
performAllSeatsInstallation()
. 이것은 스톱 갭 측정 일 뿐이며 단일 작업의 복잡성을 증가시킵니다. 작업 A와 B를 다른 순서로 수행해야하고 E = (A + C)와 F (B + D) 안에 포장하면 E와 F를 묶어서 코드를 섞어 야합니다. . - 람다 함수 배열을 사용하고 검사를 깔끔하게 회피 할 수는 있지만 그 혼란을 발견합니다. 그러나 이것은 지금까지 가장 좋은 대안입니다. 반사를 제거합니다. 내가 가진 두 가지 문제는 아마도 가설뿐만 아니라 모든 메소드 객체 를 다시 작성하라는 요청을 받았을 것입니다
CarWithEngineInstalled
. 그리고 그것은 매우 좋은 직업 보안이 될 것이지만, 실제로 그렇게 많이 호소하지는 않습니다. 코드 커버리지 검사기는 람다 (해결 가능하지만 여전히 )에 문제 가 있음을 나타냅니다.
그래서...
- 내 최선의 선택은 어느 것입니까?
- 내가 고려하지 않은 더 좋은 방법이 있습니까? ( 아마도 깨끗하게 와서 직접 물어 보는 것이 더 좋을까요? )
- 이 디자인은 절망적으로 결함이 있습니까? 그리고이 아키텍처는 완전히 패배와 도랑을 인정하는 것이 좋습니까? 내 경력에는 좋지 않지만 잘못 설계된 코드를 작성하는 것이 장기적으로 더 나을까요?
- 현재 선택이 실제로 하나의 진정한 방법이며 더 나은 품질의 메트릭 (및 / 또는 계측)을 설치하기 위해 싸워야합니까? 이 마지막 옵션을 위해 참조가 필요합니다 ... 불평하는 동안 @PHB에서 손을 can 수 는 없습니다. 이들은 당신이 찾고있는 통계가 아닙니다 . 아무리 할 수 있고 싶어도