none
フォーム1についてサブが増えて整理するために分けたいのですが RRS feed

  • 質問

  •  

    はじめまして
    vb2008でプログラムを趣味程度にしているものです。

    質問についてですが
    ふたつのフォームでモジュールでパブリック変数としてプログラムを書いています。
    フォーム1についてサブが増えて整理するために
    大きなかたまりに分けたいと思います。

    ネットで調べてみると
    ひとつの変数を渡すような形にとかありますが
    大きなサブとして分けたいと思っていましたので
    あてはまりませんでした。

    用途からして、別モジュールや別クラスを追加するような方法かと思うのですが
    どうも模倣して使えそうなものが見当たりません。

    プログラムの方向性として望ましくないという結論ではなく
    実際の書き方が解ると助かります。
    よろしくお願いします。

     

    プログラムのイメージは以下の感じです。

       '===================
       Module Module1
     
          Public DBLA As Double
          Public DBLB As Double
     ・
     ・
     ・

          Public DBLZ As Double

       End Module
       '===================

       '===================
       Public Class Form1
          '================
          Private Sub 1A()
     ・
     ・
     ・

          End Sub
          '================
          Private Sub 1B()
     ・
     ・
     ・

          End Sub
          '================
     ・
     ・
     ・

          '================
          Private Sub 1Z()
     ・
     ・
     ・

          End Sub
          '================
       END Class
       '===================

       '===================
       Public Class Form2
          '================
          Private Sub 2A()
     ・
     ・
     ・

          End Sub
          '================
          Private Sub 2B()
     ・
     ・
     ・

          End Sub
          '================
     ・
     ・
     ・

          '================
          Private Sub 2Z()
     ・
     ・
     ・

          End Sub
          '================
       END Class
       '===================

     

     

     

     

    2009年6月4日 21:37

回答

  • パーシャルクラスは、こんな感じです。

    Public Class Form1

        Private Sub AtoZ()

            s1A()
            s1B()
            sCB()

        End Sub

        Private Sub s1A()

        End Sub

        Private Sub s1B()

        End Sub

    End Class


    Partial Class Form1

        Private Sub sCB()

        End Sub

    End Class

    ちなみに、
     Public DBLA As Double というモジュールの変数と、sub 1A などとの関係は、何かあるんでしょうか・・・
    これについての言及を忘れいる気がして・・・もしかすると、関係する質問だったりするのかな、なんて・・・
    つまり、単純なサブの整理や切り出しってことでは済まない可能性があるのかも・・・


    chonmage
    • 回答としてマーク たてちと 2009年6月6日 0:18
    2009年6月5日 4:32
  • クラスに切り出すこと自体のやりかたを知らなくて困っている状態です。
    モジュール2モジュール3とか、クラス1クラス2とかでも分けていければ追加してやってみたいです。

    もし、ご自分でクラスを作成されたことがまだ無ければ、例えば以下を読んでみて下さい。

    第9回 そろそろまじめにクラスに取り組んでみようか
    http://www.atmarkit.co.jp/fdotnet/vblab/vb2005m_09/vb2005m_09_01.html

    さて、技術的にはsubをクラスやモジュールに定義して、そのsubをフォームから呼び出して実行することは可能です。
    可能ですが、それが理にかなった設計であるかどうかとは別問題です。単にForm1のコードが長いから別のクラスを作ってそこに分割する設計は、オブジェクト指向からは外れていると思います。クラスはオブジェクトであって、単にサブルーチンの集合を管理するものではないからです。もちろん、サブルーチンを意味のあるグループにまとめられるのであれば、クラスに切りだすことは間違いではありません。
    例えば

    Public Class Form1
     private Sub A()   
          ・
          ・
     End Sub

     private Sub B()   
          ・
          ・
     End Sub

     private Sub C()   
          ・
          ・
     End Sub
    End Class

    となっており、Aが直線を引く、Bが丸を描くという処理であれば、AとBをDrawFigureクラスに定義した上で、次のように書けます。

    Public Class Form1
     Dim df As = New DrawFigure()
     df.A()
     df.B()

     private Sub C()   
          ・
          ・
     End Sub
    End Class

    上記では実際には引数などの問題もあり、いろいろなケースがあってなかなか簡単には説明できないのですが、まずは正しくクラスに切り出すことが重要なんです。そこから先が、そのクラス自体をどう設計すべきかということになります。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク たてちと 2009年6月6日 0:19
    2009年6月5日 6:59
    モデレータ

