最近開発で困っているちょっとした事1
タイトルの通りです。開発言語はいずれもVB.NET
●ヌル参照エラーが発生した場合、どの変数がヌルだったのか正確にわからない
デバッグ中に次のエラーが出たとします。
「NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません」
ソースコードのどの行でヌル参照エラーが起きたのかまではエラー情報からわかりますし、デバッグ実行中ならどの行で実行が止まったのか見ればすぐわかります。
しかし、その行で複数の変数が使用されていた場合、どの変数がヌルだったのが原因でエラーになったのかは例外情報を見てもわかりません。
何か確認する方法はあるのでしょうか・・・(それとも私が例外情報の見方を正しく理解していないだけで、本当は例外情報を読めばわかるのかなあ?)
●あるプログラムAが別のプログラムBを呼び出している場合のBのデバッグについて
プログラムA.exeはAの処理の内部で、プログラムB.exeを起動しています。
そのため、Aをデバッグ実行した場合は、Aのソースコードのどこかの行でブレークすることはできますが
Aから呼び出されたBのソースコードのどこかの行でブレークしたいと思っても
ブレークで止めることはできません。Bの処理はデバッグ実行とは無関係で、普通にBを起動したときと同じように動作しているのと同じだからです。
「じゃあ、AじゃなくてBをデバッグ実行で起動したらいいんじゃないか?」とおっしゃる方は当然いるでしょうが、自分が担当したプログラムではそれもできないのです。なぜなら、AはBを起動するときにコマンドライン引数で、とある変数を渡して起動しているからです。その変数を受け取ってからでないと Bは正しく動作しないので、B単独でデバッグ実行しても、適切な検証ができないのです。
何かうまい方法はないものか・・・
●Visual Studio でクラス図をもっともーっと実用的にしたい
筆者の使用環境:Visual Studio 2010
Visual Studioにはクラス図生成機能がありますが、これ、ぶっちゃけクラス図と呼ぶのもおこがましいしょぼい図しか生成できません。
一番足りないと思うのは、「クラスAはクラスBを参照しているという”関連”を線で図示する機能」です。
今開発してるプログラムで、前任者から引き継いだコードを読み解くのに苦労しています。
「どのクラスがどのクラスを使用しているのか、ソースコードからクラス図を一発で生成できたら便利なのになあ」
とよく思います。(まあ、すべてのクラス間の関連が線で引かれたらそれはそれで見づらい図になったりするんですが・・・)
しかし、Visual Studioのかゆい所に手が届かない部分を補強するアドインを見つけました!こちらのModelingPowerToysってやつです!↓
でも残念なことに・・・これでもまだ私の目的は満たされなかった・・・何がまずいかというと、このツールは・・・「クラスAはクラスBのリストをフィールドとして持つが、クラスAがクラスBのオブジェクトを直接持っているわけではない」場合には関連の線が引かれないようなのです!!
今私が解析したいプログラムは、あるクラスのフィールドが別クラスのリストであることが多いので、これでは役に立たない・・・がんばっていろいろ漁ったのに調べた時間が無駄になってしまった・・・
WHERE句とON句、どちらに条件を記述するかによってSQLの結果は変わるのか
WHERE句に条件を記述した場合と、ON句に条件を記述した場合とで
結果はどうなるのか気になったので実験しました。
まずはWHERE句を使用する場合を試しましょう。
上記のテーブルに対し、次のSQL文1を実行します。
<SQL文1>
SELECT
W.WORKER_NAME,
W.JOIN_DATE,
SECTION_NAME
FROM MST_WORKER AS W
JOIN MST_SECTION AS S
ON W.SECTION_CODE=S.SECTION_CODE
WHERE W.JOIN_DATE = '2015-04-01'
SQL文1の結果
次にON句を使用する場合です。
<SQL文2>
SELECT
W.WORKER_NAME,
W.JOIN_DATE,
SECTION_NAME
FROM MST_WORKER AS W
JOIN MST_SECTION AS S
ON W.SECTION_CODE=S.SECTION_CODE
AND W.JOIN_DATE = '2015-04-01'
SQL文2の結果
SQL文1の結果とまったく同じである事が分かります。
以前、私は<SQL文1>の書き方しか知らなかったのですが
<SQL文2>の書き方もできる事に気づいて「あれ?こんな書き方してもいいのかな?」と思い、
この実験を行ってみた次第です。
さて、SQL文1もSQL文2も表示される結果は同じという事は
条件を記述するのはWHERE句、ON句どちらでもよいのでしょうか?
実はそうではありません。
今までは内部結合の例でしたが、今度は外部結合で同じ事を試してみます。
下記のSQL文を実行してみましょう。
<SQL文3>
SELECT
W.WORKER_NAME,
W.JOIN_DATE,
SECTION_NAME
FROM MST_WORKER AS W
LEFT JOIN MST_SECTION AS S
ON W.SECTION_CODE=S.SECTION_CODE
AND W.JOIN_DATE = '2015-04-01'
SQL文3の結果
結果が変わりましたね!
左外部結合の場合はON句に指定された条件を全て満たす行が存在しない場合
左のテーブル(この場合はMST_WORKER)の行に対し、NULL行を結合するのでこういう動きになります。
(右外部結合の場合は逆に、右のテーブルの行に対してNULL行を結合します。)
結論として、外部結合の場合はON句とWHERE句、どちらに条件を書くかで結果が変わる事が分かりました。
じゃあ、内部結合の場合はON句に条件記述する<SQL文2>のやり方をしてもいいのか?という疑問がわいてきますが
それについては、また今度時間があれば考察してみたいと思います。
意見があればコメントください。
ついでに、WHERE句に書いた場合の動作も載せておきます。
<SQL文4>
SELECT
W.WORKER_NAME,
W.JOIN_DATE,
SECTION_NAME
FROM MST_WORKER AS W
LEFT JOIN MST_SECTION AS S
ON W.SECTION_CODE=S.SECTION_CODE
WHERE W.JOIN_DATE = '2015-04-01'
SQL文4の結果
SQL文1,2と同じ結果ですね。SECTION_CODEを結合キーとして
外部結合した後、WHERE句で絞り込みをかける為、SQL文3とは結果が変わります。