Windows Formアプリケーションでのロジック部とユーザーインターフェース部の分離について


おはようございます。

表題の件について皆様はどのようにされていますでしょうか？

Windows FormアプリケーションをVisualStudio2010で作成しています。  
GUIでインターフェースが作成できるのは便利ですがフォームをクリックしたりするとフォームのコード（例：Form1.vb）にイベントハンドラーが自動生成されてしまいます。

自分のような初心者にはありがたい機能なのですが度が過ぎるとフォームのコードが多くなりすぎて可読性が低下する原因になると思います。

このような時、皆様はどのような対応をされておられるのでしょうか？

自分の場合はフォーム（Form1.vb）に対して対になるロジッククラス（Form1_logic.vb）を作成し、ロジッククラスのコンストラクタとしてフォームそのものを引き渡し、フォームに対する操作の処理はロジッククラスに書くようにしています。

こうすれば元のフォームにはロジッククラスのメソッドに対する呼び出しだけですみますがこのやり方で何か不都合が発生しますでしょうか？

他にスマートな実装方法などございましたら紹介いただけますでしょうか。

よろしくお願いします。




現状では

[code]

    Class Form1
    
        Sub New
            logic = New Form1_Logic(me)
        End Sub
    
        Sub Button1_Click()
            logic.OnButton1Click()
        End Sub
    
    End Class
    
[/code]

というイメージであるということですよね？これは一般的な設計ポリシーの評価では

  * Form1とForm1_logicが相互に依存している
  * Form1_logicで扱うデータがForm1そのもので抽象化がされていない

という2点で難があるかと思います。

上記はもちろんクラス分割を改善するのがベストですが、この手の設計方針には多分に個人の趣味が含まれるので反対にForm1をまったく分割せずに可読性を上げるテクニックをいくつか紹介します。

# Regionディレクティブ

[code]

    #Region "リージョンの名前"
    
    
    #End Region
    
[/code]

のような記述を追加することでコードの一部を折りたたむことができ、これでメソッドを分類すればコードが把握しやすくなります。

# パーシャルクラス

Form1.hoge.vbのようなファイルを追加し、

[code]

    Partial Class Form1
    End Class
    
[/code]

と`Partial`修飾子を指定すればこのファイルはForm1.vbおよびForm1.Designer.vbと併せて1つのクラスとなり、関連している処理を別ファイルにまとめることができます。

* * *

※これらは設計を変更しない小手先の手法ですので、本質的にはデータバインドなどを含めた設計の改善が重要です。




現状では

[code]

    Class Form1
    
        Sub New
            logic = New Form1_Logic(me)
        End Sub
    
        Sub Button1_Click()
            logic.OnButton1Click()
        End Sub
    
    End Class
    
[/code]

というイメージであるということですよね？これは一般的な設計ポリシーの評価では

  * Form1とForm1_logicが相互に依存している
  * Form1_logicで扱うデータがForm1そのもので抽象化がされていない

という2点で難があるかと思います。

上記はもちろんクラス分割を改善するのがベストですが、この手の設計方針には多分に個人の趣味が含まれるので反対にForm1をまったく分割せずに可読性を上げるテクニックをいくつか紹介します。

# Regionディレクティブ

[code]

    #Region "リージョンの名前"
    
    
    #End Region
    
[/code]

のような記述を追加することでコードの一部を折りたたむことができ、これでメソッドを分類すればコードが把握しやすくなります。

# パーシャルクラス

Form1.hoge.vbのようなファイルを追加し、

[code]

    Partial Class Form1
    End Class
    
[/code]

と`Partial`修飾子を指定すればこのファイルはForm1.vbおよびForm1.Designer.vbと併せて1つのクラスとなり、関連している処理を別ファイルにまとめることができます。

* * *

※これらは設計を変更しない小手先の手法ですので、本質的にはデータバインドなどを含めた設計の改善が重要です。

