tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル構造体でスマートに記述する方法
記事No10069
投稿日: 2010/04/22(Thu) 15:21
投稿者ひろこ
VB2005

お世話になっております。

下記の様にSQLのSelect,Update,Insert,Deleteのクラスを作ってみました。

SQL文は商品_SQL,価格_SQL,在庫_SQLとありSQL文の引数はそれぞれ違います。

md_Select,md_Update,md_Insert,md_DeleteのCase部分はすべて同じ記述をしています。
これを構造体や配列等を何か駆使してスマートに書く方法はないでしょうか。
いい方法があれば根本的に記述を変えてもOKです。

よろしくお願いします。


Public Class SqlLibrary

Dim gGamencd as Integer
Public Sub New(Byval gamencd as Integer)
    gGamencd = gamencd
End Sub

'===Select================================================================
Public Function md_Select(Optional Byval h0 as String = "", _
                          Optional Byval h1 as String = "")

    Dim getstr as String = ""

    Select Case gGamencd
        Case 1   : Dim s as New 商品_SQL      : getstr = s.md_Select(h0)
        Case 2   : Dim s as New 価格_SQL      : getstr = s.md_Select()
        Case 3   : Dim s as New 在庫_SQL      : getstr = s.md_Select(h0, h1)
      
    End Select

    md_Select = getstr

End Function

'===Update=================================================================
Public Sub md_Update(Byval fps_sh as Object, _
                     Byval col as Integer, Byval row as Integer)

    Select Case gGamencd
        Case 1    : Dim s as New 商品_SQL     : s.md_Update(fps_sh, row)
        Case 2    : Dim s as New 価格_SQL     : s.md_Update(fps_sh, row)
        Case 3    : Dim s as New 在庫_SQL     : s.md_Update(fps_sh, row)
        
        Case Else

    End Select

End Sub

'===Insert==============================================================
Public Sub md_Insert(Byval fps_sh as Object, _
                     Byval col as Integer, Byval row as Integer)

    Select Case gGamencd
        Case 1    : Dim s as New 商品_SQL     : s.md_Insert(fps_sh, row)
        Case 2    : Dim s as New 価格_SQL     : s.md_Insert(fps_sh, row)
        Case 3    : Dim s as New 在庫_SQL     :
        
    End Select

End Sub

'===Delete==============================================================
Public Sub md_Delete(Optional Byval cd0 as String  = "", _
                     Optional Byval cd1 as String  = "")

    Select Case gGamencd
        Case 1    : Dim s as New 商品_SQL     : s.md_Delete(cd0, cd1)
        Case 2    : Dim s as New 価格_SQL     : s.md_Delete(cd0)
        Case 3    : Dim s as New 在庫_SQL     : s.md_Delete()
      
    End Select

End Sub


End Function

[ツリー表示へ]
タイトルRe: 構造体でスマートに記述する方法
記事No10070
投稿日: 2010/04/22(Thu) 17:27
投稿者魔界の仮面弁士
> のクラスを作ってみました。
gGamencd が 1〜3 というマジックナンバーになっている点が気になりますが、
その事は横に置いといて…。


> SQL文の引数はそれぞれ違います。
商品_SQL / 価格_SQL / 在庫_SQL に共通のインターフェイスを持たせるとか。


Public Interface IHoge
  Sub md_Delete(ParamArray args() As String)
  Sub md_Update(fps_sh As Object, Col cs Integer, row As Integer)
    :
    :
End Interface

Public Class SqlLibrary
 Private g処理 As IHoge
 Public Sub New(gamencd as Integer)
  '初期化手順に差がある場合や分岐数が多い場合は、Factory にした方が良いかも。
  Select Case gGamencd
   Case 1 : g処理 = New 商品_SQL()
   Case 2 : g処理 = New 価格_SQL()
   Case 3 : g処理 = New 在庫_SQL()
   Case Else : Throw New ArgumentException()
  End Select
 End Sub
 Public Sub md_Delete(Optional cd0 As String = "", Optional cd1 As String  = "")
  g処理.md_Delete(cd0, cd1)
 End Sub
 Public Sub md_Update(fps_sh As Object, col As Integer, row As Integer)
  g処理.md_Update(fps_sh, col, row)
 End Sub
   :
   :
End Class


下記の 第19回 の記事が参考になるかも。
http://www.atmarkit.co.jp/fdotnet/vb6tonet/index/index.html

[ツリー表示へ]
タイトルRe^2: 構造体でスマートに記述する方法
記事No10071
投稿日: 2010/04/23(Fri) 09:35
投稿者ひろこ
魔界の仮面弁士 さま

> 商品_SQL / 価格_SQL / 在庫_SQL に共通のインターフェイスを持たせるとか。

いつもありがとうございます。

うまくいきました。

魔界の仮面弁士は天才ですね。

[ツリー表示へ]
タイトルRe^3: 構造体でスマートに記述する方法
記事No10072
投稿日: 2010/04/23(Fri) 09:37
投稿者ひろこ
魔界の仮面弁士 さま

> 魔界の仮面弁士は天才ですね。

よびすてにしてしまいました。
魔界の仮面弁士さまでした。
失礼いたしました。

[ツリー表示へ]
タイトルRe^3: 構造体でスマートに記述する方法
記事No10073
投稿日: 2010/04/23(Fri) 12:03
投稿者ひろこ
うまくいってませんでした・・・

>   Case 1 : g処理 = New 商品_SQL()

この行で

型 '商品_SQL' のオブジェクトを型 'IHoge' にキャストできません。

と出てしまいます。


>Public Interface IHoge
>  Sub md_Delete(ParamArray args() As String)
>  Sub md_Update(fps_sh As Object, Col cs Integer, row As Integer)
>End Interface

商品_SQLの引数とIHogeの引数は同じことは確認しました。
Case 1 : g処理 = CType(New 商品_SQL(),IHoge)
としてもダメでした。


よろしくお願いします。

[ツリー表示へ]
タイトルRe^4: 構造体でスマートに記述する方法
記事No10074
投稿日: 2010/04/25(Sun) 08:56
投稿者魔界の仮面弁士
>>> うまくいきました。
…うまくいったのですよね?

> 型 '商品_SQL' のオブジェクトを型 'IHoge' にキャストできません。
> と出てしまいます。
商品_SQL クラスに、IHoge インターフェイスを Implements しておいてください。

[ツリー表示へ]
タイトルRe^5: 構造体でスマートに記述する方法
記事No10089
投稿日: 2010/04/28(Wed) 18:38
投稿者ひろこ
> > 型 '商品_SQL' のオブジェクトを型 'IHoge' にキャストできません。
> > と出てしまいます。
> 商品_SQL クラスに、IHoge インターフェイスを Implements しておいてください。

お返事遅くなりました。
今度は本当にうまくいきました。
ありがとうございました。

[ツリー表示へ]