[C++ 학습] C++ 코드 리팩토링에 대한 나의 이해에 대해 이야기하기

C++ 기사 시리즈

[C++ 학습] C++에서 삭제에 대한 내 견해에 대해 이야기하기



머리말

이 글은 리팩토링에 대한 나의 이해와 온라인에서 검색한 리팩토링에 대한 다양한 관련 지식을 바탕으로 요약한 글이다.

C++ 코드 리팩토링을 위해서는 먼저 C++ 데이터 구조, 코드 구조, 가상 함수의 캡슐화 및 상속 등 의 사용에 대한 기초가 있어야 하며 , 두 번째로 기존 코드 에 대한 완전한 이해와 인식이 있어야 하며, 마지막으로 특정 리팩토링 기술과 방법을 마스터해야 합니다.

리팩토링은 일정한 단계가 필요합니다.가장 중요하고 어려운 부분은 클래스의 리팩토링입니다.내가 이해하는 클래스의 리팩토링 단계는 다음과 같습니다.먼저 클래스의 기능과 공용 메소드(외부에서 호출 가능한 메소드)를 설계하고 , 클래스가 구현하는 기능을 고려하고 개인 멤버와 보호 멤버를 작성하십시오.


1. C++의 기초

1. 클래스와 객체

클래스 멤버 함수는 무엇을 할 수 있습니까?

  • 클래스의 모든 개체를 작동하고 개체의 모든 구성원 에 액세스할 수 있습니다 . 클래스의 멤버 함수와 클래스에 정의된 변수는 클래스의 멤버입니다.
  • 클래스에 정의된 멤버 함수는 자동으로 함수를 인라인으로 선언합니다 .

Protected는 일반적으로 파생 클래스에서 액세스할 수 있도록 기본 클래스에서 보호된 멤버 함수 또는 변수를 정의하는 데 사용됩니다 .

사용된 상속 방법에 관계없이:

  • 비공개 멤버는 이 클래스(클래스 내)의 멤버와 친구만 액세스할 수 있으며 파생 클래스에서는 액세스할 수 없습니다.
  • 보호된 멤버는 파생 클래스에서 액세스할 수 있습니다.

이 포인터와 클래스 포인터:

  • 이 포인터는 무엇이며 어디를 가리킵니까?

    • 모든 멤버 함수의 암시적 매개변수 입니다 .
    • 멤버 함수 내에서 멤버 함수를 호출한 개체를 가리키는 데 사용할 수 있습니다 .
  • 클래스에 대한 포인터를 정의하는 이유는 무엇입니까?

    • 클래스의 개체 주소를 할당하는 데 사용할 수 있는 클래스에 대한 포인터를 정의합니다 .
    • 포인터는 개체에 사용할 수 있는 멤버 함수를 조작하는 데 사용할 수 있습니다 .
class Box{
    
    
public:
    Box(int _width = 10){
    
    width = _width;}
    int getValue(){
    
    return width;}
private:
    int width;
};
Box Box1(4);
Box *ptrbox = nullptr; 
ptrbox = &Box1;
cout << ptrbox->getValue() << endl;

2. 상속

왜 상속합니까?

  • 프로그램을 보다 쉽게 ​​만들고 유지 관리할 수 있습니다.
  • 코드 기능 재사용 및 실행 효율성 향상

상속이란 무엇입니까?

  • 상속은 자전거와 로드바이크, 접는 자전거의 관계에 해당하며 , 수식어에 따라 서브클래스에서 사용할 수 있는 변수와 메서드가 정의되며, 서브클래스도 필요에 따라 새로운 메서드와 변수를 정의할 수 있습니다 .

메모:

  • 기본 클래스를 작성하는 경우 하위 클래스에서 사용할 수 있는 메서드와 변수는 protected 로 수정 해야 합니다 .

3. 함수 오버로딩

함수 오버로딩이란 무엇입니까?

  • 동일한 범위에서 원래 함수 와 이름은 같지만 매개 변수 목록과 정의가 다른 함수가 반복적으로 선언됩니다 .

4. 다형성

다형성이란 무엇입니까?

  • 다형성(Polymorphism)은 부모 클래스와 하위 클래스 상속 관계 와 밀접한 관련이 있으며, 객체의 멤버 함수를 호출할 때 객체의 유형 에 따라 다른 함수가 실행되는 것을 의미합니다 .

5. 가상 기능

  • 기본 클래스에서 가상 함수 로 선언된 함수는 하위 클래스에서 재정의할 수 있습니다. 순수 가상 함수 로 작성할 수 있습니다 .

  • 순수 가상 함수는 함수의 구현을 제공할 필요가 없지만 자체 구현을 위해 하위 클래스에 맡깁니다.

    virtual int area() = 0;
    

6. 추상 클래스

