C++ シリーズの記事
[C++ 学習] C++ での削除に関する私の見解について話す
目次
序文
この記事では、リファクタリングに関する私の理解と、オンラインで検索したリファクタリングに関するさまざまな関連知識に基づいて要約を作成します。
C++ コードのリファクタリングでは、まず、 C++ のデータ構造、コード構造、仮想関数のカプセル化と継承などを使用するための基礎が必要です。次に、既存のコードを完全に理解し、認識している必要があります。最後に、特定のリファクタリング スキルと方法を習得する必要があります。
リファクタリングにはいくつかの手順が必要です. 最も重要で難しいのはクラスのリファクタリングです. 私が理解しているクラスのリファクタリング手順は次のとおりです. まず, クラスの関数とパブリックメソッド (外部呼び出し可能なメソッド) を設計し,次にクラスが実装する関数を検討し、プライベート メンバーとプロテクト メンバーを記述します。
1. C++ の基礎
1. クラスとオブジェクト
クラスメンバー関数でできること
- クラスの任意のオブジェクトを操作し、オブジェクトのすべてのメンバーにアクセスできます。クラスのメンバー関数とクラスで定義された変数は、クラスのメンバーです。
- クラスで定義されたメンバー関数は、関数を inline として自動的に宣言します。
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. ポリモーフィズム
ポリモーフィズムとは
- ポリモーフィズムは、親クラスとサブクラスの継承の関係と密接に関係しており、オブジェクトのメンバー関数を呼び出すときに、オブジェクトの型に応じて異なる関数が実行されることを意味します。
5. 仮想機能
-
基本クラスで仮想関数として宣言された関数は、サブクラスで再定義できます。純粋仮想関数として書くことができます:
-
純粋仮想関数は、関数の実装を提供する必要はありませんが、それ自体を実装するサブクラスに任せます。
virtual int area() = 0;
6. 抽象クラス
純粋仮想関数として宣言されたクラスにメンバー関数がある限り、そのクラスは抽象クラスと呼ばれます。抽象クラス(一般に ABC と呼ばれます)を設計する目的は、他のクラスに継承元の適切な基本クラスを提供することです。抽象クラスを使用してオブジェクトをインスタンス化することはできません。インターフェースとしてのみ使用できます。抽象クラスのオブジェクトをインスタンス化しようとすると、コンパイル エラーが発生します。同時に、仮想関数として宣言する場合は、サブクラスで定義する必要があり、特定の実装が必要であることに注意してください。
2. リファクタリングのテクニックと方法
リファクタリングする理由
-
目的:ソフトウェアの観察可能な動作を変更することなく、理解しやすさを改善し、変更のコストを削減すること。
-
時間の発展と要件の変化に伴い、元の機能を常に変更し、新しい機能を追加する必要があり、いくつかの欠陥を変更する必要があることは避けられません。変更を実装するには、元の設計フレームワークを破ることは避けられません。しばらくすると、ソフトウェアのアーキテクチャは穴だらけになります。バグが増え、保守が難しくなり、新しい要件を実現するのがますます難しくなり、ソフトウェア アーキテクチャは新しい要件をサポートする能力を徐々に失い、制約になります。
-
リファクタリング手法を使用すると、システムの外部機能は変更されず、内部構造のみが再配置されます。リファクタリングを通じて、システムの構造を常に調整し、システムが常に要件の変化に強い適応性を持つようにする
-
小さな機能が変更または追加されていることに気付くと、コード地震が引き起こされます. おそらく、設計の抽象化が理想的ではなく、機能コードが散らばっています.
1.単体テスト
-
C++ 用の Microsoft 単体テスト フレームワークを使用して C/C++ 単体テストを作成する | Microsoft Docs
-
Microsoft.VisualStudio.TestTools.CppUnitTestFramework を使用する | Microsoft Docs
2. 関数のリファクタリング
主にこのブログのコード リファクタリングを参照すると、いくつかの部分に分けることができます(1): 関数リファクタリングのルール - デスクでのサファイア - 博客园(cnblogs.com)
- Extract Method (extract function) モジュールごとに大きな関数をいくつかの小さな関数に分割しますが、過度にカプセル化しないでください
- インライン メソッド(インライン関数) は、上記の抽出関数に関連しています。
- Temp をクエリに置き換える---- 一時変数をクエリに置き換える: 一部の一時変数を関数に置き換える
- Inline Temp — インライン一時変数: 上記の Replace Temp with Query の反対
- 説明変数の導入説明変数を導入して、複雑な式を複数の変数に分割します
- 一時変数の分割-----一時変数の分解: 同時に使用することはできません
- パラメーターへの割り当てを削除---- パラメーターへの割り当てを削除
- メソッドをメソッド オブジェクトに置き換える---- 関数を関数オブジェクトに置き換える
3. クラスのリファクタリング
通常、他の多くのクラスが含まれますが、作業のこの部分が最も困難です
コードリファクタリング(2): クラス リファクタリング ルール - Qingyu Desk - ブログ ガーデン (cnblogs.com)
4. データ再構築
3. 可能な実装:
-
単体テストを書く
-
コードをクリーンアップし、不要なコードと関数を削除します
-
関数をリファクタリングしてコメントを追加する
-
クラスとデータのリファクタリングを実行する
概念:
- スムーズ、安全、停止して続行
要約する
リファクタリングはまだまだ大変で、最初は何も感じないかもしれませんが、APIの書き方やパブリックメソッドとは何か、基底クラスとして定義できるクラスは何かなど、実際の運用では多くの問題に遭遇することでしょう。以前のもの。では、なぜリファクタリング専用の本があるのでしょうか? ははは。最初に準備をすることは非常に重要だと思います。また、特により複雑なプロジェクトでは、自分の道を切り開くのはそれほど簡単ではありません。道のりは長く険しいので、時間をかけてください。
上記は本日共有されたすべてのコンテンツです. 訂正して議論することを歓迎します!