2013-01-17 2 views
6

변수에 필드가 누락되어이 변수 또는 변수에 해당 속성이 없다는 경고가 표시되면이 문제가 발생합니다. 단순한 경우에는 매우 간단합니다.null에 대한 검사는 몇 번이나 적절합니까?

if(field) 
    doSomething(field.subField); 

그러나 경험적 상황에서 나는이 터무니없는 과장법에 빠졌습니다.

if(!data 
    || !data.records 
    || !data.records[0] 
    || !data.records[0].field 
    || !data.records[0].field.id) 
    return null; 
doSomething(data); 

내말은, 어쨌든 저는 배관공이 아닌 개발자 인 것처럼 보입니다. 따라서, 수표가 충분하지만 약간의 과잉 사용이 될 수 있다는 강한 인상을 가지고 있습니다. 수표 발행시기에 관한 협약은 JS에 있습니까?

+3

은 아마 당신이 생각하는 것보다 더 많은 문제가 있습니다. – Prinzhorn

+4

도움이 될만한 라이브러리가 있습니다. https://github.com/jclem/steeltoe – epascarello

+2

['try/catch'] (https://developer.mozilla.org/en-US/docs/JavaScript) 사용 방법은 어떻습니까? /Reference/Statements/try...catch) 대신에? – Blazemonger

답변

6

나는 논쟁적인 의견으로 나옵니다. 자바 스크립트에서

이 현실적으로 발생하지 않습니다 장소에서 null 값을 확인 귀찮게하지 않습니다. 즉, null에 대한 각 중첩 된 속성을 확인하는 당신의 아이디어는 약간 과잉이며 스크립트를 복잡하게하는 역할을합니다.

내 경험에 의하면 을 배웠으므로 스크립트 오류가 발생합니다.. 이는 처리되지 않은 null이 서버를 손상 시키거나 데이터를 손상시킬 수있는 C 코드 또는 데이터베이스 코드를 작성하는 사람에게는 다소 반 직관적이지만, 스크립트 세계에서는 나중에 오류를 빨리 발견하는 것이 좋습니다. 예상치 못한 일이 발생했다는 표시없이 페이지가 계속로드되면 나중에 사용자가 버튼을 클릭하거나 양식을 제출할 때 이상한 버그 형태로 나타납니다.

내 조언 :

확인 당신이 그것에 대해 뭔가를 할 의향이 있다면 에만null합니다. 무언가 문제가 발생하면 null을 반환하는 웹 서비스가있는 경우이를 확인하고 오류 메시지를 표시하십시오. null이 아닌 값을 얻은 경우 값이 유효한 것으로 가정하고 계속 진행합니다. 실제로 전체 프로그램에 실질적인 이익을 가져다 줄 수없는 null 검사로 전체 스크립트를 낭비 할 이유가 없습니다. 이 지속적으로 코드를해야 할 경우

+0

고객이 아프고 지루하고 오류 메시지를받는 데 지치고 세상 끝날 때마다 판단 할 때 문제가 발생합니다. 자, 이제 다른 사람의 코드를 인계 했으므로 상수로 "다시 오류가 있습니다"라는 메시지를 내 머리 위로 흘려야합니다. 일반적으로 나는 당신의 생각을 좋아합니다. 나는 아마도 try/catch를 던져서 오류 메시지를 나에게보고하고, 사용자는 오류 메시지를 쳐서는 안된다. 감사! –

+0

대부분의 브라우저는'window.onerror' 이벤트도 지원하므로 이것을 잠그고 조용히 로그 할 수 있습니다. –

+0

그것에 대해 몰랐습니다. 당신은 ** window.onload' 메서드 내에서'window.onerror = function() {...}'**를 사용할 수 있다는 것을 의미합니다! 아니면 같은 레벨에 평행하게 배치해야합니까? 그리고 모든 오류를 잡아낼 수 있을까요? 아니면 여전히 try-catch *를 사용해야합니까? –

2

보통은 객체가 존재하는 경우, 그것은 항상 사용할 수 있습니다 속성의 기본 설정이 있는지 확인합니다.

예를 들어 변수 data에 값이있는 경우 records 속성이있는 객체가 비어 있어도 항상 배열입니다. 배열에 내용이 포함되어있는 경우 항상 field 속성을 갖는 객체 여야합니다. 객체는 항상 id proprty입니다. 그러면 수표는 다음으로 바뀝니다.

if (!data || data.records.length == 0) { 
    return null; 
} 
+0

나는 그 생각을 좋아한다. 그러나 내가 아래에서 언급했듯이, 덜 정통한 코더 (coder)로 프로젝트를 인수하게 된 기쁨이 있었으며, cusomter는 재개발 비용을 기꺼이 지불하지 않았다. 그들은 "고정 및 패치"에 대해서만 지불합니다. 회고전에서 프로젝트에 동의해서는 안되었지만 "이봐 요, 그냥 JS 일 뿐이니, 버그 수정을하는 것이 얼마나 힘든지"라고 ​​생각했습니다. 이제 나는 엉덩이처럼 여기에 서있다 ... –

+0

Javascript는 미친 접근, 미친 코드, 기능 상실, 그리고 물론 ... 디버깅하기가 매우 어렵다. – vtortola

+0

이 방법은'records'가 정의되지 않은 경우 캐치되지 않는 오류를 발생시킵니다. 정말로 모든 에러를 잡을 필요가 있다면'try/catch'를 사용하십시오. –

관련 문제