고 품질 코드 를 만 드 는 30 개의 황금 수칙(암시 적 형식 변환 우선)

6431 단어 고 품질코드
고 품질 코드 를 작성 하 는 30 개의 황금 수칙-Day 01(암시 적 형식 변환 우선).본 고 는 비트 비 오리지널 로 발표 되 었 으 며,전 재 는 반드시 글 의 시작 부분 에 링크 를 첨부 해 야 합 니 다.https://www.byteflying.com/archives/6455
이 시 리 즈 는 비트 페 이 가 오리지널 로 발표 한 것 으로 3 개 월 동안 30 편의 글 을 써 서 고 품질 코드 를 작성 하 는 일반적인 준칙 을 제공 할 계획 이다.
1.개술
암시 적 형식 전환 은 마이크로소프트 가 C\#익명 형식 을 지원 하기 위해 가입 한 것 으로 var 를 사용 하면 코드 의 가 독성 을 더욱 강하 게 할 수 있 고 심지어 심각 한 성능 문 제 를 해결 하 는 데 도움 을 줄 수 있다.var 의 역할 체 제 를 명확 하 게 이해 하기 위해 서 우 리 는 먼저 컴 파일 러 가 var 를 위해 어떤 일 을 했 는 지 살 펴 보 자.
2.컴 파일 러 는 var 키 워드 를 위해 무엇 을 했 습 니까?
먼저 var 는 문법 사탕 입 니 다.컴 파일 러 는 컴 파일 할 때 오른쪽 값 에 따라 표현 식 유형 을 추정 한 다음 에 컴 파일 러 가 추정 한 표현 식 형식 을 IL 에 기록 하기 때문에 다음 과 같은 2 단 코드 는 IL 에서 완전히 일치 합 니 다.
컴 파일 기간 에 컴 파 일 러 는 오른쪽 값 인"SomeString"에 따라 이 표현 식(오른쪽 값)의 유형 을 string 형식 으로 추정 할 수 있 습 니 다.따라서 var 를 string 으로 바 꾸 고 IL 에 기록 합 니 다.따라서 상기 두 단락 에서 foo 를 초기 화 한 코드 결 과 는 완전히 일치 합 니 다.

string foo = "SomeString";
var foo = "SomeString";
두 단락 코드 의 IL 을 다시 봅 시다.

본문 예제 의 소스 코드

DnSpy 의 역 컴 파일 결과

Microsoft 기술 지원 문서 의 ldstr 설명
메모:string 도 문법 사탕 입 니 다.컴 파일 할 때 string 은 System.String 으로 바 뀌 어 IL 에 씁 니 다.
그래서 우 리 는 중요 한 결론 을 얻 었 다.
var 는 문법 사탕 으로 컴 파일 기간 에 컴 파일 러 에 의 해 결정 되 었 고 개발 자 는 컴 파일 러 에 유형 을 결정 할 수 없습니다.
암시 적 유형 이 상기 코드 로 전환 되 는 것 은 좋 은 가 독성 을 가 져 왔 습 니 다.모든 개발 자 는 두 번 째 줄 코드 의 var 유형 을 알 게 될 것 입 니 다.이 는 코드 세 션 에서 우리 가 주목 해 야 할 부분 에 더욱 관심 을 가지 게 합 니 다.그 유형 에 중점 을 두 는 것 이 아 닙 니 다.대부분 의미 가 없 기 때문이다.
3.암시 적 유형 전환 이 가 져 온 좋 은 가 독성
좋 은 가 독성 문 제 를 이해 하기 위해 서 우 리 는 먼저 코드 세 션 을 보 겠 습 니 다.

var foo = new SomeType();
상기 코드 는 명확 합 니 다.코드 를 유지 하 는 사람 에 게 이해 비용 을 증가 하지 않 았 습 니 다.foo 의 유형 은 Some Type 유형 입 니 다.많은 우수한 오픈 소스 프로젝트 에서 대량으로 사용 되 는 공장 모델 도 비슷 한 방법 을 제공 했다.다음 과 같은 코드 세 션:

var huaWei = PhoneFactory.CreatePhone();
간단 한 정적 공장 류 Phone Factory 는 Create Phone 방법 을 공개 했다.이 코드 를 읽 는 개발 자 들 은 이해 원 가 를 거의 증가 하지 않 은 상황 에서 huaWei 가 휴대 전화 공장 류 를 대표 하여 생산 하 는 휴대 전화 대상 을 잘 알 고 있다.그러나 아래 의 코드 는 상황 이 조금 다 를 수 있 습 니 다.

var result = someObject.DoSomething(someParameter);
result 의 유형 과 그 가 표현 하 는 의 미 를 쉽게 알 수 없습니다.사실은 그의 좋 지 않 은 가 독성 은 다음 과 같은 몇 가지 측면 에 나타 납 니 다.
1.여기 서 result 라 는 변수 이름 은 가장 좋 은 선택 이 아 닙 니 다.
2.someobject 의 의미 가 불분명 하 다.
3.무언 가 모호 하지 않 음;
4.someParameter 코드 가 무엇 인지 명확 하 게 알 수 없습니다.
다음 코드 로 바 꾸 면 상황 이 많이 좋아 질 것 입 니 다.

var mostPopularPhone = someObject.DoSomething(someParameter);
상황 이 호전 되 었 으 니 뜻 도 더욱 분명 하 다.어의 상하 문 을 결합 하면 var 의 유형 은 자명 하 다.그러나 이런 상황 에서 저 는 코드 를 다음 과 같은 형식 으로 바 꿀 것 을 건의 합 니 다.