순수 가상 함수로 선언된 클래스에 멤버 함수가 있는 한 해당 클래스를 추상 클래스라고 합니다 . 추상 클래스 (일반적으로 ABC라고 함)를 설계하는 목적 은 다른 클래스에 상속할 적절한 기본 클래스를 제공하는 것입니다. 추상 클래스는 개체를 인스턴스화하는 데 사용할 수 없으며 인터페이스 로만 사용할 수 있습니다 . 추상 클래스의 개체를 인스턴스화하려고 하면 컴파일 오류가 발생합니다. 동시에 가상 함수로 선언하는 경우 하위 클래스에서 정의해야 하며 특정 구현이 있어야 합니다.


2. 리팩토링 기술 및 방법

리팩터링하는 이유

  1. 목적: 소프트웨어의 관찰 가능한 동작을 변경하지 않고 이해도를 개선하고 수정 비용을 줄입니다.

  2. 시대의 발전과 요구사항의 변화에 ​​따라 기존의 기능을 지속적으로 수정하고 새로운 기능을 추가할 필요가 있으며 일부 결함은 수정이 불가피하다. 변경을 구현하기 위해서는 원래의 디자인 프레임워크를 위반하는 것이 불가피합니다. 일정 시간이 지나면 소프트웨어의 아키텍처에 구멍이 생깁니다. 버그가 많아지고, 유지하기가 점점 어려워지고, 새로운 요구 사항을 실현하기가 점점 더 어려워지는 소프트웨어 아키텍처는 점차 새로운 요구 사항을 지원하는 능력을 상실하지만 제약이 됩니다.

  3. 리팩토링 방식을 사용하여 시스템의 외부 기능은 변경하지 않고 내부 구조만 재정렬합니다 . 리팩토링을 통해 시스템 구조를 지속적으로 조정하여 시스템이 항상 요구 사항 변경에 대한 강력한 적응력을 갖도록 합니다.

  4. 작은 기능이 수정되거나 추가된 것을 발견하면 코드 지진이 발생합니다.디자인 추상화가 이상적이지 않고 기능 코드가 너무 분산되어 있을 수 있습니다.

1. 단위 테스트

  1. C++용 Microsoft 단위 테스트 프레임워크를 사용하여 C/C++ 단위 테스트 작성 | Microsoft Docs

  2. 테스트 탐색기를 사용하여 기존 C++ 애플리케이션 단위 테스트 | Microsoft Docs

  3. 사용 Microsoft.VisualStudio.TestTools.CppUnitTestFramework | 마이크로소프트 문서

2. 함수 리팩토링

주로 이 블로그(1)의 코드 리팩토링을 참조하여 여러 부분으로 나눌 수 있습니다. 기능 리팩토링 규칙-책상에서 사파이어-博客园(cnblogs.com)

  1. Extract Method (extract function) 모듈별로 large function을 여러 개의 small function으로 나누되, over-encapsulation 하지 않음
  2. Inline Method (인라인 함수)는 위의 추출 함수와 관련이 있습니다.
  3. 임시 변수를 쿼리로 바꾸기 ---- 임시 변수를 쿼리로 바꾸기: 일부 임시 변수를 함수로 바꾸기
  4. 인라인 임시 — 인라인 임시 변수: 위의 쿼리로 임시 교체의 반대
  5. 설명 변수 소개 복잡한 표현식을 여러 변수로 분할하는 설명 변수를 소개합니다.
  6. 임시 변수 분할 -----임시 변수 분해: 동시에 사용할 수 없습니다.
  7. 매개변수 할당 제거 ---- 매개변수 할당 제거
  8. 메소드를 메소드 객체로 교체 ---- 함수를 함수 객체로 교체

3. 클래스 리팩토링

일반적으로 다른 많은 수업을 포함하며, 작업의 이 부분이 가장 어렵습니다.

다음을 참조할 수 있습니다. 코드 리팩토링(2): 클래스 리팩토링 규칙 - Qingyu Desk - 블로그 가든(cnblogs.com)

4. 데이터 재구성


3. 가능한 구현:

  1. 단위 테스트 작성

  2. 코드 정리 및 불필요한 코드 및 기능 제거

  3. 함수 리팩터링 및 더 많은 주석 추가

  4. 클래스 및 데이터 리팩토링 수행

    개념:

    1. 원활하고 안전하며 정지 및 계속

요약하다

리팩토링은 여전히 ​​매우 어렵습니다.처음에는 아무 느낌이 없을 수 있지만 API를 작성하는 방법, 공개 메서드가 무엇인지, 어떤 클래스를 기본 클래스로 정의할 수 있는지 등 실제 운영에서 많은 문제에 직면할 수 있습니다. 전에 것들. 그렇다면 리팩토링 전용 책이 있는 이유는 무엇입니까? 하하하. 먼저 준비하는 것이 매우 중요하다고 생각하며, 생각을 명확히 하는 것도 중요하다고 생각합니다. 특히 더 복잡한 프로젝트에서는 탈출구를 찾기가 쉽지 않습니다. 길이 멀고 험하니 천천히 가세요.

위 내용은 오늘 공유한 모든 내용입니다. 수정 및 토론을 환영합니다!

Supongo que te gusta

Origin blog.csdn.net/Daibvly/article/details/119954750
Recomendado
Clasificación