유형을 동적으로 선택해야 하는 코드 중복을 피하는 방법은 무엇입니까?

王林
풀어 주다: 2024-02-10 14:06:07
앞으로
1107명이 탐색했습니다.

유형을 동적으로 선택해야 하는 코드 중복을 피하는 방법은 무엇입니까?

코드를 작성할 때 다양한 조건에 따라 다양한 유형의 코드를 선택해야 하는 상황에 자주 직면합니다. 이 경우 적절한 처리가 이루어지지 않으면 코드가 장황해지고 반복될 수 있습니다. 그렇다면 이 코드 중복을 피하는 방법은 무엇입니까? PHP 편집자 Baicao가 몇 가지 간단하고 효과적인 솔루션을 제공했습니다. 살펴보겠습니다!

질문 내용

다음 코드는 비디오 스트림 파서의 간단한 예입니다. 입력은 비디오 및 오디오 프레임이 포함된 이진 데이터입니다. 각 프레임은 다음 부분으로 구성됩니다:

  1. 비디오 프레임인지 오디오 프레임인지를 나타내는 프레임 유형 플래그
  2. 제목
  3. 페이로드

목표는 스트림을 구문 분석하고 헤더 및 페이로드에서 필드를 추출하는 것입니다.

첫 번째 방법은 다음과 같습니다.

으아악

작동은 되지만 switch케이스의 코드 중복은 마음에 들지 않습니다. 기본적으로 프레임 유형이 다르기 때문에 동일한 코드를 반복해야 합니다.

중복을 피하는 한 가지 방법은 다음과 같습니다.

으아악

즉, TMap 映射来实现动态类型选择,该映射允许根据帧类型创建正确结构的实例。但是,此解决方案的代价是对每种帧类型重复 GetLength()방법을 소개합니다.

복제를 완전히 피할 수 있는 방법이 없는 것 같아 매우 불안합니다. 제가 뭔가 놓치고 있는 건가요, 아니면 단지 언어의 한계인가요?

이것은 관련 질문(실제로 동일한 문제로 인해 발생)이지만 전제에서는 동적 유형 선택의 필요성을 무시하므로 허용되는 솔루션(제네릭 사용)은 도움이 되지 않습니다.

해결 방법

King의 답변에서는 길이를 인코딩하는 데 사용되는 각 정수 유형에 대해 반복해야 합니다. Mondarin의 답변은 멋진 reflect 패키지를 사용합니다. 두 가지 문제를 모두 방지하는 솔루션은 다음과 같습니다. 이 답변은 King의 답변을 기반으로 합니다.

GetLength() 메서드를 사용하여 일반 유형을 선언합니다.

으아악

모든 헤더 유형에서 GetLength 메서드를 제거하세요. 모든 헤더 유형에 공통 길이 유형을 포함합니다.

으아악

질문에 언급됨 TMap as。 GetLength메서드가 포함된 필드에서 제공됩니다.

으아악

//m.sbmmt.com/link/ceb9f6b8ffa77c49b6b4570ea19c76bf

(질문의 코드와 마찬가지로 이 답변에서는 binary.Read 함수를 통해 간접적으로 binary.Read 函数间接使用 reflect 包。reflect 패키지를 사용합니다.

패키지는 코드를 건조하게 유지하는 데 훌륭한 도구입니다.) 🎜

위 내용은 유형을 동적으로 선택해야 하는 코드 중복을 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!