こんにちは、私が阿昌
今日記録することを学んだのは六种遗留系统常用的安全重构手法
コンテンツに関するものです。
コードの悪臭については、いくつかの基本的なものもあります安全重构手法
。レガシー システムで一般的に使用されるセキュリティ再構築方法は次のとおりです。
- 変数を抽出する
- パラメータの抽出
- 抽出方法
- インターフェイスの抽出
- メソッドまたはクラスを移動する
- モジュール間の移動をモジュール化する
安全なリファクタリング方法は、 を使用してコードのリファクタリングをIDE 自动辅助
完了し。
1.変数を抽出する
変数の抽出とは、コード式をメソッド内部変数またはクラス メンバー変数に抽出することです。
コード例を見てみましょう. コード内に if 文があり、3 つの条件判定があります。
void improveReadability() {
if (platform.toUpperCase().indexOf("Android") > -1 &&
browser.toUpperCase().indexOf("Chrome") > -1 &&
pm.equals("com.tencent.mm")) {
}
}
このサンプルコードの条件判定ロジックは比較的複雑で、段落全体を読んで意味を理解するにはある程度の時間がかかります。
適切な説明変数を抽出して式の意味を説明することで、コードの可読性を向上させることができます。
具体的には、変数を抽出するための安全なリファクタリング方法は次のとおりです。
以下は、変数を抽出してリファクタリングした後のコードです。
void improveReadability() {
boolean isAndroid = platform.toUpperCase().indexOf("Android") > -1;
boolean isChrome = browser.toUpperCase().indexOf("Chrome") > -1;
boolean isInstallWeiXin = pm.equals("com.tencent.mm");
if (isAndroid && isChrome && isInstallWeiXin) {
}
}
リファクタリングされたコードが 3 つの説明変数を抽出し、コードの可読性が向上していることがわかります。条件判断ステートメントが判断していることはすぐにわかります。
この文字列は、それが Android プラットフォームと Chrome ブラウザに属しており、WeChat がインストールされているかどうかを識別しますか?
実際には、「名前にふさわしい」名前を選択することに注意を払い命名非常重要
、「意味を表さない」略語や命名方法を使用しないようにする必要があります。
2. パラメータの抽出
Extract parameterは、メソッド内の式の結果をメソッドのパラメーターに抽出することです。
パラメーターを抽出してコードのテスト容易性を向上させることにより、変数の依存関係を切り離すことができます。
コード例と組み合わせて学習します。サンプル メソッドは、データベースから取得する必要がある userId 変数に依存しているため、コードのテスト容易性が低下します。
void improveTestability() {
String userId = UserDao.getId();
if (valid(userId)) {
Log.d("id", "improveTestability: " + userId);
}
}
この点に関して、再構成はパラメータを抽出することによって実行される。
リファクタリングしたコードは次のとおりです。
void improveTestability(String userId) {
if (valid(userId)) {
Log.d("id", "improveTestability: " + userId);
}
}
リファクタリング後、メソッドは特定のデータベース実装に依存せず、パラメーターを渡すことでメソッドの内部ロジックをテストできることがわかります。しかし、練習の過程で注意を払う必要があります参数应该是越少越好,如果参数过多就要考虑封装成对象
。
さらに、パラメーターの順序は、コードを読みやすくするために、メソッド内で使用される順序に従って配置する必要があります。
3.抽出方法
抽出方法は、コードの表現を独立した方法に抽出することです。
减少重复代码
同時に、extract メソッドを介して行うことができます提高代码的可维护性
。
コード例を見てみましょう。
public class ExtractMethod {
String name;
String password;
public void login(){
if(name == null){
return;
}
if(password == null){
return;
}
accountLogin();
}
public void Register(){
if(name == null){
return;
}
if(password == null){
return;
}
accountRegister();
}
private void accountLogin() {
}
private void accountRegister() {
}
}
これは繰り返しコードの一部であり、名前とパスワードを判断するロジックが繰り返されます。
この時点で、抽出メソッドを使用してリファクタリングできます。
これは、extract メソッドを使用してリファクタリングした後のコードです。
public void login(){
if (isInValid()) return;
accountLogin();
}
public void Register(){
if (isInValid()) return;
accountRegister();
}
private boolean isInValid() {
if (name == null) {
return true;
}
if (password == null) {
return true;
}
return false;
}
メソッドを抽出すると、繰り返しのコードを減らすだけでなく、ユーザー名とパスワードの有効性を判断するメソッドの意味を表現するために「isInValid」という適切な名前を付けることも可能です提高代码的可读性
。
ここでは、まずネーミングの問題に注意を払う必要があり、次にメソッドのサイズを制御する必要があります。メソッドの行数が超過する 50 行
(1 画面のサイズを超える) 場合は、さらに分割することをお勧めします。
もちろん、10行程度まで制御できるメソッドであれば尚更です。
4. インターフェースを抽出する
インターフェースの抽出とは、クラス内のメソッドをインターフェースメソッドとして抽出することで、本来このクラスに依存するクラスが抽出依存のインターフェースとなるようにすることです。
通常、リファクタリングの際、一部の式は最初にメソッドとして抽出され、次にインターフェースに抽出されます。
インターフェイスの抽出は、依赖行为更稳定
特定の実装への依存から特定の抽象インターフェイスへの依存に変更でき、リファクタリングされたコードは拡張が容易になります。
画像を表示する場合は、ネットワークにロードされたライブラリを介してネットワーク画像をダウンロードし、ダウンロードが完了した後にインターフェイスに表示する必要があります。
public void show() {
String url = "http://XXX";
Bitmap bitmap = new Picasso().load(url);
showImage(bitmap);
}
ネットワークの読み込みライブラリは反復プロセスで置き換えられる可能性があるため、コードをより柔軟に拡張できることが期待され、画像を表示するロジックは特定の画像読み込みフレームワークと結合されていません. この場合、安全な再構築パラメータを抽出する方法を使用して分離できます。
これは、extract インターフェイス メソッドを使用してリファクタリングした後のコードです。
private IImageLoader imageLoader;
public void show() {
String url = "http://XXX";
Bitmap bitmap = imageLoader.getBitmap(url);
showImage(bitmap);
}
ここでは、もともと特定のダウンロード イメージに依存していた実装を特定の抽象インターフェイスに依存するようにリファクタリングし、ダウンロード イメージの実装を置き換える必要がある場合は、対応する実装を注入するだけで済みます。
実際には、インターフェイスの抽出には、新しいインターフェイス クラスを定義するだけでなく、インターフェイスを呼び出すクラスにインターフェイス実装を挿入するためのコストもかかることに注意してください。
一般的に言えば、変化しやすい依存関係や不安定な依存関係をインターフェイスに抽出することを検討できます。これにより、一方ではプログラムの拡張が容易になり、他方ではコードのテスト容易性が向上します。
5. モバイル メソッドまたはクラス
この方法は比較的単純です.自動化されたツールを使用して共有プロジェクトを診断および分析します, 新しいコード構造で編成されています. クラスを移動するリファクタリング方法はコードで完全に使用されています. MOVEを使用するだけで済みます. IDE のリファクタリング機能を使用してクラスを安全に移動し、自動的に変更します。このクラスのインポートを参照してください。モバイル方式の場合は、比較的複雑です。
別々に議論するために2つのケースに分けられます:
- 1 つは、比較的単純なモバイル静的メソッドです。
- もう 1 つは、比較的複雑なモバイル非静的メソッドです。
移动静态方法
メソッドを選択して使用しMOVE 重构功能
、移動先のクラスを選択するだけです。
の場合移动非静态方法
、IDE はメンバー変数のクラスへのメソッドの移動のみをサポートし、任意に移動することはできません。
MOVE のリファクタリング機能を使用することもできます。
ここで、コードを使用した場合 Kotlin 编写
、最新の Android Studio Chipmunk はまだモバイル メソッドの機能をサポートしておらず、システムは「リファクタリングを実行できません」と表示することに注意してください。
6. クロスモジュールの動きをモジュール化する
モジュール間の動きをモジュール化するこの機能は、コンポーネントのリファクタリングにおいて重要な機能です。
コンポーネント化の過程で、ページを独立したモジュールに移動する必要があることがよくありますが、このページは他のクラスやリソース ファイルに依存している可能性があり、1 つずつ手動で分析して移動すると、このプロジェクトは間違いなく非常に困難になります . モジュール間移動のモジュール化では、クラスとその依存クラスおよびリソースを識別して、ターゲット モジュールに移動できます。
この機能により、コードとリソースを手動で移動する効率が大幅に低下する可能性があります。次に、この機能の使用方法を示します。
ここでModularizeクラスを別の独立したモジュールに移動する必要があります.このクラスは関連するクラスModularizeReationClassと文字列リソースに依存しており,一緒に移動する必要があります.具体的な操作は次のとおりです.
演習の過程で、移動したクラスの依存クラスが他のファイルで使用されている場合、Modularize のプレビュー機能でファイルをプレビューすると下線プロンプトが表示されることに注意する必要があります。まず下線プロンプトファイルを解読し、プレビュー機能で下線プロンプトがなくなるまで結合してから確認して移動します。
7. まとめ
レガシー システムで一般的に使用される 6 つのセキュリティ リファクタリング メソッドは、変数の抽出、パラメーターの抽出、メソッドの抽出、インターフェイスの抽出、メソッドまたはクラスの移動、モジュール間の移動のモジュール化です。
これらのリファクタリング手法を日常のコーディング プロセスで使用して、コード構造をより効率的に最適化し、コードの品質を向上させます。
これらの安全な再構築方法の定義、機能、および使用手順を参照用のマインド マップにまとめます。