Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
DelphiRAD Studio

Delphiのwith文とローカル変数

two screens 2

このブログは、エンバカデロテクノロジーズでDelphi / RAD Studioプロダクトマネージャを務めるMarco CantuDelphi With Statements and Local Variablesの抄訳です

最近、Delphiのお客様とDelphiのwith文に対して議論を持つ機会があり、そこでローカル変数がwith文を排除する非常に良い方法であることに気がついたので、このブログで紹介したいと思います。

Delphiの開発者ならご存じだと思いますが、Object Pascal言語ではwith文を初期のPascal時代から長く使用されていますが、筆者である私も含めて多くの開発者がwith文の使用を危惧してきたのも事実です。その理由についてまず、スコープの問題点を強調した古典的なサンプルコードを例に挙げて説明しましょう。

withlvar 01 6597961

上記のコードは何を行っているのでしょうか?

このコードでは、フォームのマウスクリック(正確にはマウスダウン)のイベントハンドラ内で、ローカル変数としてボタン(TButton)を作成し、各プロパティを以下のように設定してます。

  • フォームを親に設定
  • ボタンのクラス名をCaptionプロパティに設定
  • Colorプロパティを赤に変更

さて、このサンプルコードを実行すると、下図のような間違った結果になります。

withlvar 02 8803930

TButtonクラスにはColorプロパティが存在しないため、コンパイラはColorがメソッドの現在のオブジェクト、つまりフォームを参照していると判断します。with文はオブジェクトを直接スコープに追加しますが、withのオブジェクト部分に対する操作と、現在のメソッドのselfオブジェクトに対する操作を区別する方法がありません。ここでは簡単なアプリケーションを例にしているため問題の特定も容易でしたが、これがもっと複雑なアプリケーションの場合はどうでしょうか? コードがより複雑になれば、問題に気づきにくくなるため、非常に危険です。

では、どのようにすれば、危険を回避することができるのでしょうか? 例えば、一時変数に対して繰り返し操作を行う「よりモダンな」代替手段は、インライン変数を使用することです。

1 5322377

コードは非常に似ていますが、TButtonに対する各操作の前に変数自身を置くことで、開発者はコンパイラに対して何を実現したいのかを明確にすることができます。

もし万が一、ボタンにColorを割り当てようとすると、コンパイラがそれを捕捉してエラーを表示するので、他のオブジェクトのColorを変更するのに比べて大きな利点があります。

さて当初の議論内容に戻りますが、「DelphiのObject Pascal言語からwith文は削除されるのでしょうか?」という質問に対して、さすがにObject Pascal言語で長く使用されてきた構文なので、これはすぐには実現できませんが、これとは別に「コンパイラがコードの中でwithを使っているかどうかを示すことができるように、オプションの警告を導入してほしい」という要望がありましたので、Delphiの機能改善の要求として検討したいと思います。


Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

IN THE ARTICLES