다른 규칙과 마찬가지로, 여기서 중요한 것은 규칙의 목적과 정신을 고려하고 일부 교과서에서 규칙이 어떻게 표현되었는지 와이 사건에 적용하는 방법을 정확하게 분석하는 데 미치 지 않는 것입니다. 우리는 변호사처럼 이것에 접근 할 필요가 없습니다. 규칙의 목적은 우리가 더 나은 프로그램을 작성하도록 돕는 것입니다. 프로그램을 작성하는 목적이 규칙을 지키는 것과는 다릅니다.
단일 책임 규칙의 목적은 각 기능이 하나의 독립적이고 일관된 작업을 수행하도록하여 프로그램을 이해하고 유지하기 쉽게 만드는 것입니다.
예를 들어, 한 번 주문이 보류 중인지, 배송되었는지, 이월 주문인지 등을 확인한 코드를 반환하는 "checkOrderStatus"와 같은 함수를 작성했습니다. 그런 다음 다른 프로그래머가 와서이 기능을 수정하여 주문이 운송 될 때 수량을 갱신했습니다. 이것은 단일 책임 원칙을 심각하게 위반했습니다. 나중에 해당 코드를 읽는 다른 프로그래머는 함수 이름을보고 리턴 값이 사용 된 방법을보고 데이터베이스 업데이트를 수행 한 것으로 의심하지 않을 수 있습니다. 주문 수량을 업데이트하지 않고 주문 상태를 얻어야하는 사람은 어색한 위치에있을 것입니다. 주문 상태 부분을 복제하는 새 함수를 작성해야합니까? db 업데이트 수행 여부를 알려주는 플래그를 추가 하시겠습니까? 기타.
다른 한편으로, 나는 "두 가지"를 구성하는 것을 nitpick하지 않을 것입니다. 최근에 우리 시스템에서 고객의 시스템으로 고객 정보를 보내는 기능을 작성했습니다. 이 기능은 요구 사항을 충족시키기 위해 데이터를 일부 재 포맷합니다. 예를 들어, 데이터베이스에 널 (null) 일 수있는 필드가 있지만 널을 허용하지 않으므로 "지정되지 않음"이라는 더미 텍스트를 채워야합니다. 그렇지 않으면 정확한 단어를 잊어 버립니다. 이 기능은 데이터를 다시 포맷하고 전송하는 두 가지 작업을 수행합니다. 그러나 나는 이것을 다시 포맷하지 않고 보내지 않기를 원하기 때문에 이것을 "재 포맷"하고 "보내기"하는 것이 아니라 하나의 함수에 의도적으로 넣었습니다. 누군가 새 전화를 걸고 싶지 않아서 다시 포맷하고 전화를해야한다는 사실을 알지 못합니다.
귀하의 경우 데이터베이스를 업데이트하고 작성된 레코드의 이미지를 논리적이고 불가피하게 함께 두 가지처럼 보이는 것처럼 반환하십시오. 나는 당신의 응용 프로그램의 세부 사항을 알지 못하므로 이것이 좋은 생각인지 아닌지 확실하게 말할 수는 없지만 그럴듯하게 들립니다.
레코드에 대한 모든 데이터를 보유하는 오브젝트를 메모리에 작성하고이를 호출하기 위해 데이터베이스 호출을 수행 한 다음 오브젝트를 리턴하는 경우 이는 의미가 있습니다. 당신은 당신의 손에 물건이 있습니다. 그냥 돌려주지 그래? 객체를 반환하지 않으면 발신자가 어떻게 얻을 수 있습니까? 방금 쓴 개체를 얻으려면 데이터베이스를 읽어야합니까? 다소 비효율적 인 것 같습니다. 그는 어떻게 그 기록을 찾습니까? 기본 키를 알고 있습니까? 누군가가 쓰기 기능이 기본 키를 반환하여 레코드를 다시 읽을 수있는 것이 "법적"이라고 선언하면 왜 전체 레코드를 반환해야합니까? 차이점이 뭐야?
반면에 객체를 만드는 것이 데이터베이스 레코드를 쓰는 것과 별개의 작업이고 호출자가 쓰기를 원하지만 객체를 만들지 않는 것이 좋으면 낭비가 될 수 있습니다. 호출자가 객체를 원하지만 쓰기는하지 않을 경우 객체를 얻는 다른 방법을 제공해야합니다. 이는 중복 코드 작성을 의미 할 수 있습니다.
그러나 시나리오 1이 더 가능성이 높다고 생각하므로 아무 문제가 없습니다.