문제

한 두 가지가 아닌 방법

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

를 반환하는 환자체 주어집니다.나의 계약은 2 가지 방법으로

  1. 방법은 경우 null 을 반환 환자가 존재하지 않습
  2. 방법은 예외를 던지는 경우에는 환자가 존재하지 않습니다.이 경우에는 것 또한 쿼리를 정의하는 방법으면 true 를 반환합 환자에 존재하는 데이터베이스나 그렇지 않으면 false 입...

는 계약 사용해야 합니까?다른 제안이 있습니까?

업데이트:에 대한 의견을 주시기 바랍니다 이 경우에는 너무...지 않는 경우에는 데이터베이스의 할당 Id 와 그것은 무언가 사용자 입력에서 UI..다음과 같 SSN..이 다음의 어느 하나입니다.

에 대한 의견 Null 패턴에서 스티브 제가 생각하는 것은 유효합니다.좋은 생각이 여기 것으로,정말 유용하다는 것을 알고 즉시면 ID 존재하지 않았다.

그리고 나는 또한 Null 패턴 여기에는 다소 무거운 체중

댓글을에 우물에 던지기 때문에 예외의 Id:나는 생각하지 않에 오타가 있는 환자의 이름은 특별한 상황이"이럴

도움이 되었습니까?

해결책

"와이어를 통해"다른 계층으로 가면 (데이터베이스 또는 응용 프로그램 서버)가 할 수있는 가장 비싼 활동 중 하나입니다. 일반적으로 네트워크 통화는 메모리 내 호출보다 몇 배 더 오래 걸립니다.

따라서 중복 호출을 피하기 위해 API를 구성하는 동안 가치가 있습니다.

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);

그런 다음 데이터베이스에 두 번 닿거나이를 피하기 위해 좋은 캐싱에 의존 할 가능성이 높습니다.

또 다른 고려 사항은 다음과 같습니다. 어떤 곳에서는 코드에 "알려진"ID가있을 수 있습니다. 다른 곳에서는 그렇지 않습니다. 각 위치마다 다릅니다 정책 예외를 던져야하는지 여부.

다음은 과거에 좋은 효과를주기 위해 사용한 패턴입니다. 두 가지 방법이 있습니다.

// 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 ()를 호출하여 구축 할 수 있습니다.

이를 통해 호출 코드는 적절한 동작을 얻을 수 있고, 문제가 발생한 경우 예외를 던지고, 필요하지 않은 경우 예외 처리를 피할 수 있습니다.

다른 팁

또 다른 옵션은 다음과 같습니다 널 객체 패턴.

당신은 아마도 예외를 던져야합니다. 당신이있는 경우 id 그것은 유효한 환자를 가리키지 않습니다. 어디에서 왔습니까? 매우 나쁜 일이 일어 났을 것입니다. 예외적 인 상황입니다.

편집하다: 텍스트를 기반으로 검색과 같은 정수 기반 검색 이외의 일을하고 있다면 반환 null 괜찮습니다. 특히이 경우 한 번 이상 결과를 반환하고 있으며, 이는 한 명 이상 (동일한 이름을 가진 한 명 이상의 환자, 동일한 생년월일 또는 기준이 무엇이든) 일 수 있습니다.

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

때에 따라 다르지:

일반 작업이 DB의 파일과 일치하지 않는 Pation 번호가 발생하면 빈 (NULL) 레코드를 반환해야합니다.

그러나 주어진 ID가 항상 레코드에 도달해야한다고 기대한다면 (드문 경우) 발견되지 않으면 예외를 사용하십시오.

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

추신 나는 포인터를 반환하지 않을 것이다. (누가 포인터를 소유하고 있습니까 ??)
기록이 있거나 없을 수도있는 개체를 반환합니다. 그러나 내면의 기록이 존재하도록 인터 로그할 수 있습니다. 잠재적으로 Cotext를 이해하는 스마트 포인터보다 약간 더 똑똑한 스마트 포인터 또는 약간 더 똑똑합니다.

이 상황에 대한 것,내가 메소드는 null 을 반환을 위해 존재하지 않는 환자입니다.

내가 선호하는 경향이 있어요 예외를 사용하여 도움을 graeful 저하 문제가 있을 때는 시스템 자체입니다.

이 인스턴스에서,그것은 mosdt 아마:

  1. 오타에서 환자의 ID 를 입력되었으로 검색 폼
  2. 데이터 항목은 오류 또는
  3. 워크플로에 문제를 그 환자가 기록 되지 않았직 입력.

따라서 반환,null 보다는 예외입니다.

는 경우 문제가 있었 연락하여 데이터베이스가 방법을 올리는 예외는 아니다.

편집: 그냥 보는 환자 ID 에 서명했다 정수,감사 스티븐 있을 뿐만 아니라 과거에는 그래서 나는 수정의 이유입니다.

나의 기본적인 관점에 대해 묘사할 때 사용하는 예외(위한 시스템 오류)다른 방법 오류를 반환(간단한 데이터 항목은 오타)도 하지만입니다.계되었습니다.

HTH

환호

Rob

이와 같은 단순한 상황에서 1. 충분한 것 이상인 것 같습니다. 클라이언트가 전화를 걸어 NULL을 반환 한 이유를 알기 위해 콜백 방법과 같은 것을 구현할 수 있습니다. 단지 제안입니다.

Description을 액면가로 가져 가면 둘 다 필요할 것입니다.

  • Adam이 지적했듯이 잘못된 ID는 오류/예외이지만
  • 사라질 수있는 다른 곳에 ID가 주어지면 쿼리 방법이 필요합니다.

내가 올바르게 읽었다고 가정하면 ... 환자에게 전화 할 때 (100) ID가 100 인 환자에 대한 객체 참조를 반환합니다. ID가 100 인 환자가 존재하지 않으면 NULL을 반환해야한다고 생각합니다. 예외는 과도한 IMO 이며이 사건은 그것을 요구하지 않습니다. 함수는 단순히 널을 반환했습니다. 응용 프로그램이 충돌 할 수있는 오류가 발생한 케이스를 만들지 않았습니다 (물론 그 널 처리하지 않고 응용 프로그램의 다른 부분으로 전달하지 않으면).

나는 그 기능이 'null'을 반환 할 것입니다. 특히 검색의 일부인 경우 사용자가 특정 ID가있는 환자를 검색하고 객체 참조가 NULL이면 환자가없는 경우에도 간단히 말하면됩니다. 그 ID가 존재합니다.

예외를 던져.

NULL을 반환하면 다음과 같은 코드가 있습니다.

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

ID가 존재하지 않으면 nullReferenceException으로 실패합니다. 이 예에서는 여전히 추적하기가 쉽지만 다음을 고려하십시오.

somePatient = Patient(id)

// much later, in a different function:

Console.WriteLine(somePatient);

환자가 존재하는지 확인하는 함수를 추가하는 것에 대해 : 참고 이것은 환자 노 펀드 외과를 완전히 방해하지 않습니다. 예를 들어:

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

- 다른 스레드 또는 다른 프로세스는 환자 공존 전화와 환자 사이의 환자를 삭제할 수 있습니다. 또한 이는 하나가 아닌 두 개의 데이터베이스 쿼리를 의미합니다. 일반적으로 전화를 시도하고 예외를 처리하는 것이 좋습니다.

여러 값을 반환하는 쿼리 (예 : 목록)에 대해 상황이 다릅니다. 일치하지 않으면 빈 목록을 반환하는 것이 적절합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top