たまに「じゃんぬねっと」が生存確認をする日記

役員より労働者の方が楽だと思う

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  984  : 記事  4  : コメント  38836  : トラックバック  277

ニュース

My Website

初心者向けのサイトです。

C# と VB.NET の入門サイト

最近のできごと

低学歴の IT エンジニア兼管理職です。ずっとリモートワーク中。

駆け出しはブラック企業で低年収でしたが、転職を繰り返して年収は 5 倍以上になりました。

年収はこれ以上増えても幸せ指数は増えませんので、趣味の時間を増やすため早期の半リタイアを考えています。

最高の配偶者、可愛い娘、ハンサムな息子と幸せな日々を送っています。

Sponsored Link1

Sponsored Link2

Archive

書庫

また VB ですが、こういう With の使い方はやめましょう...

VB (コーディング ホラー)

Private Sub cmdBrowse_Click()
    With flxList
        .HighLight = flexHighlightNever

        ' (1) flxList と関係のない分岐
        If bFlag1 = True Then
            stSaveText = txtInputBox.Text
        End If

        .Rows = 1
        .Cols = 7
        .FixedRows = 1
        .FixedCols = 0

        ' (2) flxList と直接関係のない呼び出し
        Call SaveText(stSaveText)

        .ColWidth(0) = (.Width \ 6) + 300
        .ColWidth(1) = (.Width \ 6) - 300
        .ColWidth(2) = (.Width \ 6) - 630
        .ColWidth(3) = (.Width \ 6) + 120
        .ColWidth(4) = (.Width \ 6) + 630
        .ColWidth(5) = (.Width \ 6) - 120
        .ColWidth(6) = 0

        ' (3) ここまで右辺に乱雑に使われると可読性を損なう
        txtInputBox.Visible = True
        txtInputBox.Left = .Left + 30
        txtInputBox.Width = .ColWidth(0) + 30 - cmdBrowse.Width
        txtInputBox.Top = .Top + .RowHeight(0) * (.MouseRow - .TopRow + 1) + 30
        txtInputBox.Text = .TextMatrix(.MouseRow, .MouseCol)
        txtInputBox.SelStart = 0
        txtInputBox.SelLength = Len(txtInputBox.Text)
        txtInputBox.SetFocus

        ' (4) ここまで記述が長くなったすえに .Cols なるメンバを出されると可読性を損なう
        ' For ステートメントは、先頭の 1 行で何をどこまで繰り返すか明確でなければならない
        For i = 1 To .Cols
            .TextMatrix(.Row, i) = CStr(i)
        Next i
    End With
End Sub

こういう With ステートメントの使い方は、可読性が良くないです。
With ブロック内は、省略したメンバに関する処理のみを簡潔に記述すべきです。

(1) のような、省略した flxList と関係のない分岐 (制御フロー) の記述は避けるべきです。
そもそも、With ブロック内にある必要はないでしょう。
同様に、(2) のような関数呼び出しも避けるべきでしょう。

微妙ですが、(3) のような乱雑な使い方も NG かなと思います。
右辺値に 1 つ使われる程度なら良いのですが、こう乱発されると気持ち悪いです。

最も VB で多く見かけるパターンが (4) です。
With ブロック内の記述がここまで長くなってしまうと、何が省略されているのか第三者にはわかりにくくなります。

また、For ステートメントとなると致命的に可読性が悪くなります。
本来の For ステートメントは、1 行目で繰り返し内容が把握できなくてはなりません。

Smalltalk のカスケードのように、省略したメンバに関する記述のみにしましょう。

VB (Not コーディング ホラー)

    With flxList
        .Rows = 1
        .Cols = 7
        .FixedRows = 1
        .FixedCols = 0
    End With

With ブロック内で、省略したオブジェクトとは関係のない処理を記述するのであれば、End With で閉めた方がわかりやすいです。
End With で閉めずに長々と続けてしまう言い訳として「処理速度をあげるため」と仰る方がいます。
残念ながら、人間の目からすると大した差ではありません。
それでもというのであれば、Visual Basic を使うのをやめた方が良いかもしれません。

