소스 코드가 아닌 지식에 DRY 적용

DRY 또는 Do Not Repeat Yourself는 프로그래밍에서 자주 반복되는 중요한 개념입니다. 우리 대부분은 코드베이스 전체에서 코드를 재사용하기 위해 추상화와 같은 방법을 사용하여 반복적인 코드 작성을 방지하기 위해 최선을 다합니다.

그러나 나는 우리 모두가 코드가 과도하게 추상화된 상황에 직면했다고 확신합니다. 예를 들어 여러 다른 코드 영역에서 공유되는 함수입니다. 논리는 아마도 60-90% 동일합니다. 그러나 이 기능은 마지막 10-40%로 다양한 논리의 모든 방식을 수행하는 여러 사례 시나리오에서 방대합니다. 우리는 깊은 곳에서 무언가 잘못되었다는 것을 알고 있지만 코드를 반복해서는 안 됩니다.

잘못된.

저는 Pragmatic Programmer를 읽기 시작했고 마침내 이 일반적인 시나리오가 왜 그렇게 잘못 느껴지는지에 대해 손가락질할 수 있었습니다.

프로그래머로서 우리는 소스 코드에 집중하고 코드를 DRY하는지 확인합니다. 그러나 DRY는 소스 코드를 위한 것이 아닙니다. 동일한 지식을 가진 코드가 반복되는 것을 방지해야 합니다. 미묘한 차이가 있지만 결정적인 차이입니다.

고립된 소스 코드에 대해 DRY에 초점을 맞추는 문제



일부 코드는 유사한 내부 또는 심지어 동일한 부분을 가질 수 있습니다. 그러나 이러한 차이는 우연의 일치일 수 있습니다.

예를 들어 구매자 사용자를 위한 로그인 코드는 판매자를 위한 로그인과 매우 유사해 보입니다. 코드가 90% 유사할 수도 있습니다. 그러나 10%의 차이 때문에 캡처되는 실제 지식은 상당히 다릅니다. 단순히 많은 사례 시나리오(스위치 사례 또는 if 문 사용)를 추가하면 밀접하게 결합되어 있어 디버그하기가 매우 어려운 코드를 생성하게 됩니다. 또한 세 번째 유형의 사용자와 경매인 및 에이전트와 같은 네 번째 유형을 추가하면 어떻게 됩니까?

아래에 간단한 예를 추가했습니다.

const logInUser = (invitationType, user) => {
    const message = `Hello ${user.userName} from ${user.org}`
    const locale = user.locale

    if (invitationType === 'buyer') {
        // Get data from buyer member table and set state
        // Make API call to get list of possible purchase options to display on welcome page
    } 
    if (invitationType === 'seller' {
        // Get data from seller member table and set state
        // Make API calls to get summary of buyers interested to notify user

    }
}


대신 DRY를 지식에 적용하는 데 집중해야 합니다. 요구 사항, 흐름 및 요구 사항이 다르면 일부가 DRY처럼 보일 수 있지만 다른 코드가 필요합니다. 큰 그림에 집중하십시오. DRY를 소스 코드에 독단적으로 적용하면 결합되어서는 안 되는 긴밀하게 결합된 코드를 만들게 됩니다.

일부 면책 조항



물론 위의 상황에서 커플링 없이 코드를 공유할 수 있는 방법이 있습니다. 각각의 합법적으로 다른 흐름을 처리하는 두 개의 개별 기능을 가질 수 있습니다. 그런 다음 서로 다른 두 시나리오를 결합하지 않는 공유 코드 부분을 안전하게 추상화할 수 있습니다. 그러면 서로 다른 지식을 캡처하는 두 코드 블록이 이 일반 코드를 안전하게 공유할 수 있습니다.

예.

const generateMessageForInvitedUser = (user) => `Hello ${user.userName} from ${user.org}`



결론



독단적으로 DRY를 소스 코드에 적용하지 마십시오. 코드 블록이 캡처하는 지식에 대해 생각해 보십시오. 지식을 반복하는 코드에는 반드시 DRY를 적용하세요. 그러나 일부 소스 코드가 유사하거나 동일한 부분이 있는 경우 이 두 개의 다른 코드 블록이 다른 지식을 캡처하는지 확인하십시오. 그렇다면 DRY를 적용하기 전에 두 번 생각하십시오.

좋은 웹페이지 즐겨찾기