Phone mostPopularPhone = someObject.DoSomething(someParameter);
이것 은 내 가 이전에 있 었 던 회사 의 개발 수첩 에 쓰 여 있 는데,나 는 나의 경험 이 반드시 정확 하 다 고 믿는다.
우리 다시 새로운 예 시 를 보 자.

var score = GetSomeNumber();
 
var rate = score / 100;
rate 의 유형 은 변수 score 에 의 해 결정 되 고 개발 자 는 score 의 유형 을 한눈 에 볼 수 없 기 때문에 이것 은 좋 지 않 은 가 독성 코드 세 션 입 니 다.우 리 는 다음 으로 바 꿔 야 합 니 다.

var score = GetSomeNumber();
 
double rate = score / 100;
어 때,이런 코드 를 보고 마음 이 많이 편 해 졌 지?이해 비용 이 더 낮 아 져 서 마음 이 편 해 졌 습 니 다.벽돌 을 한꺼번에 옮 겨 도 5 층 으로 옮 길 수 있 습 니 다.
그래서 우 리 는 두 가지 총 결 을 얻 었 다.
1.의미 가 명확 하고 코드 문맥 이 비교적 명확 할 때(간단 한 변수 정의 나 공장 방법)var 를 우선 사용 하 는 것 을 권장 합 니 다.
2.다른 복잡 한 상황 에서 가능 한 한 var 의 유형 을 직접 작성 합 니 다.
암시 적 유형 전환 이 가 져 온 것 은 결코 좋 은 가 독성 만 이 아니 라 가끔 발견 하기 어 려 운 bug 를 없 애 는 데 도움 을 줄 수 있 습 니 다.이것 은 어떻게 된 일 입 니까?
4.암시 적 유형 전환 은 우리 에 게 심각 한 성능 문 제 를 해결 해 준다.
사람 은 자신 이 세계 에서 가장 똑똑 한 생물 이 라 고 생각 하지만 사실은 그렇지 않다.가끔 은 컴 파일 러 가 우리 보다 훨씬 똑똑 하고 믿 을 만하 다.
다음 두 코드 세 션 을 살 펴 보 겠 습 니 다.

public IEnumerable<string> GetPhoneStartsWith1(string prefix) {
  IEnumerable<string> phones =
          from r in db.Phones
          select r.PhoneName;
 
  var result = phones.Where(r => r.StartsWith(prefix));
  return result;
}
public IEnumerable<string> GetPhoneStartsWith2(string prefix) {
  var phones =
    from r in db.Phones
    select r.PhoneName;
 
  var result = phones.Where(r => r.StartsWith(prefix));
  return result;
}
상기 두 단락 의 코드 는 어떤 차이 가 있 습 니까?GetPhone Starts With 1 방법 중의 phones 의 원래 반환 유형 은 IQueryable<string>이 어야 합 니 다.그러나 여기 서 명시 적 으로 설 명 된 phones 의 IEnumerable에 의 해 강제 전환 되 었 습 니 다.EF 에 익숙 한 친구 들 은 IQuery able가 불 러 오 는 것 을 지연 시 키 기 위해 그 자체 가 바로 수 거 라 이브 러 리 를 조회 하지 않 습 니 다.사실은 표현 식 트 리 만 생 성 되 었 습 니 다.최종 적 으로 데 이 터 를 사용 해 야 할 때 만 검색 동작 을 제대로 수행 할 수 있 습 니 다.
그래서 GetPhone Starts With 1 방법 은 데이터베이스 에 있 는 가능 한 모든 데 이 터 를 모두 로 컬 로 되 찾 은 다음 var result = phones.Where(r => r.StartsWith(prefix)); 로 컬 필 터 를 실행 하여 네트워크 자원 을 너무 많이 소모 하고.Net 의 데이터 필터 메커니즘 을 사용 했다.
GetPhone Starts With 2 방법 은 그렇지 않 습 니 다.phones 의 유형 은 컴 파일 러 에 의 해IQueryable<string>로 추정 되 고 이 로 인해 조회 작업 을 수행 하지 않 습 니 다.진정한 조회 동작 은var result = phones.Where(r => r.StartsWith(prefix));에 의 해 실 행 됩 니 다.즉,그의 데이터 여과 동작 은 데이터 베이스 엔진 에 의 해 연산 되 고 최종 적 으로 조건 에 맞 는 데 이 터 를 로 컬 로 보 내 며 네트워크 전달 원 가 를 절약 할 수 있 습 니 다.또 연산 원 가 를 절약 하 였 는데,어찌 일거양득 이 아니 겠 는가?
5.총화
  • 의미 가 명확 하고 코드 문맥 이 비교적 명확 할 때(간단 한 변수 정의 나 공장 방법)var 를 우선 사용 하 는 것 을 권장 합 니 다.
  • 다른 복잡 한 상황 에서 가능 한 한 var 의 유형 을 직접 작성 한다.
  • 가능 한 한 컴 파일 러 를 믿 고 대부분 우리 보다 훨씬 우수 하 다.
  • 개발 자 는 상기 개발 수칙 을 명심 해 야 한다.그렇지 않 으 면 인민 대중 이 너 를 미워 할 것 이 고 너의 친구 와 가족 도 너 를 비 웃 고 미워 할 것 이다.
    이 시 리 즈 는 비트 페 이 가 오리지널 로 발표 한 것 으로 3 개 월 동안 30 편의 글 을 써 서 고 품질 코드 를 작성 하 는 일반적인 준칙 을 제공 할 계획 이다.
    총결산
    고 품질 코드 를 만 드 는 30 가지 황금 수칙(암시 적 형식 변환 우선)에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.고 품질 코드 를 만 드 는 30 가지 황금 수칙 에 관 한 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기