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

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

ただいまの
回答率

90.47%

  • .NET Framework

    480questions

    .NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

  • VB

    309questions

    VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

ジェネリック使うタイミング 具体的

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 929

ranran

score 122

お世話になります。

ジェネリックを積極的に使い保守性の高いコードを記述したいと思うのですが、
具体的な使うタイミングが思いつきません。

このようなときに使えばよい、このようにすればきれいにまとめられる等
ご意見ください。

クラス、メソッドに対するジェネリックの使うタイミングを教えていただけたらと思います。

よろしくお願いいたします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

私の場合は継承と組み合わせて使うケースが多いです。
具体的な例の方が分かりやすいと思い、サンプルコードを書いてみました。

こうしておくとファイル保存処理などを共通化できるので、保守性が高くなるかと思います。
さらに発展させると、型Tのプロパティを取得・列挙して、型に応じたCSV自動生成なども可能です。

ただ、エンティティを配列やDataTableなどで扱っているとこのパターンは適用できないですね…

何かのアイデアになれば幸いです。

'CSV変換ユーティリティクラス
Public MustInherit Class CsvBuilderBase(Of T)
    'CSVの保存
    Public Sub Save(items As IEnumerable(Of T), filePath As String)
        '文字列の作成
        Dim sb As New Text.StringBuilder
        '件数分ループ
        For Each i In items
            '1行の書き込み
            sb.AppendLine(Me.GetCsvString(i))
        Next

        '保存処理
        ---(省略)---
    End Sub

    'CSV1行の文字列を作成
    MustOverride Function GetCsvLine(item As T) As String
End Class

'Class1をCSV変換するクラス
Public Class Class1CsvBuilder
    Inherits CsvBuilderBase(Of Class1) 'CSVBuilderBaseを継承

    Public Overrides Function GetCsvLine(item As Class1) As String
        'CSV1行の文字列を作成
        Return String.Format("""{0}"",""{1}""", item.Code, item.Name)
    End Function

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/03/07 01:06

    なるほど!
    このように記述するのですね

    ジェネリックの便利さが伝わるコードでした

    どうせコーディングするのなら、綺麗にシンプルに分かりやすく書きたいです
    mochaさんのコードを参考に意識していきたいと思います

    答えにくいだろう質問にもかかわらず回答いただきありがとうございました!
    大変参考になりました♪

    キャンセル

0

MSDNの Visual Basic におけるジェネリック型 にも概略説明があります。ジェネリックに記述された1つのコードから、データ型毎の実体がコンパイラによって自動生成されるため、重複コードが減って保守性向上につながります。
 ジェネリック型はさまざまなデータ型に対して同じ機能を実行するために必要な処理を行う、1 つのプログラミング要素です。 ジェネリック クラスまたはジェネリック プロシージャを定義すると、同じ機能を実行させる各データ型に対して、その機能を別々に定義する必要がありません。 

通常のメソッド(プロシージャ)では、その引数の「値」をパラメータ化(=外部指定可能)することで、ちょっとづづ振る舞いが異なるメソッド群を用意せずとも、1つのメソッド実装コードの振る舞いを変更できます。

同様に、ジェネリック・メソッド(プロシージャ)では、その引数の「データ型」をパラメータ化することで、データ型だけが異なるメソッド群を用意せずとも、1つのジェネリック・メソッド実装コードの振る舞いを変更できます。

通常のクラスとジェネリック・クラスの関係も同様です。ジェネリック・クラスでは「データ型」をパラメータ化し、1つのジェネリック・クラス実装コードの振る舞いを変更できます。例えば、同一データ型の複数データを格納するコレクションクラスで利用されます。(扱うデータ型だけが異なるが、振る舞いは同じ。間違ったデータ型ではコンパイルエラーにしたい。)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/03/07 22:50

    重複を減らす補修性を上げる。
    すばらしいですね!

    近しいコードを記述しているなと感じた際はジェネリックを意識してみます
    回答ありがとうございました!

    キャンセル

関連した質問

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

  • .NET Framework

    480questions

    .NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

  • VB

    309questions

    VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。