ホームページ >ウェブフロントエンド >jsチュートリアル >よりクリーンで効率的なコードを実現するための重要な JavaScript リファクタリング手法
ベストセラー作家として、アマゾンで私の本を探索することをお勧めします。 Medium で私をフォローしてサポートを示すことを忘れないでください。ありがとう!あなたのサポートは世界を意味します!
JavaScript リファクタリングは、コードの品質と保守性の向上を目指す開発者にとって重要なスキルです。私は長年にわたって数多くのプロジェクトに取り組んできましたが、これらの手法を一貫して実装することで、より堅牢で効率的なコードベースが得られることがわかりました。
コードの匂いの検出は、多くの場合、リファクタリング プロセスの最初のステップです。コード内の潜在的な問題を特定するために、ESLint や SonarQube などのツールを利用しています。これらのツールは、未使用の変数、複雑な関数、一貫性のないスタイルなどの問題を見つけるのに役立ちます。これは、私のプロジェクトで ESLint を設定する方法の例です:
// .eslintrc.js module.exports = { env: { browser: true, es2021: true, node: true, }, extends: ['eslint:recommended', 'plugin:react/recommended'], parserOptions: { ecmaFeatures: { jsx: true, }, ecmaVersion: 12, sourceType: 'module', }, plugins: ['react'], rules: { // Custom rules 'no-unused-vars': 'error', 'max-len': ['error', { code: 100 }], 'complexity': ['error', 10], }, };
潜在的な問題を特定したら、具体的なリファクタリング手法に進みます。抽出メソッドは、私が使用する最も一般的で効果的なテクニックの 1 つです。これには、大規模で複雑な機能をより小さく、より焦点を絞った機能に分割することが含まれます。これにより、可読性が向上するだけでなく、コードがより再利用可能になり、テストが容易になります。
ショッピング カート内の商品の合計価格を計算する関数の例を考えてみましょう。
function calculateTotalPrice(items) { let total = 0; for (let item of items) { let price = item.price; if (item.onSale) { price *= 0.9; } if (item.quantity > 5) { price *= 0.95; } total += price * item.quantity; } return total; }
メソッド抽出手法を使用してこれをリファクタリングできます。
function calculateTotalPrice(items) { return items.reduce((total, item) => total + calculateItemPrice(item), 0); } function calculateItemPrice(item) { let price = applyDiscounts(item.price, item); return price * item.quantity; } function applyDiscounts(price, item) { if (item.onSale) price *= 0.9; if (item.quantity > 5) price *= 0.95; return price; }
このリファクタリングされたバージョンは読みやすく、個々のコンポーネントのテストが容易になります。
私が頻繁に使用するもう 1 つの強力なテクニックは、条件をポリモーフィズムで置換することです。このアプローチは、オブジェクトのタイプに基づいて変化する複雑な条件付きロジックを扱う場合に特に役立ちます。 if-else ステートメントや switch case を使用する代わりに、オブジェクト指向の原則を使用して、より柔軟で拡張可能なソリューションを作成できます。
商品の種類に基づいて送料を計算する関数をリファクタリングする方法の例を次に示します。
// Before refactoring function calculateShippingCost(product) { if (product.type === 'book') { return product.weight * 0.5; } else if (product.type === 'electronics') { return product.weight * 0.8 + 2; } else if (product.type === 'clothing') { return product.weight * 0.3; } return product.weight * 0.6; // Default shipping cost } // After refactoring class Product { constructor(weight) { this.weight = weight; } calculateShippingCost() { return this.weight * 0.6; } } class Book extends Product { calculateShippingCost() { return this.weight * 0.5; } } class Electronics extends Product { calculateShippingCost() { return this.weight * 0.8 + 2; } } class Clothing extends Product { calculateShippingCost() { return this.weight * 0.3; } } // Usage const book = new Book(2); console.log(book.calculateShippingCost()); // 1 const electronics = new Electronics(3); console.log(electronics.calculateShippingCost()); // 4.4
このポリモーフィックなアプローチにより、オープン/クローズの原則に準拠し、既存のコードを変更せずに新しい製品タイプを簡単に追加できます。
パラメータ オブジェクトの導入テクニックは、多くのパラメータを取る関数を扱う場合に特に便利です。関連するパラメータを 1 つのオブジェクトにグループ化することで、関数のシグネチャを簡素化し、コードをより保守しやすくすることができます。
ユーザー アカウントを作成する関数をリファクタリングする方法の例を次に示します。
// Before refactoring function createUser(firstName, lastName, email, password, birthDate, country, city, zipCode) { // User creation logic } // After refactoring function createUser(userDetails, address) { // User creation logic } // Usage createUser( { firstName: 'John', lastName: 'Doe', email: 'john@example.com', password: 'securepass', birthDate: '1990-01-01' }, { country: 'USA', city: 'New York', zipCode: '10001' } );
このリファクタリングされたバージョンは読みやすいだけでなく、関数のシグネチャを変更せずにフィールドの追加や削除が簡単になるため、柔軟性も向上しています。
重複コードの削除は、私が常に念頭に置いているリファクタリングの重要な側面です。コードが重複すると不整合が生じ、メンテナンスが困難になる可能性があります。私はよく、共通の機能を共有関数またはモジュールに抽出します。
React コンポーネントで重複したコードをリファクタリングする方法の例を次に示します。
// .eslintrc.js module.exports = { env: { browser: true, es2021: true, node: true, }, extends: ['eslint:recommended', 'plugin:react/recommended'], parserOptions: { ecmaFeatures: { jsx: true, }, ecmaVersion: 12, sourceType: 'module', }, plugins: ['react'], rules: { // Custom rules 'no-unused-vars': 'error', 'max-len': ['error', { code: 100 }], 'complexity': ['error', 10], }, };
このリファクタリングにより重複が排除され、コードの保守性と一貫性が向上します。
変数と関数の名前変更は、私が頻繁に使用するシンプルかつ強力なテクニックです。明確でわかりやすい名前は、コードの理解を大幅に強化し、自己文書として機能します。私は常に、変数や関数の目的や動作を正確に説明する名前を使用するよう努めています。
たとえば、次の代わりに:
function calculateTotalPrice(items) { let total = 0; for (let item of items) { let price = item.price; if (item.onSale) { price *= 0.9; } if (item.quantity > 5) { price *= 0.95; } total += price * item.quantity; } return total; }
次のようにリファクタリングします。
function calculateTotalPrice(items) { return items.reduce((total, item) => total + calculateItemPrice(item), 0); } function calculateItemPrice(item) { let price = applyDiscounts(item.price, item); return price * item.quantity; } function applyDiscounts(price, item) { if (item.onSale) price *= 0.9; if (item.quantity > 5) price *= 0.95; return price; }
この単純な変更により、追加のコメントを必要とせずに、関数の目的がすぐに明確になります。
最後に、複雑な式の単純化は、コードを読みやすく、保守しやすくするために私が使用しているテクニックです。中間変数または関数を使用して、複雑な論理式をより小さく管理しやすい部分に分割すると、コードの明瞭さが大幅に向上します。
複雑な条件をリファクタリングする方法の例を次に示します。
// Before refactoring function calculateShippingCost(product) { if (product.type === 'book') { return product.weight * 0.5; } else if (product.type === 'electronics') { return product.weight * 0.8 + 2; } else if (product.type === 'clothing') { return product.weight * 0.3; } return product.weight * 0.6; // Default shipping cost } // After refactoring class Product { constructor(weight) { this.weight = weight; } calculateShippingCost() { return this.weight * 0.6; } } class Book extends Product { calculateShippingCost() { return this.weight * 0.5; } } class Electronics extends Product { calculateShippingCost() { return this.weight * 0.8 + 2; } } class Clothing extends Product { calculateShippingCost() { return this.weight * 0.3; } } // Usage const book = new Book(2); console.log(book.calculateShippingCost()); // 1 const electronics = new Electronics(3); console.log(electronics.calculateShippingCost()); // 4.4
このリファクタリングされたバージョンは非常に読みやすく理解しやすく、各条件を個別にテストできます。
私の経験では、これらのリファクタリング手法を継続的に適用すると、コードの品質が大幅に向上します。その結果、コードの理解、保守、拡張が容易になります。ただし、リファクタリングは継続的なプロセスであることを覚えておくことが重要です。要件が変化し、新しい機能が追加されると、コードを継続的にレビューしてリファクタリングして、コードをクリーンかつ効率的に保つ必要があります。
定期的なリファクタリングから私が見つけた主な利点の 1 つは、新しい機能の追加やバグの修正がはるかに簡単になることです。コードが適切に構造化されており、理解しやすい場合、変更が必要な領域をすばやく特定し、新たなバグを導入することなく必要な変更を加えることができます。
さらに、リファクタリングはパフォーマンスの向上につながることがよくあります。複雑なロジックを簡素化し、冗長性を削除することで、多くの場合、コードの実行を高速化し、使用するリソースを減らすことができます。これは、特にブラウザ環境においてパフォーマンスがユーザー エクスペリエンスに大きな影響を与える可能性がある JavaScript では特に重要です。
私が特に価値があると考えるリファクタリングのもう 1 つの側面は、チーム内での知識の共有が容易になることです。コードがクリーンで適切に構造化されていると、他の開発者が理解しやすく、作業しやすくなります。これによりコラボレーションが向上し、新しいチーム メンバーの新人研修に必要な時間を大幅に短縮できます。
これらのテクニックは強力ですが、慎重に適用する必要があることにも注意してください。オーバーエンジニアリングは、アンダーエンジニアリングと同様に問題となる可能性があります。目標は、適切なバランスを見つけることです。コードを可能な限りシンプルかつ明確にすることですが、これ以上単純にすることはできません。
結論として、これらの JavaScript リファクタリング手法を習得することは、開発者としての私のキャリアにおいて非常に貴重でした。彼らは、より良いコードを書き、より効率的に作業し、チームとより効果的に共同作業するのに役立ちました。締め切りに間に合うように急いで開発を進めたくなることがありますが、時間をかけて定期的にリファクタリングすることが長期的には有益であることがわかりました。これにより、変化する要件に適応し、プロジェクトの成長に合わせて拡張できる、より堅牢で保守しやすいコードベースが実現します。私たちは JavaScript でできることの限界を押し広げ続けており、これらのリファクタリング技術は今後もすべての開発者のツールキットに不可欠なツールであり続けるでしょう。
101 Books は、著者 Aarav Joshi が共同設立した AI 主導の出版社です。高度な AI テクノロジーを活用することで、出版コストを信じられないほど低く抑えており、書籍によっては $4 という低価格で販売されており、誰もが質の高い知識にアクセスできるようにしています。
Amazon で入手できる私たちの書籍 Golang Clean Code をチェックしてください。
最新情報とエキサイティングなニュースにご期待ください。本を購入する際は、Aarav Joshi を検索して、さらに多くのタイトルを見つけてください。提供されたリンクを使用して特別割引をお楽しみください!
私たちの作品をぜひチェックしてください:
インベスターセントラル | 投資家中央スペイン人 | 中央ドイツの投資家 | スマートな暮らし | エポックとエコー | 不可解な謎 | ヒンドゥーヴァ | エリート開発者 | JS スクール
Tech Koala Insights | エポックズ&エコーズワールド | インベスター・セントラル・メディア | 不可解な謎 中 | 科学とエポックミディアム | 現代ヒンドゥーヴァ
以上がよりクリーンで効率的なコードを実現するための重要な JavaScript リファクタリング手法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。