コーディング ホラー記事へのリンク

投稿日時 : 2006年8月12日 19:13

コメント

# re: Coding Horror 05 2006/08/12 21:35 中博俊
VB6とそれ以降では処理速度的なメリットもほぼなく・・・・

# re: Coding Horror 05 2006/08/12 22:49 じゃんぬ
ないですね。
コンパイラが賢いですし。

# re: Coding Horror 05 2006/08/13 1:04 VBVB
個人的には、他言語を併用している人には可読性が悪くなると思いますので、Withが嫌いで使っていないのだけど、使う人が多いのでしょうか?

# re: Coding Horror 05 2006/08/13 10:38 じゃんぬ
はい、かなり多いです。

推奨しているサイトも多くあるくらいですから、
何も考えずに「使うべき」だと思っている方が多いのでしょう。

# 私もプロパティの初期化くらいでしか使いません。

# re: Coding Horror 05 2006/08/13 11:59 ダッチ
はじめまして、ダッチと申します。

私にとって With 奇妙な使い方を見たことがあります。
これは Coding Horror になりましでしょうか。

----------------------------
With New Class ← ここでインスタンス化している
いろいろな処理
End With
----------------------------

このように With の部分で インスタンス化をしているのです。
私だったら必ず、 With で使うオブジェクトをローカル変数に入れます。
こういう使い方もありなのでしょうか。

# re: Coding Horror 05 2006/08/13 11:59 ShO-Ta
僕もあまりWithは使いませんが、こーやって使うと読みにくいですねー。これが乱発されるとカスタマイズの時苦労しそうです。PGには後の事も考えたソースの組み方が求められるってこってすね☆

