質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

Windows Formsで1つのpartial classの中のコードが長いときの対処法

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,534

wingard

score 51

Visual Studio 2019・C#でWindows FormsやASP.NETのツールを作っています。その時によく思うのですが、ボタンや処理が多くなってくると、1つのpartial classの中に

private void Button1_Click(object sender, EventArgs e)・・・・
private void Listbox1_SelectedIndexChanged(object sender, EventArgs e)・・・・


などのように、処理がどんどん増えていって、だんだんと視認性が悪くなっていきます。なので今までは別のファイルを作って、『public partial class Form1』などとして別ファイルにわけたりしているのですが、このやり方も良くないことは知っていて、腑に落ちる作り方ができていません。

皆さんはこのように1画面にボタンが多くてコードが長くなってきたとき、どのようにしているのでしょうか。今まで完全に我流で今までやってきたのと、複数人でプログラムを作ったことがないから何とかなっていたんだとは思いますが、よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

ちゃんとした作り方と言うのであれば、コードビハインドに何もかも書くのではなく、データバインディングを使って表示部分とビジネスロジックを分けてください。

そうすれば構造化が進み、見通しが良くなります。

参考: Windows Forms で MVVM

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/21 15:12 編集

    画面と内部の分離を考えるのであれば、 C# ではデータバインディングが最初の一歩です。これは一言で言えば「データと画面をイベントで結びつける技術」です。

    例えばテキストボックスに文字が入っているかどうかで背景の色を変えるのであれば、まず string 型の Text プロパティと Color 型の BackColor プロパティを持つオブジェクトを設計します。そのオブジェクトは、Text プロパティの値によって BackColor プロパティの値が変化します。

    次にこれの BackColor プロパティと TextBox の BackColor プロパティをバインド(連動するよう結びつけること)し、Text プロパティと TextBox の TextBox プロパティをバインドします。

    これにより、テキストボックスのテキストが変化すると、そのオブジェクトの Text プロパティも連動して変化し、それによって BackColor プロパティも変化します。それに連動してテキストボックスの BackColor プロパティも変化し、背景色が変わることになります。

    これによって「文字数で背景色を変える」というロジックをフォームから分離し、再利用性を高めます。

    分離はされましたが、フォームのデザイナーやソースを見ると、そのオブジェクトとテキストボックスがバインドされていることがわかるので、処理の流れを見失うことはありません。いや、むしろ「背景色を変える」という処理を全体の処理の流れから切り離すことにより、見通しを良くすることができます。

    キャンセル

  • 2019/05/21 15:17

    文字の長さと背景色の処理だけでこのようにクラスを設計するのは大げさかもしれませんが、この技術は様々に応用がきくので、ぜひ積極的に取り入れてください。

    「データバインディング」というキーワードです。

    キャンセル

  • 2019/05/21 15:23

    ただし WPF のデータバインディングと Windows フォームのデータバインディングは全く様子が違うので、それらを混同しないよう、検索の際は気をつけてください。

    キャンセル

+1

ボタンごとにイベントハンドラを作ってるのでそれで数が増える、というのであれば、
ボタンのクリックイベントを全部一つのメソッドにしてしまって、引数のSenderによってどのボタンかを判断してそれで処理を分ける、ってことをすればいいです
同様に、ラベルやTextBoxなんかにもこのテが使えます

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/21 14:46

    いや、GUI画面に関わることはFormに残して、他の処理、例えばファイルから読み込むとかデータベースを操作とかの実際の処理を他に切り出します
    他の処理から、GUIに表示する、とか色を変える、とかはプロパティやメソッドにしてしまい、
    画面に関わることとその他を切り分けて実装するってことで、まあ、他の回答者さんと言ってることは一緒ですが

    キャンセル

  • 2019/05/21 14:53

    理解できていないのかもしれませんが、やってみます。ありがとうございました。

    キャンセル

  • 2019/05/21 14:57

    まあ、とにかくいろいろやってあがいてみることです。
    そのうちに、自分のスタイルというものが出来上がってくると思いますよ

    キャンセル

+1

部品化や構造化などしっかり設計すればいいのでしょうが

手っ取り早くというのであれば

#region ある処理
#endregion


で折りたためるようにするとか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/21 14:08

    折りたたむこともできたんですね……。確かにこれが一番手っ取り早いかもしれません。どうせ見るのは自分だけですし。

    キャンセル

+1

こんにちは。

「巨大クラス=悪」ではないと思いますよ。肥大化したクラスはよろしくないですが、必要最小限のクラスが巨大になった場合、「必要最小限」が妥当ならそれは妥当です。GUIクラスの場合、フレームワーク上の制約があるのでなかなかクラス分割も困難ですから。
partialクラスを使ってファイル分割して視認性を保つのも良い工夫と思います。

GUIを司るクラスがあまりに大きくなるようなら、MVCの考え方を導入するのもありと思います。これは機能分割のための1指標ですので。(デザイナーがいないプロジェクトにMVCを適用するのはどうかとも思いますが、MVCは結構メジャーですのでGUIクラスの分割指標として使ってみるのも手と思います。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/21 14:15

    ご回答ありがとうございます。MVCというのも初めて聞きましたが、ざっと読んでみました。MVCでわけてみることも考えてみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る