初めに
VB.netでの新規開発の後、OracleFormsでマイグレーションとかをやってたのですが、
レガシーシステムのコードは触るだけでストレスが溜まってしまうので、「せめてこうしろよ」という感じの内容を書きます
1.イベントハンドラに処理を書くな!
イベントハンドラでは処理を書くのではなく、単にメソッドのコールだけを記載するようにしましょう。
イベントハンドラに処理を書いてしまうと、処理が長くなった時に「放置する(可読性が下がる)」か「複数のイベントハンドラに分割する(実行順序が保証されない)」が発生します。
もちろん、AddHandlerなどを使って制御することはできますが、無駄なコードを書かないようなルールにする方が建設的です。
同じイベントで複数のメソッドを書いてはいけない(どちらから処理が実行されるかという保証がない)
Private Sub Hogehoge(sender As Object, e As EventArgs) Handles Button1.Click
処理1
End Sub
Private Sub Hogehoge2(sender As Object, e As EventArgs) Handles Button1.Click
処理2
End Sub
一つのイベントにダラダラと処理を書いてはいけない。(可読性が低下する)
Private Sub Hogehoge(sender As Object, e As EventArgs) Handles Button1.Click
長い処理
End Sub
イベントハンドラにはメソッドの呼び出しのみ記述する
Private Sub hogeHoge(sender As Object, e As EventArgs) Handles Button1.Click
clickProcedure1(0)
clickProcedure2(0)
End Sub
Private Sub clickProcedure1(ByVal hoge As Integer)
処理1
End Sub
Private Sub clickProcedure2(ByVal fuga As Integer)
処理2
End Sub
2.コントロールへの参照は渡さない
これは賛否両論かもしれませんが、私としてはコレをオススメします。
VBで言えば、「Formインスタンスが直接持つメソッド以外はそのフォームの持つコントロールの参照を持てない」とすべきです。
もし、他のFormインスタンスのコントロールを見たい場合、そのコントロールをもつFormのメソッドを経由するようにすべきです。
これは、カプセル化からの要請でもあります。
3.コントローラーを用意する。
MVCモデルでいう所のコントローラーを用意します。
こんな感じです
Private Sub hogeHoge(sender As Object, e As EventArgs) Handles Button1.Click
clickProcedure1(0) 'イベントハンドラではメソッドのコールだけ行います
End Sub
Private Sub clickProcedure1(ByVal hoge As Integer)
Dim Arg As Boolean
Arg = Controler() '処理を行う上で必要な情報をコントローラーを経由して取得します
clickProcedureNext(Arg) 'コントローラーから取得した情報を元に処理を実行します
End Sub
Private Function Controler() As Boolean
Return Button1.Enabled 'コントローラーは、情報を集めて返します
End Function
Private Sub clickProcedureNext(ByVal Arg1 As Boolean)
適当な処理 '実際の処理を行います
End Sub
このようにすることで、「コントロールへの参照を持つレイヤ」を限定することが出来ます。
これは、2の内容とも共通していることです。
OracleFormsなんかだと、コントロールの名称を文字列として渡すだけでゴチャゴチャっと触れてしまうので、オブジェクト指向脳としては切れそうになるのを何とかこらえている状態です
おわり
以上、リハビリがてら書いた記事なので、内容は薄いです。