# re: Coding Horror 05 2006/08/13 15:25 藤代千尋
すいません、VB6・VBA 房の私には、すごく読みやすいんです。(^^;
「このプロシージャでは flxList がメインである」と分かる。

# re: Coding Horror 05 2006/08/13 16:21 VBVB
このテーマ案外奥が深いですね。
じゃんぬさんのお返事と、藤代千尋さんの意見を聞いて感じたのですが、やはりVBワールドではWithは美しいものなのかもしれませんね。
考えてみれば、美的感覚なんて人それぞれですし、「郷に入れば郷に従え」とも言いますし、VBワールドでWithが美しく自然なものならば、VBワールドの住人になるとき(VBを使うとき)には、VBの歴史に敬意を示し、礼儀正しい?Withを使うべきかもしれませんね。
それにWithに限らず他言語マスターにも読みやすいプログラムにするって意外と難しいですよね。
例えば値型ひとつにしても書籍「プログラミング.NET Framework」によるとSystem.Int32などと本来の型名を使用するべきだと書かれていますしね。
(でも色が変わらないから美的感覚からすれば、気持ち悪いからついintとか書いてしまいます)

えーと、だらだらと書いてしまいましたが、言いたい事は、他言語マスターが当たり前の今日ですので、「可読性」というのは大変深い問題だと言うことです。
思い起こせば、昔goto不要論っていうのもありましたしね。
可読性は永遠のテーマですね。
大変勉強になりました。

# re: Coding Horror 05 2006/08/13 19:49 通りすがり
>藤代千尋さん
いやいや、こんな長々と使われちゃわからんですよ。
本人だからわかるんじゃないの?としかいいようがない。
せっかく(4)がダメな理由までかいてくださってるのに・・・

>VBVBさん
一度読みにくいと感じたのに「VBなプログラマでないから」で片付けるのはへんじゃない?
そういう理由ではなかったのでは?

# re: Coding Horror 05 2006/08/13 22:39 VBVB
>一度読みにくいと感じたのに「VBなプログラマでないから」で片付けるのはへんじゃない?
そういう理由ではなかったのでは?


そういう意味ではなく、C#などの他言語も使用している人の感覚とVB一本の人の可読性が違う事に考えさせられました。
私自身はじゃんねっとさんが正しいと思うのでが、VBの可読性を高める常識が我々併用者とは違うかもしれないと思ったのです。
それで、可読性を高めることは永遠のテーマであり、VBの世界観とC#の世界観とJAVAの世界観と・・・と全言語に共通した可読性向上ルールを考える事は、非常に奥が深いと思ったということです。
というのも、共通項でルールを決めると作業効率が落ちるかもしれませんし、各世界の歴史と美的感覚があるわけですから、それをどこまで思想が違う各言語が妥協・協力しあうのかが非常に難しい問題点だと思います。

# re: Coding Horror 05 2006/08/14 10:41 名無しぃシャープ
> すいません、VB6・VBA 房の私には、すごく読みやすいんです。(^^;
> 「このプロシージャでは flxList がメインである」と分かる。
僕もこの考えには反対ですな。

先頭が見えなければわからない。
逆に先頭が見えないのであれば、見る必要がある。
プロシージャは1画面に納めるべきだから(4)にあがってるような問題点はないと考えても素直ではなく、みにくいですな。
そもそも、たかが省略することに1ネストを謙譲しちゃう人の気が知れないというのが本音ですが。
だからVBのソースって平気で8ネストとかしてるのを見かけちゃうんだよなぁ。

プロシージャの中心?プロシージャに書かれたクラスが本来中心です。
それがMeです。これは何かを確認せずとも意識できるものだし意識すべきものです。

VBプログラマだから見やすいとかってもんじゃないと思いますよ。
これは、センスの問題でしょう。だから色んな言語に携わらないと視野が狭くなりますよ。と。

# re: Coding Horror 05 2006/08/14 11:20 ぽぴ王子
私も with はほとんど使わないです。
他の言語との兼ね合い(他の言語だとそういう流儀を見たことがない)というの
もあると思いますが、やはりじゃんぬさんや名無しぃシャープさんの書かれてい
るように、可読性を損なうというのがあるのではないでしょうか。
って自分のことなのに他人事みたいに言ってますが。

逆に with を多用する場合は何がいいのかというと、じゃんぬさんの書いている
ように「処理速度を上げるため」というのが一般的ですが、私としては「同じオ
ブジェクト名を何度も書かなくていいから楽」なのではないかと。
ただ、そういう理由で with を多用するのは避けたほうがいいのは明白ですし
(.NETならばインテリセンスで入力も減らせます)何よりそれと引き換えに可読
性(と名無しぃシャープさん的に言えば1ネスト)を損なうのはいただけないと
いうか、何か違うんじゃないかな~?と。

> VBプログラマだから見やすいとかってもんじゃないと思いますよ。
> これは、センスの問題でしょう。だから色んな言語に携わらないと視野が狭くなりますよ。と。

この辺はとても同意。
VB 的(MS 的?)にも with は「省略したメンバに関する記述のみ」使用される
ことを望んでいたであろうと思うのですが(実際効率的に使うととても見やすい)、
気づくと「オブジェクト名を省略するのに便利」とか謎の解釈をされて今回のよ
うなコーディングホラーが出来上がっている気がします。

# re: Coding Horror 05 2006/08/14 12:02 じゃんぬ
実は、囚人さんの書かれた内容はこのあたりで出ています。
また、With にすることによる置換ミス防止とか、
C#3.0 の「インスタンス イニシャライザ」のような使い方はどうだなどについても書いています。

VB の With って C# でどう書くんですか?
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28521&forum=7&start=8

# これまた、R・田中一郎さんの建てたスレッドなわけですが...

# re: Coding Horror 05 2006/08/14 12:16 特攻隊長まるるう
> 本人だからわかるんじゃないの?としかいいようがない。
> せっかく(4)がダメな理由までかいてくださってるのに・・・
…(汗)。オイラも房のケがあるなぁ。。。( _)_へたり

> プロシージャの中心?プロシージャに書かれたクラスが本来中心です。
> それがMeです。これは何かを確認せずとも意識できるものだし意識すべきものです。
With を使った時点で、ボクの脳みその中では置き換わっちゃいますねぇ。。。
フォームクラスでのイベントプロシージャだと Me が主役になる
方が少ないと思います。
With Me.flxList
で Me は役目を終えてると思ってます。…ってゆーか主役交代?w

> たかが省略することに1ネストを謙譲しちゃう人の気が知れない
その繰り返しで8ネストする人の気は知れないけど、ボクは1ネストは
ありですかねぇ。

もともと、分かりやすく説明するためだと思うんですが、最初の
コードって
txtInputBox.Left = .Left + 30
『.Left がそれまでに変更されていないので、cmdBrowse_Click
のイベントで処理すべきコードですらない』というような関係無い
コードが多いので。。。ちょっとサンプルコードとは離れて意見を
書いたほうが良さそう。

(1)と(2)は本当に関係無いし、いくら房でも、こんな書き方する
ヤツ居ねぇww(…と信じたい)
ただ、ずるずると修正が繰り返されると、現れやすくなるオバケだと
思います。最終的に見直すと、こんなおバカな構造になってることは
あるので気をつけよう、→自分。
あと、間接的に関係している時に書きそう。一回、With を切れば
いいの?

With と関係なく分かり難くなってる部分を修正すれば、最初の
コード程度なら、ボクの基準では許容範囲内な気がします。
> プロシージャは1画面に納めるべき
これは推奨しますけど。

(3) なんかは。。。このコードが可読性を損なってると感じるのは
分かるけど、ボクにとってはコントロール名を書いたほうが、更に
ごちゃごちゃしたように見えますが?

> With New Class ← ここでインスタンス化している
変数宣言が1つ減るんですかね?…気持ち悪いです。
…が、プロシージャ内の宣言の扱いなら、修正しろとまでは
言わないコードです。(あくまでボク基準)

結局、じゃんぬさんの言いたかったことって With をむしろ
使わないほうが良いとまで言ってるの?それとも分割した
方が良いと言ってるの?例えば
With flxList
For i = 1 To .Cols
.TextMatrix(.Row, i) = CStr(i)
Next i
End With
はアリなの?

# re: Coding Horror 05 2006/08/14 13:23 じゃんぬ
>特攻隊長まるるうさん
私は "こういう With の使い方はやめましょう" としか述べておりません。
よって、「With ステートメントなんて使うな」という意味ではないです。
私は使いませんが、使うのであれば節度ある使い方をしましょうという意味ですね。

> アリなの?

これのために使う必要もないという見方もできますが、アリなんじゃないでしょうか。

# re: Coding Horror 05 2006/08/14 14:29 あぱたろう
はじめまして。
終息しかけてる所に周回遅れですが。。。ちと投稿したくなりました。

私にとってのWith利用は、コードのグルーピングによる可読性の向上ですね。
可読性というか識別というか、特攻隊長まるるうさんの言う
>With を使った時点で、ボクの脳みその中では置き換わっちゃいますねぇ。。。
まさにコレですね( ^-^)b

基本的には、私もじゃんぬさんの書いた通りだと思ってますが
(1)(2)は、同意。
(3)は、気にしません。それに、Withの副作用というより行としての問題だと思います。
(4)は、Withの開始行から離れすぎている事を問題としてますが、常識的ステップ数ならば気にしないです。
また、「実行速度云々のWith」は「可読性を落としても良い言い訳」と常に等価ではないですよね。
⇒わかりやすく言うと、犠牲にする価値なし系の意

(私としては以上の事を踏まえると)
既に十分な結論をじゃんぬさん示しているように思います。
「VB (Not コーディング ホラー)」 の通りにするだけでネストしなくなりますし。
結果として「Withの良い所を利用できる」かつ「可読性は一定のレベルをキープ出来る」訳ですね。
と、勝手に納得と理解をしていましたが(^-^;)
#キープのレベルも高いと思いますし、規約として理想的

ついでに、真のホラーはWithのネストの罠だったりしてw
Private Sub cmdBrowse_Click()
With flxList
.Rows = 1
.Cols = 7
.FixedRows = 1
.FixedCols = 0

With txtInputBox
.Visible = True
.Left = .Left + 30 ' ま、まぢか
End With
End With
End Sub
ずいぶん前の事ですが、こんなの何度か見かけました。。。
テストしたんか?
ぃやぃや、その前にそのボタン押した事あるんか?
ぉいっ 、なんとか言えよ(T-T )

orz


# re: Coding Horror 05 2006/08/14 16:22 通りすがり
↑ワロタ。

# re: Coding Horror 05 2006/08/14 17:03 藤代千尋
終息しているところ、すいません。(^^;

リンクや、リンクのリンク先を見ました。いろいろ意見があって、「With は使わないか、限定して使わないとダメなのか、なるほど」と思いかけたのですが・・・。

やっぱり、「このブロックでは○○がメインである(主役である)」という考えを示せる With ステートメントは切りづらいです。(^^A)
# ttp://cspc.jp/~eclipse/archives/000699.html さんの意見と同じ。

特攻隊長まるるう さんが仰るように、脳内で置換されてしまいます。


ただ、多言語開発のときなどは With は使えないコードになるでしょうし、VB を知らない開発者でも理解しやすいコードにするため With の使い方を気をつけないといけないでしょうね。

今調べたら、With - End With の間が 100 行あるコードがありました。直さないとダメだコリャ。orz

# re: Coding Horror 05 2006/08/14 19:11 あぱたろう
複数の異なる人の間で、
コードという資産を共有・保守していく事を考えるとどうあるべきか?
っていうのはプロとして大事な一つのテーマだと思ってます。
こういう事考える時に、想定する物事の公約数(≒妥協点?)を取る事になるでしょうけど、最小⇔最大の選択は個(人・団体)の問題ですよね。
#想定する物事の範囲も然り。
⇒「VB (Not コーディング ホラー)」 はこの問題の最小公約数ですね。

なので、
>やっぱり、「このブロックでは○○がメインである(主役である)」という考えを示せる With ステートメントは切りづらいです。(^^A)
藤代千尋さんの周りで標準的(公約数)なら、良いんじゃないですか?
イヤミでも何でも無く、答えは一つとも思えませんし。

以上は私の感想ですw
#抽象的すぎますかね(- -;)

>真のホラーはWithのネストの罠
地方の(中)小企業における派遣くおりてぃの一例。
すべての人が…ということではありませんよ。


# re: Coding Horror 05 2006/08/15 11:56 にゃんにゃんにゃん
はじめまして。私もWithは嫌いですね。

他人の作った膨大なプログラムを修正するときって、全部解読する訳にはいかないので、検索を使ってアタリをつけることってありますよね。

例えば、
flxListのRowプロパティ辺りの修正が必要な場合、検索条件に「flxList.Row」とかしますよね。

Withを使われてると素直に検索に引っかかってこなくて、改修し忘れてミスしてしまうんですよねー。

仕方ないので「flxList」とか「.Row」で再度検索かけて、ターゲットじゃないコントロールを避けつつ、膨大なWithの1文1文を追う訳です。

僕がよく心かけている事なんですが、可読性を高めるのはもちろんですが、「改修時の事を考えて後々検索や置換をかけやすくする」ということも、よいプログラムの作り方なのではないでしょうか。


# VB のコーディング規約 (標準) に異議あり 2007/03/22 11:19 じゃんぬねっと日誌
VB のコーディング規約 (標準) に異議あり

# hi!,I really like your writing very much! share we keep up a correspondence extra approximately your article on AOL? I need an expert in this house to solve my problem. May be that's you! Having a look forward to peer you. 2018/08/24 8:49 hi!,I really like your writing very much! share we
hi!,I really like your writing very much! share we keep up a correspondence extra approximately your article on AOL? I need an expert in this house to solve my problem. May be that's you! Having a look forward to peer you.

Post Feedback

タイトル
名前
Url:
コメント: