2009-01-05 6 views
8

가정하자 나는 환자가 것 어떤 계약 (계약에 의한 설계)이 더 좋습니까?

  • 방법이 존재하지 않는 경우는, id 주어진 환자 개체를 반환하는 방법

    public Patient(int id) 
    { 
        ---- 
    } 
    

    은 .. 내가 널 반환이 방법

    1. 방법에 계약을 정의 할 수 있습니다 환자가 존재하지 않으면 예외를 throw합니다. 이 경우 환자가 데이터베이스에 존재하면 true를 반환하는 쿼리 메서드를 정의하고 그렇지 않으면 false를 반환합니다.

    어떤 계약을 사용해야합니까? 다른 제안?

    업데이트 : 그것이 데이터베이스에 할당 된 아이디는 아니고, 사용자가 SSN처럼 ... UI에 입력 뭔가하면 ... 너무이 경우에 를 언급 해주십시오 ..는 어느 .. 더

    유효하다고 생각되는 스티브 (Steve)의 Null 패턴에 대한 설명 : 아마도 여기서는 좋은 아이디어가 아닙니다. ID가 존재하지 않았던 즉시 알면 정말 유용 할 것입니다.

    그리고 또한 나쁜 이드가 있기 때문에 여기에 널 패턴이 예외를 throw에 롭 웰스

    코멘트 다소 무거운 무게있을 거라고 생각 : 내가 환자의 이름에 오타가 예외적 인 상황 "이럴 생각하지 않습니다

  • 답변

    15

    "네트워크를 통해"다른 계층 (데이터베이스 또는 응용 프로그램 서버)이 수행 할 수있는 가장 비용이 많이 드는 작업 중 하나 인 경우 - 일반적으로 네트워크 호출은 - 메모리 호출.

    따라서 중복 호출을 피하기 위해 API를 구조화하는 동안 가치가 있습니다. - 또는이를 방지하기 위해 좋은 캐싱에 의존 할

    // Check to see if a given patient exists 
    public bool PatientExists(int id); 
    
    // Load the specified patient; throws exception if not found 
    public Patient GetPatient(int id); 
    

    그런 다음 당신은 두 번 데이터베이스를 칠 가능성이있다 : 당신의 API는 다음과 같은 경우

    는 고려하십시오.

    또 다른 고려 사항은 다음과 같습니다. 어떤 곳에서는 코드가 "잘 알려진"ID를 가질 수 있지만 다른 곳에서는 그렇지 않습니다. 각 위치는 예외를 throw해야하는지 여부에 대해 정책이 필요합니다. 분명히

    // Load the specified patient; throws exception if not found 
    public Patient GetExistingPatient(int id); 
    
    // Search for the specified patient; returns null if not found 
    public Patient FindPatient(int id); 
    

    , GetExistingPatient() FindPatient를 호출하여 구축 할 수 있습니다() -

    는 여기에 내가 과거에 좋은 효과를 사용한 패턴의 두 가지 방법이있다.

    이렇게하면 호출 코드가 적절한 동작을 얻고, 잘못된 것이 있으면 예외를 throw하고, 필요하지 않은 경우 예외 처리를 피할 수 있습니다.

    +0

    대체 티어에 대해 좋은 점입니다. +1 –

    +0

    굉장한 ... 계약에 의한 디자인 – StackUnderflow

    4

    또 다른 옵션이 될 것 Null Object pattern.

    +0

    아마도 여기서는 좋은 생각이 아닙니다. ID가 존재하지 않았을 때 즉시 알면 정말 유용 할 것입니다. –

    +0

    나는 이것이 실제로 어떻게 도움이 될지는 모르겠다. –

    +0

    그것이 이익이되는지 여부에 관계없이 그는 다른 옵션을 요청했습니다. 나중에이 옵션에 대해 알아보기 위해이 질문을 읽는 다른 사람들에게 도움이됩니다. –

    4

    당신은 아마 예외가 발생합니다. 당신이 아주 나쁜 뭔가 가능성이 일어났다?에서 왔는가 유효한 환자를 가리 키지 않는 id이있는 경우. 그것은 예외적 인 상황이다. nce.

    EDIT : 텍스트 기반 검색과 같이 정수 기반 검색 이외의 작업을 수행하는 경우 null을 반환하는 것이 좋습니다. 특히 그 경우에는 하나 이상의 결과가 될 수있는 일련의 결과 (동일한 이름, 생년월일 또는 기준에 상관없이 둘 이상의 환자 일 수 있음)가 반환되기 때문에 특히 그렇습니다.

    검색 기능은 검색 기능과 다른 계약을 가져야합니다.

    +0

    +1 - 잘못된 ID는 오류/예외입니다. –

    +0

    환자 이름의 오타가 예외적 인 상황이라고 생각하지 않습니다. "IMHO –

    +0

    @ [Rob Wells] : 문제의 기능은 환자의 것이 아닌 입력으로 정수 ID를 사용합니다 이름 : –

    1

    이와 같은 간단한 상황에서는 충분하지 않은 것 같습니다. 클라이언트가 null을 리턴 한 이유를 알기 위해 호출하는 콜백 메소드와 같은 것을 구현할 수 있습니다. 그냥 제안.

    2

    이 경우, 존재하지 않는 환자의 경우 null을 반환합니다.

    시스템 자체에 문제가있는 경우에는 성능 저하를 방지하기 위해 예외를 선호하는 경향이 있습니다. 이 경우

    , 그것은 mosdt 아마도 :

    1. 환자의 ID에 오타가 검색 폼에 입력 된 경우,
    2. 데이터 입력 오류 또는
    3. 워크 플로우 문제에 그 환자의 기록은 아직 입력되지 않았다.

    따라서 예외가 아닌 null을 반환합니다.

    데이터베이스에 연결하는 중에 문제가 발생하면 예외를 발생시킵니다.

    편집 : 서명의 환자 ID가 정수인 것을 보았습니다. 감사합니다.

    예외 (시스템 오류의 경우)와 오류를 반환하는 다른 방법 (단순한 데이터 입력 오류의 경우)을 구분할 때의 기본적인 요점은 여전히 ​​있습니다. IMHO.

    HTH

    환호,

    1

    액면 당신의 descriptiong을 가지고, 당신은 아마 둘 필요

    • 나쁜 아이디는 오류/예외 아담이 지적했듯이, 그러나
    • 다른 곳에서 ID가 사라진 경우 해당 ID가 있는지 확인하려면 쿼리 방법이 필요합니다. m
    0

    내가 제대로 ... 당신이 (100)의 ID를 가진 환자가 존재하지 않는 경우는 100 의 ID로 환자에 대한 객체 참조를 반환 환자 (100)를 호출 할 때 읽었 가정 null를 돌려 주어야한다고 생각합니다. 예외는 과도하게 사용되는 IMO이며이 경우 호출하지 않습니다. 이 함수는 단순히 null을 반환했습니다. 물론 응용 프로그램을 크래시 할 수있는 몇 가지 오류가 발생하지 않았습니다 (물론 null을 처리하지 않고 응용 프로그램의 다른 부분으로 전달한 경우 제외).

    사용자가 특정 ID가있는 환자를 검색하고 개체 참조가 null 인 경우 일부 검색의 일부인 경우 해당 함수는 'null'을 반환해야합니다. 그 이드를 가진 환자는 없다는 것입니다.

    2

    그것은 따라 달라

    당신이 정상 작동이 pation 번호가 다음 빈 (NULL) 레코드가 반환해야 할 DB에 파일을 일치하지 않는으로 이어질 것입니다 생각합니다.

    그러나 주어진 ID가 항상 레코드를 눌렀을 때 드물게 발견 될 때 (예외적이어야 함) 예상되는 경우 예외를 사용하십시오.

    DB 연결 오류와 같은 다른 것들은 예외를 생성해야합니다.
    정상적인 상황에서 예상대로 DB에 대한 쿼리는 항상 작동합니다 (0 레코드를 반환 할 수도 있지만 그렇지 않을 수도 있음).

    P. 포인터를 반환하지 않습니다. (누구가 포인터를 소유하고 있습니까 ??)
    레코드가 있거나 없을 수있는 개체를 반환합니다. 그러나 당신은 그 기록의 존재를 위해 interogated 할 수 있습니다. 잠재적으로 똑똑한 포인터 또는 그 전자 텍스트를 이해하는 스마트 포인터보다 약간 똑똑한 것.

    0

    예외를 발생시킵니다.

    는이 같은 코드를 null을 반환 경우 : ID가이 PatientNotFoundException (ID)를 말하는대로로 투표하지 않은, 존재하지 않는 경우

    Console.WriteLine(Patient(id).Name); 
    

    는 NullReferenceException이 실패합니다. 이 예에서는 추적 만 고려하는 것이 여전히 상대적으로 쉽게 :

    somePatient = Patient(id) 
    
    // much later, in a different function: 
    
    Console.WriteLine(somePatient); 
    

    환자가 존재하는지 여부를 확인하는 기능을 추가 정보 :이 완전히 PatientNotFoundExceptions을 방지하지 않습니다. 예를 들면 다음과 같습니다.

    - 다른 스레드 또는 다른 프로세스가 PatientExists 및 Patient 호출 사이에서 환자를 삭제할 수 있습니다. 또한 이것은 하나가 아니라 두 개의 데이터베이스 쿼리를 의미합니다. 일반적으로 호출을 시도하고 예외를 처리하는 것이 좋습니다.

    여러 값을 반환하는 쿼리의 경우 상황이 다릅니다. 목록으로; 여기에 일치하는 것이 없으면 빈 목록을 반환하는 것이 좋습니다.

    관련 문제