Website初心者向けのサイトです。採用判断は私がします。基幹システムはすべて内製。そのため保守的な人はお断りします。開発に自信のある人はメッセください。給与が低いのが一般的ですが、独立系ソフトハウスより高い設定にしています。歳のコも活躍しています。残業はありませんが、残業が発生したら残業代は出します。コミュニティからは引退しました。(ローン地獄ともいう)。可愛い娘と息子と幸せな日々を送っています。ゴリラは飼っていません。空ブロックと同じことをするには?さて、今回もアホくさい取り組みをしようと思います。定義することができます。インスタンスを返すコードです。ブロック単位で別物にすることができます。空ブロックの機構が備わっていないため、このような書き方はできません。何らかのブロックを作ってしまえば、代用することができます。いった、無意味なブロックを作ってしまえば良いわけです。ステートメントを利用するとはオツなものです。利用することはできません。そのような場合も考えると、以下のような実装が究極と言えそうです。いう下りで「ブロックであること」が、明示化できています。いう書き方でも構いません。今回のような実装は「ブロックを作らなくとも、別の変数名を定義すれば回避できる」でしょう。レベルの変数を使用することで得るメリットがあります。利点のひとつでしょう。他人の改変によって、勝手に触られてイライラすることが少なくなります。他のブロックから参照できないと同時に、他のブロックから「参照されていないことが一目でわかる」ことも大きな利点です。あることが一目でわかります。安易な変数名」が、使えることが最も有効な利点だと思います。普通、変数名には厳密な名前を付けるべきです。変数には、むしろ安易な名前をつけるべきだと考えています。他の変数名が際立たなくなる大した意味はないのに、意味があるかのように見えてしまうという副作用を生みます。厳密な名前を付けた時の副作用と同じですね。いった理由で、使い捨て変数を利用する時に「ブロック変数」を使いたくなることがあります。それでも、アホくさいとしか思えない方は「メソッドに切り出せばいいだろう」という考えをお持ちだと考えられます。何でもかんでもメソッドに切り出すと、返って可読性が悪くなることもあります。いうわけで、こういうアホくさい記事をたまには書かせてください。気にいって多用してます。局所限定(C#の無名Delegateに似た感じ)になりますね。んぬごめんなさい、コピペミスです。Hirotoshi.>なぜアホくさく見えるか、それはもちろん「ブロックを作らなくとも、別の変数名を定義すれば回避できる」からでしょう。んぬ使う場面は限られているわけで、人によってはアホくさいかと思っていたんですよね。トリッキーといえば、トリッキーだとも思いますし。Blockは目から鱗です。藤代千尋ブロックスコープの無い言語をずうっと使っている身からすると、「1つの変数をブロックごとに再初期化すればいい」と思ってしまいます。んぬ予想以上に共感者が多くてビックリしました。云々については反論を想定して、免罪符にしようかと思っていたのでした。出直しだ!役に立ったよ~、この記事。んぬそれ、アホくさいというか、ウソくさいです。Withの方が色がついていいかもしれませんね。(色までは考慮していませんでした)このあたりはお好みです。つね同じ事を考えている方がいて、ちょっとうれしい気分でございます。アクアあぁ、ゴメンなさい。理解度不足ですのでチョコッと質問です。この時のIfステートメントや、Withブロックには書かれているように、特に意味が無いで良いという認識でいいのですか?(と言うか、一読の限りでは意味が見出せない...>_<;中さんのコメントの>普通に使うしそんなものですか...orzそんな使い方は今までしなかったもので(経験不足もありますが)目から鱗と言うより違和感の方が強かったりします。違和感を感じるのは、私がC#とかVB以外の知識が無い事も理由としてあるのでしょう。アクアなんか私自身System.Collections.ArrayListクラスの使い方を間違って理解しているような気がしてきました。勉強しなおしてきます。(と言うか、一読の限りでは意味が見出せない...>_<;同名の変数が使えるという事実がわからないのでしょうか?そのあたりについても、しっかり解説されているかと思うのですが・・・。利点についても書いてありますし。こちらの記事で反対意見がないのでは、利点をうまく説明できているからだと思います。この説明がなければ、メソッドか別名の変数でという意見が出たのではないかと思っています。いうより、私がそう書いていたかもしれません。未記入ピンと来ないようであれば自分で試されると良いかと思います。上記のVBのコードを、無意味だと思われるステートメントを外して、コンパイルが通るようにしてみてください。すれば、同名の変数がなぜ使うことができるのかなどがわかると思います。その時の可読性(スコープの狭さによる)も実感できるのではないかと思います。それでも意味がわからなければ、大変失礼かと思いますが、VB.NETのマイグレーションが先でしょうね。ブロック範囲の変数の意味がわからないことになりますから。この記事の利点がわからない方は、変数宣言をプロシジャの先頭でまとめてやっているでしょうね・・・個人的には、そういう方は嫌ですね。COBOLERでVBに移行してきた時と同じような現象に見えてしまいますから。先頭宣言は最悪です言語や環境によってそうしなくちゃいけなかったりするわけですが。b.toC();}これでbの存在は隠蔽できます。デバッグも楽だし、スタックもすぐに開放されるし。アクア未記入さんありがとうございます。アドバイス頂いたとおり、まずは試してみる事にしようと思っています。同名の変数を使う事ができるのか?ではなくなぜ同名の変数を使う必要があるのか?という疑問です。いや、疑問ではなく違和感かな?←何か別の方法があるかも...みたいなそんな印象を覚えたもので...ブロック内で宣言されたprivateな変数のスコープの適用範囲がそのブロック内だけ...というのは理解しているつもりです。ここら辺りも検証の中で再度復習してみます。つねブロックを使わなかった場合、Private変数のスコープは最小でもSubとかFunctionとかになります。この場合、先頭で変数宣言するのは「あり」だと思います。問題は、では本当にそれだけの適用範囲が必要かということになります。途中で宣言した場合、使い始めは判りますが、使い終わりが判らないですし、ブロック化する事で、その変数が使われる範囲を局所化する事は非常に重要な事ではないでしょうか。その副産物として、ほんのちょっとだけ使う変数について、先頭で宣言して使いまわすのではなく、ブロックごとに同名だけれど別扱いで、それぞれ使うという方が、ちょこっとだけ使うという意味も含めて明示的であると思います。同名の変数を使う必要があるのか?という疑問です。そのメリットについては、後半に書かれているかと思いますよ。いや、疑問ではなく違和感かな?←何か別の方法があるかも...みたいなそんな印象を覚えたもので...その別の方法についても、後半に書かれているかと思いますよ。その方法を採用しない方が良い場合もあるということも書かれています。繰り返し読み直している中で、同名の変数をここのブロックで再帰的に宣言、使用する事でどの様な処理を連続的に行っているか、その可読性を高めるTipsという事なのかな?うーん。同名の捨て変数を使った方が良いのかを理解すれば、もっと核心につけるんじゃないでしょうか?ちなみに、私もこういう場合は厳密に名前をつけないで、itemとか使い捨てっぽい名前で実装していますよ。確かにVBには今まで存在しなかったものですから、実感できない人もいるかもしれないですね。あ、捨て変数をプロシジャ全体で使うのはダメです。VBやCOBOLERの人に多いのですが、workとかwkとか、意味不明な変数を使う場合はブロック変数にしてください。声を大にして言いたいですね。その前にworkとかじゃなくて、itemとかnodeにしなさいと言いたいですけど。入れ違いになってしまいました。ブロックごとに同名だけれど別扱いで、それぞれ使うという方が、ちょこっとだけ使うという意味も含めて明示的であると思います。(じゃんぬさんが書かれているように)同じ名前だからこそ同じように使っていることがわかりやすいです。そのブロックだけを見れば良く、他から干渉されないのは利点だと思いますね。それが明示化できることで可読性が良くなります。使う変数名を真剣に考えなくてもいいし;-pそうですね。それだけでなく、名前を真剣に考えてつけちゃうと、結局他の意味のある変数がみえにくくなることが多いです。今回のような使い捨て変数は、目立たないようにしておくのが吉でしょうね。なんだか、じゃんぬさんが書かれていることを繰り返しているだけのような気がしてきました。いうか、こういうことまで考えてプログラミングしている人が意外と多いことにビックリしました。アクアはつねさん、未記入さん、アドバイスありがとうございます。ご丁寧に解説を頂いたおかげで、おおよその事については納得できました。検証が完了しているわけでも無いので、じゃんぬさんのサンプルで示されているメリット、或いはそれに関わる事象について、私の検証をいずれどこかに晒しておきたいと思います。目に留まることがあれば、色々とご指導ください。>なんだか、じゃんぬさんが書かれていることを繰り返しているだけのような気がしてきました。私自身、プログラムコードの読解力よりも日本語の読解力の方が怪しいようです。使い方を間違って理解しているような気がしてきました。使い方については、普通の使い方をしていると思いますよ。本題じゃなかったりしますし。今回のサンプルで格納するのに使っているだけです。私自身、プログラムコードの読解力よりも日本語の読解力の方が怪しいようです。私の記事の書き方がまずいのだと思います。eternia>なんか私自身System.Collections.ArrayListクラスの使方?>を間違って理解しているような気がしてきました。なんのことだろうと思ってよく見てみたら。orzその前もいろいろと間違っていて、直したのですが、まだコピペ修正漏れがあったとは...アクアさん、ごめんなさい。いうか、記事を書く前にコンパイルくらいチェックすべきですね。フリーハンドでコードを組む時は、気をつけます。falseでもいいような気がします。あと、無名ブロックが作られても、ブロックの外側で既に使われている名前を使うとエラーになります。false最初に空ブロックかどうかがわかりづらいので、あんまりイケてないね。Blockの方が絶対いいね。Do~Loopより可読性がいいし、劣る点は何も見つからない。見て、R・田中一郎さんの投稿を思い出しました。ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28521&forum=7&start=16なつかしいスレッドですね。BLUEPIXY>あんまりイケてないね...劣る点は何も見つからない。使うというのは、もちろん優れているとかいう主張ではないです。ブロックとして使用可能ですが、さすがにこれはイケてないと思って書きませんでした。んぬこれまでの流れからして、要望は多いみたいですね。とりこびとコメントいただきましてありがとうございます。遅ればせながら御礼に参りました。>これまでの流れからして、要望は多いみたいですね。いったWishになるんでしょう♪ひそかに楽しみにしております。C#の{}空ブロックのように、直感的な感じがいいですね。はやめておくべきでしょう。行ムダになっています。何より、例外機構は非常に重要なもので、こういう使い方が混在していると非常に可読性を損ないます。いうことで、最も良くない選択だと思います。ものを選択すべきです。至る結論はここにあります。例を出した理由もここにあります。Debug.Print(.ToString)こういうコーディングをすること自体が想定外なので考えておりませんでした。代用すべきだと思って記事を書きました。通りすがりこの例ぐらいの処理なら別にブロックでもいいと思うんですが、基本的にはブロック分けするくらいなら別関数にすべきかとw実際の業務でこんなことやったらかなりの痛い子扱いですね。最近ですが大手の社内システムでこちらのサイトのサンプルコードのコピペそのものを発見して驚愕しました。Nothingは素晴らしい!VB6からアップグレードされた何百行もあるメソッドをリファクタリングして切り出すときには使えます。言うか、変数が使い回しされているメソッドを分割するのにはありがたいテクニックと思います。目からうろこ、なるほどでした。一過性VBでブロック分け探しててたどり着きました。可読性重視という視点は共感します。関数分けすりゃ良いんじゃね?という意見もありましたが、1箇所からしか呼ばれない小さな関数を作るのは、関数名考えて(それだけじゃ足りなくて)コメント付けて視線移動(とスクロール)させて...とコストが上がる割にメリット無しなので私は好みません。Nothingですかね。ExitでGotoするためのブロックだし、他の意味ありげで意味の無いコードは読み手が少々混乱するし。LabViewのスパゲティコード(見た目もスパゲティw)を整理する際に無効化ストラクチャで囲って色分けしたことを思い出しました。Withこれは確かに問題ですね。想定外のコードだからこそコンパイルが通ってしまうのは絶対にNGですよね。BlockもNGです。Nothingの方が余程まし。この記事はコンセプトは良いですが、結論が良くないですね。