フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: with文を使うべきか (DelWiki)
RAN
メンバー
投稿数: 34
with文を使うべきか (DelWiki)
on: 2013/04/14 09:15 Sun

with文を使うべきもっともな理由もあるし、使うべきでないというもっともな理由もある。
要するにこの問題は宗教論争の範疇なので各自で双方の主張を理解して
自分なりのスタイルを一つ選択してそれを一貫して使い続けるのが重要である。
間違っても他人のスタイルにあれこれ文句を言ってはいけない。

withは使うべきではない。
with文は可読性を低下させバグをもたらすので使うべきではない。
以下の例はButtonのイベントハンドラをクリアするつもりでForm1のものをクリアしてしまっている。

// わりと無理やりな例
procedure TForm1.Button1Click(Sender: TObject);
begin
with Label1.FocusControl do // FocusControlにはButton1..4のどれかがぶら下がっている。
begin
OnClick := nil; // イベントハンドラをクリア
end;
end;

// こっちはコンパイルエラーが出るのですぐバグだと分かる
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.FocusControl.OnClick := nil; // イベントハンドラをクリア
// ↑コンパイルエラーになる。↓に書き換えよう。
// (Label1.FocusControl as TButton).OnClick := nil;
end;

 
(反論)
デバッガで追っていけば変数が適切に変更されないことがすぐに分かる。
withに関係するバグはこの一種類のみなので慣れればすぐに分かる。

with文を使わなくても別に困らない。
コピーペーストすれば問題ない。

begin
foo.bar.baz.prop1 := 1;
foo.bar.baz.prop2 := 'aaa';
foo.bar.baz.prop3 := Self;
end;

あるいは参照を利用して以下のように書ける。

var
shortcut: TFooBarBaz;
begin
shortcut := foo.bar.baz;
shortcut.prop1 := 1;
shortcut.prop2 := 'aaa';
shortcut.prop3 := Self;
end;

(反論)
わざわざ変数を用意するのであれば、やせ我慢せずにwith文を使えばいい。

withは使うべきである。
with文は無駄な重複を省き可読性を向上させる。
これはwith文の主目的である。

with文を使うと速度が速くなる。

以下のようなコードはForm1->ListView?->Itemsと毎回参照をたどっていき、さらにItems[1]を取得するためのメソッドがコールされるので非効率的である。

Form1.ListView1.Items[1].SubItems.Add('foo');
Form1.ListView1.Items[1].SubItems.Add('bar');
Form1.ListView1.Items[1].SubItems.Add('baz');

with文を使うと, この作業が一度で済むので効率的である。

with Form1.ListView1.Items[1] do
begin
Add('foo'); Add('bar'); Add('baz');
end;

(反論)
参照を利用すれば同等のことが可能。

withの現実的な使い方
underconstruction 誰か書いて

Mr.XRAY
メンバー
投稿数: 192
Re: with文を使うべきか (DelWiki)
on: 2013/04/14 10:25 Sun

with 文のネストには要注意ですね.

  with AAA do begin
Color := clRed;
with BBB do begin
Color := clBlue;
end;
end;

  
この程度であれば,問題はないと思いますが. with に囲まれたプロパティなりメソッドが,
どの with にかかっているか,明確に判断できないことがあります.
実は,過去に,コード付きメールの問い合わせがあり,コードの修正に苦労したことがありました.

au
メンバー
投稿数: 16
Re: with文を使うべきか (DelWiki)
on: 2013/05/15 10:25 Wed

XE4の新機能のページにさらっと今後with文がサポートされなくなる可能性が書かれているので使用は控える方向で行くのが良いかと思います。
http://docwiki.embarcadero.com/RADStudio/XE4/ja/Delphi_XE4_%E3%81%8A%E3%82%88%E3%81%B3_C%2B%2BBuilder_XE4_%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD

[iOS 向けの 2 つの新しい Delphi モバイル コンパイラ]の項の下の方にメモとして書いてあります。

DEKO
管理者
投稿数: 2693
Re: with文を使うべきか (DelWiki)
on: 2013/05/15 11:02 Wed

引用 au2013 on 2013/05/15 10:25 Wed
XE4の新機能のページにさらっと今後with文がサポートされなくなる可能性が書かれているので使用は控える方向で行くのが良いかと思います。

 
…なるホド

with ほにゃらら.Create do
begin
...
end;

 
ってのがコードサンプルによくありますが、要注意ですね。

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.035 sec.