そのAIで、あなたの力を発揮できますか?
IBMとお客様による「新たなAIの事例や取り組み」をご紹介
コード・リファクタリングは、外部の動作を変更したり機能に影響を与えたりせずにソフトウェア・コードの内部構造を変更するソフトウェア開発手法です。これらの小さな変更は、コードの読みやすさと保守性を向上させることを目的としています。
ソフトウェア技術者であるMartin Fowler氏は、1999年に最初に出版された著書『リファクタリング』により、この手法を普及させました。コード・リファクタリングは、「コードの臭い」を排除するのに役立ちます。Fowler氏はこれを「通常はシステムのより深い問題に対応する表面的な兆候」と定義しています。また、コードの臭いとは「すぐに発見したり、嗅ぎ分けたりできる」ものだと付け加え、データのみで動作のない長いメソッドやクラスをコードの臭いの例として挙げています。
コード・リファクタリングの例としては、誤った書式の修正、説明的でない変数の名前変更、重複した関数や未使用の関数の削除、大規模で長いメソッドをより小さく管理しやすいブロックに分割することなどが挙げられます。これらの些細な動作保存の変更によってコードが壊れたりエラーが発生したりする可能性は低くなりますが、その増分効果によりソフトウェアのパフォーマンスを最適化することができます。
リファクタリングは単純な作業のように思えるかもしれませんが、いくつかの戦術はソフトウェア開発者がより戦略的なアプローチを取るのに役立ちます。
● 抽象化
● 構成
● 完全なコード転送
● Red-Green Refactoring
● 簡素化
抽象化はオブジェクト指向プログラミングにおける基本的な概念です。オブジェクトを一般化することで、複雑な詳細が隠され、重要な情報だけが残ります。
コード・リファクタリングでは、通常、大規模なコードベースに対して抽象化が実装されます。これは2つのメカニズムから構成されます。
● プルアップ方式は、サブクラスからコードをプルし、階層内の抽象クラスまたはスーパークラスに移動します。これにより、コードの重複が減り、共有属性や関数の再利用性が向上します。
● プッシュダウン方式は、再利用できないロジックや特定のサブクラスにのみ適用されるロジックのコードを抽象クラスまたはスーパークラスからサブクラスにプッシュします。
このモジュール方式では、膨大な量のコードを小さなコードに分割して、よりシンプルで管理しやすいものにします。抽出方式とインライン方式は、構成に対する2つのアプローチです。
● 抽出アプローチでは、既存のメソッドの一部を取得して新しいメソッドに移動します。これは、例えば、さまざまな関数を含む巨大なメソッドに対して実行できるため、各関数は独自のスタンドアロン・メソッドを持つことができます。
● インライン・アプローチでは、メソッドの呼び出しをメソッド自体の本体またはコンテンツに置き換え、その後メソッドを削除します。これは通常、例えば、コードが数行しかなく、単一のクラスからのみ呼び出されるメソッドに適用されます。
この手法では、属性、メソッド、その他の機能がクラス間で移動され、依存関係が軽減され、クラスの機能内およびクラス間の結合性が強化されます。この再配布により、既存のコードの設計がより論理的でバランスが取れたものになり、拡張と保守が容易になります。
Red-Green-Refactoringは、ソースコード自体の前にテストが記述されるテスト駆動開発から借用したものです。これは継続的なリファクタリングとテストを可能にする反復的な戦略です。
この3段階のプロセスは、次の手順に従います。
● Red段階では、開発者は特定のソフトウェアの動作または機能を検証するためのテストを作成します。コードがまだ作成されていないため、これらのテストは最初は失敗するように意図されています。
● Green段階では、プログラマーは指定された動作または機能のコードを記述します。ここでの目標は品質よりもスピードであるため、これはテストに合格するために必要な最小限のコードになります。
● 最後のRefactoring段階では改良が行われ、動作を維持し、関連するすべてのテストに合格しながら、よりクリーンで明確で効率的なコードに必要な改善が行われます。
ここでの目的は、コードとそれに関連するロジックを簡素化することです。これは、メソッド内のパラメーターの数を減らす、長すぎる変数またはメソッドの名前を変更する、同じ結果をもたらす条件式を組み合わせる、複雑な条件フラグメントを分離する、または条件の代わりにポリモーフィズムを使用するといった形で行うことができます。
コードのリファクタリングは、週末の掃除がはるかに簡単かつ速くなるように毎日部屋を整理することだと考えるとよいでしょう。コード・リファクタリングの目的は、ロジックの重複、コーディング標準の遵守の失敗、不明瞭な変数名の使用など、プログラマーが近道をとった結果として蓄積される技術的負債を削減することです。
ソフトウェア開発チームがコード・リファクタリングから得られるメリットは次のとおりです。
● 複雑さの軽減
● 保守性の向上
● コード可読性の向上
● よりスピーディー
リファクタリングにより、コード作成がよりシンプルになり、開発者は大規模なコードベースをより適切に理解できるようになります。新しく採用されたプログラマーも、なじみのないコードの内部の仕組みをすぐに理解できるため、メリットがあります。
コードのリファクタリングは、保守効率を改善するための基礎を築きます。明確なコードであれば、デバッグ、新しい機能の実装、既存の機能の更新、最新テクノロジへのアップグレードを行うときに、労力が少なくて済みます。製造業における予防保守と同様に、コード・リファクタリングにより、現時点で小さな修正を行って、将来の大きなバグを防ぐことができます。
コードをリファクタリングすると、コードがよりクリーンになり、理解しやすく、作業しやすくなります。リファクタリングされたコードはナビゲートもスムーズになり、ソフトウェア開発プロセスの効率化にも役立ちます。
リファクタリングは、パフォーマンスを目的とした実際のコード最適化ほど大きな影響を与えない可能性があります。ただし、よりシンプルでかさばらないコードは、より効率的なソフトウェアとより高速な実行時間に貢献できます。
リファクタリングにより明確でクリーンなコードが作成されますが、このプロセスには欠点がないわけではありません。開発チームがコードをリファクタリングする際に遭遇する可能性のある課題は次のとおりです。
● 開発者の割り当て
● バグの導入
● レガシー・コード
● スコープ・クリープ
● 時間的制約
チームは、コード・リファクタリング・プロセスに参加するメンバーとその役割および責任を決定する必要があります。これにより、プログラマーが重要なソフトウェア開発作業から遠ざかる可能性があり、小規模なチームではそのトレードオフを許容できない可能性があります。
ほんのわずかなコード変更でも、新しいバグが発生したり、既存のバグが再び発生したりする可能性があります。より複雑なコード・リファクタリングでは、機能や関数が壊れたり変更されたりする可能性もあります。
レガシー・コードとは、現在では目的を果たしているものの、時代遅れのテクノロジーを使用して開発され、積極的にサポートまたは保守されなくなった古いコードベースのことです。リファクタリング中に依存関係の問題や互換性の問題が発生する可能性があります。これには、より詳細なコード分析と、レガシー・コードに影響する変更に対処するための詳細な計画が必要です。
特に計画が立てられていない場合や明確な目標が設定されていない場合は、必要以上に修正したくなるかもしれません。特に論理的な再構築に取り組む場合、プログラマーが時間をかけてコードを調べ、どの部分を改良できるかを判断していない場合、範囲が拡大する可能性があります。
コードのリファクタリングには多くの時間がかかりますが、ほとんどの開発チームにはそれが足りません。リファクタリングの必要性とプロジェクトの期限の遵守のバランスを取り、いつ、どの程度リファクタリングするかを検討する必要があります。
コード・リファクタリングに着手する前に、プロセスの課題に対処するために次のヒントを検討してください。
● タイミングが重要
● 計画が重要
● 分析と標準化
● テストと文書化
コードのリファクタリングをいつ行うかは、なぜ行うか、どのように行うかと同じくらい重要です。これは、ソフトウェア開発チームの定期的な保守活動の一部にすることも、コード・レビューに統合することもできます。
また、新しい機能を追加したり、大幅な更新を実装したり、新しい技術スタックに切り替えたり、アプリケーション・プログラミング・インターフェース(API)やライブラリーをアップグレードしたりする前には、リファクタリングが必須です。これにより、将来的に構築できる、よりスケーラブルで適応性の高いフレームワークが作成されます。
コードのリファクタリングには時間がかかることがあるため、計画が不可欠です。開発チームは目標と範囲を考慮する必要があります。デッドコードの削除、フォーマットの修正、重複の削除などの小さな変更に数日間集中して、小さなステップを踏むことができます。より複雑なクリーンアップの場合、リファクタリングはタイムラインとより長い期間を伴うプロジェクトになります。
単純なリファクタリング・タスクでは、多くの分析は必要ないかもしれません。ただし、ロジックに関係するテクニックの場合、関連するすべてのコードを理解することが重要です。コード構造の背後にある根拠を決定すると、プログラマーはより情報に基づいた決定や意図的な変更を行うことができます。
また、チームのコーディング標準と設計原則に従うことで、コードベースの整合性とアーキテクチャーを維持できます。
リファクタリングはコードを改善することだけではありません。その改善が機能することを確認することも重要です。そのため、ソフトウェア自体とその動作がそのままであることを確認するためのテストが重要です。
開発者は独自の統合テストと単体テストを実行できますが、QAチームを含めることが重要です。機能テストを実行して機能を検証し、回帰テストを実行してリファクタリングされたコードによってバグが発生したり機能が壊れたりしていないかどうかを確認できます。
変更を文書化することもプロセスの一部である必要があります。これにより、変更の追跡が容易になり、将来のコードのリファクタリングがスムーズになります。
いくつかのツールが、コードのリファクタリングの高速化と自動化に役立ちます。ここでは、人気のあるものをいくつか紹介します。
● 統合開発環境(IDE)
● 静的コード・アナライザー
● その他のリソース
今日のIDEの多くには、コードを壊したりバグを導入したりすることなく、自動的にリファクタリングするためのサポートがすでに組み込まれています。AI主導のリファクタリング推奨事項を提供するものもあります。
コードのリファクタリングに使用できるIDEには、Java仮想マシン(JVM)に基づくプログラミング言語用のIntelliJ IDEA、Python用のPyCharm、C#、C++、.NET用のReSharper Visual Studio拡張機能などがあります。
静的アナライザーはコードを実行せずに評価します。これらのアナライザーは、一般的なプログラミングの欠陥やコード品質の問題を検出し、開発者がソフトウェア開発プロセスの早い段階でそれらを修正するのに役立ちます。
静的コード・アナライザーの例としては、複数のプログラミング言語をサポートするCodacyとオープンソースのPMD、Java 用のJArchitect、.NET用のNDepend、Ruby用のRuboCopリンターおよびフォーマッターなどがあります。
Refactoring.comはMartin Fowler氏のWebサイトで、氏の著書に掲載されているリファクタリング手法のオンライン・カタログを掲載しています。Refactoring.Guruは、リファクタリング手法と設計パターンについて説明する別のWebサイトです。
人工知能(AI)は、コードのリファクタリング・プロセスを支援できます。生成AIアプリケーションは、複雑または巨大なコードベースを分析し、その背後にあるセマンティクスとコンテキストを理解できる大規模言語モデル(LLM)を活用しています。それに基づいて、リアルタイムのリファクタリング推奨事項を迅速に提供します。
例えば、IBM® watsonx Code Assistantは、IBM® Graniteモデルを活用してバグや改善領域を特定します。次に、チームの確立されたコーディング規則に沿ったターゲットを絞った修正を提案し、コードのリファクタリングを簡素化および加速します。その他の同様のAIリファクタリング・ツールには、Amazon CodeGuru Reviewer、GitHub Copilot、OpenAI社のChatGPTなどがあります。
レガシー・コードを扱っている人向けに、IBM watsonx CodeAssistant for Zは、生成AIと自動化を組み合わせて、開発者がアプリケーションをモダナイズできるように支援します。Z Refactoring Assistantのwatsonxコード・アシスタントを使用すると、プログラマーはアプリケーションをよりモジュール化され再利用可能なサービスにリファクタリングできます。コード分析アルゴリズムを使用して、COBOLアプリケーションをモダナイズします。
他のAIシステムと同様に、開発者はAI駆動型コードのリファクタリング・ツールのアウトプットをレビューして正確性を確認する必要があります。提案された変更が期待どおりに機能することを確認するためのテストも必要です。
Instanaは、包括的なモニタリングと実行可能な洞察を提供することで、クラウド移行作業を簡素化します。
生成AIを活用すれば、メインフレーム・アプリケーションのモダナイゼーションを加速し、簡素化できます。
ハイブリッドクラウドを利用して、AI駆動型のモダナイゼーション・サービスと戦略のもとで、レガシー・アプリケーションを最適化します。
IBM web domains
ibm.com, ibm.org, ibm-zcouncil.com, insights-on-business.com, jazz.net, mobilebusinessinsights.com, promontory.com, proveit.com, ptech.org, s81c.com, securityintelligence.com, skillsbuild.org, softlayer.com, storagecommunity.org, think-exchange.com, thoughtsoncloud.com, alphaevents.webcasts.com, ibm-cloud.github.io, ibmbigdatahub.com, bluemix.net, mybluemix.net, ibm.net, ibmcloud.com, galasa.dev, blueworkslive.com, swiss-quantum.ch, blueworkslive.com, cloudant.com, ibm.ie, ibm.fr, ibm.com.br, ibm.co, ibm.ca, community.watsonanalytics.com, datapower.com, skills.yourlearning.ibm.com, bluewolf.com, carbondesignsystem.com, openliberty.io