お世話になります。
まだ経験も浅く若輩者ですが、精一杯知恵を絞り綺麗にコードをまとめました
これはだめだ、この書き方は見にくい、こうしたほうがもっといい等ありましたらご意見ください
コメント、変数名のつけ方、拡張性等も指摘いただければと思います。
(なおxmlコメント、エラーメッセージ、ログ等は省きました)
また私ならこう記述する等ありましたら合わせて教えてください。
補足 start
Linqを使えばらくだよ! との指摘がありました。 まったく持ってその通りです(^^;
記述したコードが悪かったのですが、データテーブルから取り出すうんぬんはこの際かまわないのです。
そちらよりも私のコーディングの構築の仕方のだめだしをしてください。
私が一から構築し考えたコードです、悪い癖、直したほうがいい書き方等あるかと存じます。
Linq等がなく、レコード単位でforでまわさないといけないと想定していただければと思います。
図々しく、分をわきまえぬ質問だと重々承知しておりますが、ご指南いただければ幸いです。
補足 end
作成物はデータテーブルより条件の各行を取得するクラスです
テーブル内容は以下のような状態とします
id name age place work group
1 tsuchiya 23 北海道 IT 2
2 tanaka 30 沖縄 美容師 2
3 satou 50 宮城 飲食店 300
4 simamura 32 愛知 訪問販売 300
5 matuda 34 青森 新聞配達 10
6 kimura 43 岡山 広告 10
取り出し条件は3種類
・全ての行
・年齢が指定数未満
・グループが指定桁未満
またチェック項目の情報は定数としてクラス内に持っているものとします
・年齢のカラム名
・年齢の上限
・グループのカラム名
・グループの桁数上限
''''''''' 以下コード ''''''''''
lang
1''''''''''''''''''''''''''''interface 開始'''''''''''''''''''''''''''''''''''''' 2 3Public Interface IGetDataBase 4 5 'フィルターを通したテーブル取得 6 Function GetDataTable() As DataTable 7 8 '行単位の処理 9 Function GetRows() As IEnumerable(Of DataRow) 10 11 '条件の確認 12 Function NoProblemRow(ByVal row As DataRow) As Boolean 13 14End Interface 15 16''''''''''''''''''''''''' Base クラス開始''''''''''''''''''''''''''''''''''''''''' 17 18Public Class GetDataBase : Implements IGetDataBase 19 20#Region "変数" 21 22 'テーブル 23 Public ReadOnly Property Table() As DataTable 24 Get 25 Return _Table 26 End Get 27 End Property 28 Private _Table As DataTable 29 30#End Region 31 32#Region "コンストラクタ" 33 34Sub New(ByVal table As DataTable) 35 Me._Table = table 36End Sub 37 38#End Region 39 40#Region "公開メソッド" 41 42#Region "フィルター通したテーブル取得" 43 44Public Function GetDataTable() As DataTable Implements IGetDataBase.GetDataTable 45 Dim ret As DataTable = Me.Table.Clone '戻り値 46 47 Try 48 49 '行の取得 50 For Each row As DataRow In GetRows() 51 ret.ImportRow(row) 52 Next 53 54 Return ret 55 Catch 56 Throw 57 End Try 58 59End Function 60 61#End Region 62 63#Region "行単位の処理" 64 65 Protected Iterator Function GetRows() As IEnumerable(Of DataRow) Implements IGetDataBase.GetRows 66 67 For Each row As DataRow In Me.Table.Rows 68 '各行に対しフィルターを実行 69 70 If NoProblemRow(row) = True Then 71 'フィルターを通った列を戻り値にセット 72 Yield row 73 End If 74 Next 75 End Function 76 77#End Region 78 79#Region "条件を満たしている行か判定" 80 81 Protected Overridable Function NoProblemRow(ByVal row As DataRow) As Boolean Implements IGetDataBase.NoProblemRow 82 Return False 83 End Function 84 85#End Region 86 87#End Region 88 89End Class 90 91 92'''''''''''''''''''''''''''''本体 クラス開始''''''''''''''''''''''''''''''''''''' 93 94 95Public Class GetData 96 Inherits GetDataBase 97 98#Region "定数" 99 100 'フィルター種類 101 Enum Filter 102 ALL = 0 '全データ対象 103 AGE_OVER_CHEAK '年齢未満がデータ対象 104 GROUP_LNG_CHEAK 'グループ桁数未満がデータ対象 105 End Enum 106 107 'チェック項目 108 Structure Cheak 109 110 '年齢 111 Const AGE As Integer = 30 112 Const AGE_COL_NAME As String = "age" 113 114 'グループ 115 Const GROUP_LNG As Integer = 2 116 Const GROUP_COL_NAME As String = "group" 117 118 End Structure 119 120#End Region 121 122#Region "変数" 123 124 '取得テーブル種類 125 Public ReadOnly Property TableFilter As Filter 126 Get 127 Return _TableFilter 128 End Get 129 End Property 130 Private _TableFilter As Filter 131 132#End Region 133 134#Region "コンストラクタ" 135 136 Sub New(ByVal Table As DataTable, Optional ByVal filter As Filter = GetData.Filter.ALL) 137 'テーブル格納 138 MyBase.New(Table) 139 'フィルターを格納 140 Me._TableFilter = filter 141 End Sub 142 143#End Region 144 145#Region "公開メソッド" 146 147 '行のチェック 148 Protected Overrides Function NoProblemRow(ByVal row As DataRow) As Boolean 149 Dim ret As Boolean = False '戻り値 150 151 Select Case Me.TableFilter 152 153 Case Filter.ALL 154 '全ての行が問題ない 155 ret = True 156 Case Filter.AGE_OVER_CHEAK 157 '条件を満たした年齢は問題ない 158 Dim tmpAge As String = row(Cheak.AGE_COL_NAME) 159 ret = IIf(IsAgeOver(tmpAge), False, True) 160 Case Filter.GROUP_LNG_CHEAK 161 '条件を満たしたグループ桁数の行は問題ない 162 Dim tmpGroup As String = row(Cheak.GROUP_COL_NAME) 163 ret = IIf(IsGroupOverLng(tmpGroup), False, True) 164 End Select 165 166 Return ret 167 End Function 168 169#End Region 170 171#Region "内部メソッド" 172 173 '年齢チェック 174 Private Function IsAgeOver(ByVal mAge As String) As Boolean 175 Dim ret As Boolean = False 176 177 '以上の場合T 178 If Convert.ToInt32(mAge) >= Cheak.AGE Then ret = True 179 180 Return ret 181 End Function 182 183 'グループの桁チェック 184 Private Function IsGroupOverLng(ByVal mGroupNum As String) 185 Dim ret As Boolean = False 186 187 '以上の場合T 188 If Convert.ToInt32(mGroupNum).ToString.Length >= Cheak.GROUP_LNG Then ret = True 189 190 Return ret 191 End Function 192 193#End Region 194 195 196 197End Class 198 199 200
回答2件
あなたの回答
tips
プレビュー