すべての返信

  • 外池と申します。

    Form1のSub 1Aから1Zのメソッド(Subのこと)がありますが、全部Privateで、Form1の中だけで使っているメソッドとお見受けします。ならば、これは、Form1の中に置いておいていいと思いますよ? 逆に、別の場所に分けるべきではないです。Form2についても同様です。

    しかし、もし、非常に似通ったメソッドがForm1とForm2の両方にあるような場合は、別の場所に分けることもアリかと思いますが、ケースバイケースですね。

    Form1とForm2がどんな役割りを果たしているものなのかもう少し詳しくご説明頂ければ、具体的な議論ができるかと思います。Form1が普段表示されているもので、Form2が一時的に用いられるものなのか・・・、どちらも常時表示されているけれども、操作するのはForm1で、Form2は表示だけとか。


    (ホームページを再開しました)
    2009年6月4日 22:22
  • おはようございます。
    外池さん。

    回答ありがとうございます。

    対象は複数あり、私もケースバイケースと思っています。
    実際に分けてみてよくなければ戻すとか
    自分なりの感覚で選択していくこととなるのではと考えます。

    ネットで調べても模倣して使えそうなものがなく困っています。
    プログラムの方向性として望ましくないという結論ではなく
    実際の書き方が解るととても助かります。
    すみません、よろしくお願いします。

    2009年6月4日 22:38
  • こんにちは。

    何が問題となっているのか?というポイントが今一つはっきりしないので、難しいところですが・・・

    文字通り、「増えたサブを整理して見やすくする」ということであれば、Partial クラスが使えるかもしれません。
    Partial Public Class Form1
      Inherits System.Windows.Forms.Form

     メソッドなど

    End Class

    部分クラスと部分メソッド (C# プログラミング ガイド)
    http://msdn.microsoft.com/ja-jp/library/wa80x488.aspx


    モジュールを追加して、各モジュールに自分なりの意味づけをして整理するという方法もあるでしょう。


    モジュールとフォームの挙動も踏まえて、構造的に問題があるために整理が必要だ、ということであれば、サブの関連性なども含めて構造を考え直さないとだめかもしれません。この場合は、外池さんもおっしゃっているように、サブやフォームの「意味」が情報として必要になるので、今の質問内容(情報)だけではアドバイスが難しいと思います。

    例えば、フォーム1・2ともに、ある基本的なフォームから継承して作ることができる、とか、(オブジェクト指向的な観点)
    サブが実は共通化できものがある、とか(構造化的な観点)
    オーバロードして簡単に整理できる、とか(構造化的な観点)
    サブを、専用のクラスに集約できる、とか(オブジェクト指向的、構造化的な観点)

    サブとフォームの「意味」「目的」などが必要となります。
    chonmage
    2009年6月5日 0:55
  • フォームの中にSubがたくさんあるのでなんとか整理したいということですよね。Subを束ねることもクラスの役割の一つですので、それらSubがクラスのメソッドとしてまとめられないか検討してみて下さい。
    考え方として、クラスを組み合わせてプログラムを作成することが基本です。クラスの中にSub(メソッド)があります。

    もし、クラスに切り出せないようですと、つまりForm1やForm2における本当に単なるサブルーチンであれば、chonmageさんも書かれていますが、パーシャルクラスとするのも有効だと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年6月5日 1:47
    モデレータ
  • chonmageさん、こんにちは。
    回答ありがとうございます。

    パーシャルについてはひとつのクラスとして分割するような記述を読んでいます。
    プログラミング ガイドについても改めて目を通しましたが
    模倣してそのまま利用できそうな例などは見当たりませんでした。

    すでに適当に書いたり消したりして動かないので
    こちらへ書き込ませていただきました。

    具体的な呼ぶところと呼ばれるところの書き方がわかると、ありがたいです。
    すみません、よろしくお願いします。
    2009年6月5日 4:05
  • trapemiyaさん、こんにちは。
    回答ありがとうございます。

    クラスに切り出すこと自体のやりかたを知らなくて困っている状態です。
    モジュール2モジュール3とか、クラス1クラス2とかでも分けていければ追加してやってみたいです。

    それができるような文章は見かけましたが
    このようなサブの延長のような使い方の例は探せませんでした。

    また、分けてみて予定どおりか確認しながら修正していければとも考えています。

    私自身、言葉の定義などはあやしいので
    実際の書き方があるととても助かります。
    すみません、よろしくお願いします。

    2009年6月5日 4:17
  • パーシャルクラスは、こんな感じです。

    Public Class Form1

        Private Sub AtoZ()

            s1A()
            s1B()
            sCB()

        End Sub

        Private Sub s1A()

        End Sub

        Private Sub s1B()

        End Sub

    End Class


    Partial Class Form1

        Private Sub sCB()

        End Sub

    End Class

    ちなみに、
     Public DBLA As Double というモジュールの変数と、sub 1A などとの関係は、何かあるんでしょうか・・・
    これについての言及を忘れいる気がして・・・もしかすると、関係する質問だったりするのかな、なんて・・・
    つまり、単純なサブの整理や切り出しってことでは済まない可能性があるのかも・・・


    chonmage
    • 回答としてマーク たてちと 2009年6月6日 0:18
    2009年6月5日 4:32
  • 文法的な悩みと設計的な悩みがごっちゃになっていますね。
    文法的な悩みはヘルプなんかで解決するとして、設計的な悩みはやはり

     「リファクタリング―プログラムの体質改善テクニック」
     http://www.amazon.co.jp/dp/4894712288/

    が外せないと思います。

    個人的にひっかかるのは chonmage さんも言及してますが、
    Module の Public な変数と Form の Private なメソッドを合わせて論じている部分です。
    メソッドの実装が分からないですが、そもそも Form に作るべきではないメソッドかもしれません。
    2009年6月5日 4:41
  • chonmageさん、こんにちは。
    再度ありがとうございます。

    パーシャルクラスについてですが
    ソリューションエクスプローラー内のForm1.vbやForm2.vbの内部のみで
    分ける感じになるということで正しいのでしょうか。
    (実際に内部のみの動作はできました)

    プロジェクトファイルにForm1.vb、Form2.vbと並列に独立してクラスを
    ということは違う方法になるのでしょうか?
    同じ一枚のコートエディタ上ではなく、別にする場合はどんななのでしょう。

    もしわかればこれも実際の書き方があるととても助かります。
    再度よろしくお願いします。

    (変数名やその他名称は説明のために適当につけただけですのでご心配には及びません。)


    2009年6月5日 5:52
  • totojoさん、こんにちは。
    回答ありがとうございます。

    文法的な知識のなさからの質問と考えていただいてOKです。
    実際、設計上の問題も多いとも思います。
    でも、常にプログラムを書いたり見たりしているわけでありませんので
    関連書籍やネットの検索でジャストミートしないとなるとお手上げ。
    これが私のプログラムを滞らせる最大の原因です。

    対策はフォーラム等でお伺いするしか具体的にありません。

    Public変数についてのご心配いただき申し訳ありません。
    処理の都合上、意図的に変数はPublicにしています。

    「リファクタリング―プログラムの体質改善テクニック」について
    評価が高いですね。
    お値段も高いのでユーズドの値段が下がると期待して
    とりあえずマークしておきたいと思います。
    javaがたまにキズですね。

    ありがとうございました。
    2009年6月5日 6:13
  • Public変数についてのご心配いただき申し訳ありません。
    処理の都合上、意図的に変数はPublicにしています。

    意図したいことを人に伝えるのは本当に難しいですね。精進します。
    Public 変数に対して心配しているわけではありません。言語仕様ですので、Public 変数自体に問題はありません。
    ただ、各 Form のメソッドの内容次第では、メソッドを Form に書くのではなくて、Module に移す方がふさわしいかもと思いまして。
    まぁ、各メソッドの実装が明らかにされていないので、大丈夫と言われればそれまでなんですけれども。

    どう見ても設計上の悩みに思えるのですが、文法上の悩みと言い切られたので パーシャル クラスの使い方に論点を絞ってみます。
    次の記事が具体的でこの上なく分かりやすいと思うのですがいかがでしょうか。

     10 行でズバリ !! パーシャル クラスの利用 (VB)
     http://msdn.microsoft.com/ja-jp/events/dd277920.aspx
    2009年6月5日 6:41
  • クラスに切り出すこと自体のやりかたを知らなくて困っている状態です。
    モジュール2モジュール3とか、クラス1クラス2とかでも分けていければ追加してやってみたいです。

    もし、ご自分でクラスを作成されたことがまだ無ければ、例えば以下を読んでみて下さい。

    第9回 そろそろまじめにクラスに取り組んでみようか
    http://www.atmarkit.co.jp/fdotnet/vblab/vb2005m_09/vb2005m_09_01.html

    さて、技術的にはsubをクラスやモジュールに定義して、そのsubをフォームから呼び出して実行することは可能です。
    可能ですが、それが理にかなった設計であるかどうかとは別問題です。単にForm1のコードが長いから別のクラスを作ってそこに分割する設計は、オブジェクト指向からは外れていると思います。クラスはオブジェクトであって、単にサブルーチンの集合を管理するものではないからです。もちろん、サブルーチンを意味のあるグループにまとめられるのであれば、クラスに切りだすことは間違いではありません。
    例えば

    Public Class Form1
     private Sub A()   
          ・
          ・
     End Sub

     private Sub B()   
          ・
          ・
     End Sub

     private Sub C()   
          ・
          ・
     End Sub
    End Class

    となっており、Aが直線を引く、Bが丸を描くという処理であれば、AとBをDrawFigureクラスに定義した上で、次のように書けます。

    Public Class Form1
     Dim df As = New DrawFigure()
     df.A()
     df.B()

     private Sub C()   
          ・
          ・
     End Sub
    End Class

    上記では実際には引数などの問題もあり、いろいろなケースがあってなかなか簡単には説明できないのですが、まずは正しくクラスに切り出すことが重要なんです。そこから先が、そのクラス自体をどう設計すべきかということになります。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク たてちと 2009年6月6日 0:19
    2009年6月5日 6:59
    モデレータ
  • totojoさん、おはようございます。
    回答ありがとうございます。

    「10 行でズバリ !! パーシャル クラスの利用 (VB)」を読んでいたら
    寝てしまいまして失礼しました。

    「メソッドを Form に書くのではなくて、Module に移す方がふさわしいかも」とのご指摘は
    そのとおりと思います。
    別クラス、別モジュールにとも考えていました。

    実際にパーシャル+Formでやってみるとおまけとして新しいFormが付いてくるので
    入出力のないClassモジュールを使うことにしました。
    標準のModuleはClassの特殊な形とかいう説明もどこで読んだ気がしますので。
    まあClassモジュールでいいかなと思いまして。
    (Moduleは変数宣言専用で現在は使用しています)

    標準のModuleとClassモジュールの使い分けで
    注意点などあればご指摘いただければ助かります。

    わかっていないところも多くお手数かけてすみませんでした。


    2009年6月5日 23:24
  • trapemiyaさん、おはようございます。
    回答ありがとうございます。

    書いていただいたサンプルで仮動作しました。
    ありがとうございました。

    どうクラスへ分けるかは今後の課題と思っています。
    やりたいこととやれることの折り合いをつけながら進めております。
    ですから、オブジェクト指向からは外れたり戻ったりしながら
    気長にやっていきたいと思っています。

    ありがとうございました。
    • 回答としてマーク たてちと 2009年6月6日 0:12
    • 回答としてマークされていない たてちと 2009年6月6日 0:12
    2009年6月6日 0:08