C 언어로 라이브러리 함수를 학습할 때 문자열 연산과 관련된 많은 함수들이 결과에 관련된 포인터를 반환한다는 사실이 아직도 어렴풋이 기억납니다. 실제로 우리가 전달하는 대부분의 매개변수에 이미 이 포인터가 포함되어 있기 때문에 이 반환 값은 많은 경우에 그다지 필요하지 않습니다. 이 반환 값을 추가하면 계단식 표현식을 쉽게 작성할 수 있다는 것이 가장 큰 장점입니다. 그러나 실제 작업을 하면서 캐스케이드 표현이 악마의 파이라는 느낌이 점점 더 많이 들었습니다.
예를 들어 C 언어에서는 strcpy, strcat 등의 문자열 연산 함수에 익숙합니다. 해당 프로토타입은 일반적으로 다음과 같습니다. extern char *strxxx(char *dest, char *src)
Return value char *사실 매개변수에서 *dest를 호출하면 다음과 같이 캐스케이드 표현을 쉽게 작성할 수 있습니다.
char *title = "Mr. "
char *name = "birdshome" ;
int len = strlen(strcat(title, name));
객체 지향 프로그래밍에서는 메소드를 통해 객체를 반환하여 체인 표현식을 작성할 수 있습니다. 캐스케이드 표현식이든 체인 표현식이든 코드를 작성할 때 더 편리할 수 있지만 잘못 사용하면 매우 답답할 수도 있습니다. 특히 계단식 표현식의 경우 중첩된 함수가 너무 많으면 이해하기 어렵고 디버깅도 매우 답답해집니다.
다음 JavaScript 캐스케이드 문은 나를 오랫동안 우울하게 만들었습니다. . . DimInfo.push(StringHelper.ArrayToString(item.m_DimensionName,
item.m_DimensionUniqueName, item.m_AnalyticStatus,
(item.m_IsParameterized ? 'checked' : ''), item.m_DimensionType), levelTypes); 올바른 문은 다음과 같아야 합니다:dimInfo.push(StringHelper.ArrayToString(item.m_DimensionName,
item.m_DimensionUniqueName, item.m_AnalyticStatus,
(item.m_IsParameterized ? 'checked' : ''), item .m_DimensionType , levelTypes));
문제는 끝에서 두 번째 괄호 ")"에 있습니다. 원래 이 괄호는 levelTypes 매개변수 뒤에 있어야 하는데 주의를 기울이지 않아서 levelTypes 앞에 넣었습니다. , 한눈에보기가 매우 어렵습니다. 더욱 우울한 점은 JavaScript가 함수의 매개변수 개수나 매개변수 존재 여부에 전혀 관심이 없기 때문에 이 잘못된 명령문이 "정상적으로" 실행될 수 있지만 데이터가 백그라운드로 전송된 후에는 필요한 값을 입력할 수 없다는 것입니다. 항상 정의되지 않습니다. 복합 매개변수를 확장한 후의 코드는 다음과 같습니다. var ect = Dashboard.getBoundingClientRect()
var innerX = event.clientX-ret.left-1;
var innerY = event.clientY-ret.top;
this.InsertNewRoom(dashboard, innerX, innerY, event)
이 확장 코드는 없습니다. 논리가 추가되었지만 임시 변수 innerX 및 innerY를 추가하는 명령문은 복합 매개변수가 있는 명령문보다 분명히 훨씬 이해하기 쉽습니다. 이런 방식으로 더 많은 코드가 있더라도 코드의 논리와 효율성을 변경하지 않고 코드를 자체 문서화할 수 있습니다. 나는 다른 사람의 코드를 디버깅하거나 수정할 때 후자의 작성 방식을 보고 싶다고 생각합니다.