코드를 작성할 때 다양한 조건에 따라 다양한 유형의 코드를 선택해야 하는 상황에 자주 직면합니다. 이 경우 적절한 처리가 이루어지지 않으면 코드가 장황해지고 반복될 수 있습니다. 그렇다면 이 코드 중복을 피하는 방법은 무엇입니까? PHP 편집자 Baicao가 몇 가지 간단하고 효과적인 솔루션을 제공했습니다. 살펴보겠습니다!
다음 코드는 비디오 스트림 파서의 간단한 예입니다. 입력은 비디오 및 오디오 프레임이 포함된 이진 데이터입니다. 각 프레임은 다음 부분으로 구성됩니다:
목표는 스트림을 구문 분석하고 헤더 및 페이로드에서 필드를 추출하는 것입니다.
첫 번째 방법은 다음과 같습니다.
으아악작동은 되지만 switch
케이스의 코드 중복은 마음에 들지 않습니다. 기본적으로 프레임 유형이 다르기 때문에 동일한 코드를 반복해야 합니다.
중복을 피하는 한 가지 방법은 다음과 같습니다.
으아악즉, TMap
映射来实现动态类型选择,该映射允许根据帧类型创建正确结构的实例。但是,此解决方案的代价是对每种帧类型重复 GetLength()
방법을 소개합니다.
복제를 완전히 피할 수 있는 방법이 없는 것 같아 매우 불안합니다. 제가 뭔가 놓치고 있는 건가요, 아니면 단지 언어의 한계인가요?
이것은 관련 질문(실제로 동일한 문제로 인해 발생)이지만 전제에서는 동적 유형 선택의 필요성을 무시하므로 허용되는 솔루션(제네릭 사용)은 도움이 되지 않습니다.
King의 답변에서는 길이를 인코딩하는 데 사용되는 각 정수 유형에 대해 반복해야 합니다. Mondarin의 답변은 멋진 reflect
패키지를 사용합니다. 두 가지 문제를 모두 방지하는 솔루션은 다음과 같습니다. 이 답변은 King의 답변을 기반으로 합니다.
GetLength() 메서드를 사용하여 일반 유형을 선언합니다.
으아악모든 헤더 유형에서 GetLength 메서드를 제거하세요. 모든 헤더 유형에 공통 길이 유형을 포함합니다.
으아악질문에 언급됨 TMap
as。 GetLength
메서드가 포함된 필드에서 제공됩니다.
https://www.php.cn/link/ceb9f6b8ffa77c49b6b4570ea19c76bf
(질문의 코드와 마찬가지로 이 답변에서는 binary.Read
함수를 통해 간접적으로 binary.Read
函数间接使用 reflect
包。reflect
패키지를 사용합니다.
위 내용은 유형을 동적으로 선택해야 하는 코드 중복을 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!