2009-02-06 4 views
4

공개 메소드에서 가장 먼저하는 일은 모든 단일 매개 변수를 사용하기 전에 유효성을 검사하고, 전달하거나 참조하고, 그 중 하나가 계약을 위반하는 경우 예외를 throw하는 것입니다. 이에매개 변수 유효성 검사가 중복으로 간주 될 수있는 경우가 있습니까?

private List<Item> m_items = ...; 

public Item GetItemByIdx(int idx) 
{ 
    if((idx < 0) || (idx >= m_items.Count)) 
    { 
     throw new ArgumentOutOfRangeException("idx", "Invalid index"); 
    } 

    return m_items[ idx ]; 
} 

: 나는 당신이 가해자에게 위반이 커밋되는 순간을 잡을 수 있습니다으로 이것은 매우 좋은 방법으로하지만, 매우 자주 나는 이와 같은 매우 간단한 게터/인덱서를 쓰기 발견했습니다 index 매개 변수가 목록의 색인과 직접 관련이 있고 목록 자체가 정확히 동일하게 수행되며 동일한 예외가 throw된다는 사실 (예 : 설명서)을 알고 있습니다. 이 인증을 제거해야합니까, 아니면 더 잘 두어야합니까?

저는 여러분들이 생각하는 것을 알고 싶었습니다. 이제 저는 큰 프로젝트를 리팩터링하는 중이고, 위와 같은 많은 경우를 발견했습니다.

미리 감사드립니다.

답변

6

단지 취향의 문제는, 이것은 당신의 예와 비슷

if (!File.Exists(fileName)) throw new ArgumentException("...");    
var s = File.OpenText(fileName); 

고려하지 않을거야하지만 OpenText() 방법은 실패 할 수있는 몇 가지 이유 (동시성, 액세스 권한)도 FileNotFound 오류로,가 . 따라서 Exists-check는 단지 보안 및 제어에 대한 잘못된 느낌을주고 있습니다.

GetItemByIdx 메서드를 작성할 때 마음에 드는 것입니다. 아마도 매우 합리적입니다. 그러나 무작위 코드에서 주위를 둘러 보면 대개 진행하기 전에 확인할 수있는 많은 가정이 있습니다. 모든 것을 반복해서 확인하는 것은 실용적이지 않습니다. 우리는 선택적이어야합니다.

그래서 GetItemByIdx와 같은 단순한 합치기 방법에서는 중복 검사를 반대합니다. 그러나 함수가 더 많은 기능을 추가하자마자, 또는 인자가 바뀌는 idx에 대해 말하는 아주 명시적인 명세가있는 경우.

엄밀히 말하자면 잘 정의 된 조건이 깨졌고 그 조건이 현재 수준과 관련이있을 때 예외가 발생해야합니다. 조건이 하위 수준에 속하면 해당 수준에서 처리해야합니다.

+0

파일 열기 작업이 실패 할 수있는 또 다른 이유 중 하나는 파일이 존재하지 않는다는 것입니다. 위험은 낮지 만 다른 사용자 나 프로세스가이를 삭제하여 검사의 무의미 함을 더할 수 있습니다. 나는 그 검사가 무의미하고 안전에 대한 잘못된 인식을 제공한다는 것에 동의한다. 시도/포착하는 것이 좋습니다. – BlackWasp

+0

... 즉, 파일을 검사하고 파일을 여는 사이에 파일을 삭제합니다. – BlackWasp

+1

그건 내가 동시성과 관련된 것들 중 하나입니다. –

1

이미 API에서 이미 완료된 작업을 복제했을 가능성은 사실이지만 지금은 그대로입니다. 오류 처리 프레임 워크가 제대로 작동하고 견고하며 성능 문제 (profiling IYF)를 발생시키지 않으면 나는 그것을 남겨두고 시간이 있으면 점차적으로 단계적으로 제거합니다. 최우선 과제는 아닙니다.

3

필자는 매개 변수 확인 만하면 코드 동작이 향상 될 것입니다. 이 경우 목록 자체에서 검사가 수행된다는 것을 알기 때문에 자신의 검사가 중복되어 추가 값을 제공하지 않으므로 걱정하지 않아도됩니다.