はじめに
ASP.NETで利用可能なオブジェクトとしてセッション、クッキー、クエリ文字列などがあります。これらのオブジェクトは、画面の表示内容を決定するための入力引数や、複数のリクエストにまたがった状態を記憶するためなどの用途で利用されます。ASP.NETではこれらのオブジェクトが簡単に利用できるようになっていて非常に便利ですが、いくつか不満な点もあります。
不満な点の一つ目は、セッションはObject型、クエリ文字列とクッキーはString型でデータのやり取りをする点です。例えばInt32型のデータをセッションから取得する際には型変換が必要になります。これらの型変換は値を取得するたびに発生するので、アプリケーション全体で見るとそれなりにコストがかかることが考えられます。
2つめは、キーを文字列で入力して値を引き出す場合、キーを打ち間違う可能性がある点です。例えば、
String itemCD = Session["ItemCD"].ToString();
という形で値を取得する場合などです。このコードには誤りがありますが皆さんお気づきでしょうか?
実はm
がm(全角)になっています。
このようにキーの打ち間違いというバグが混入する可能性もあります。本稿ではこの2つの点を改善するためのクラスを作成する方法を紹介します。
対象読者
- C#とASP.NETが分かる人
- より高品質な、再利用性・保守性・堅牢性に優れたコードを効率よく書きたい人
SValueクラス
まずは最終的なクラスのソースコードを示します。
namespace Higuchi.Web { public class SValue { public static Object Get(Int32 index) { return HttpContext.Current.Session[index]; } public static Object Get(String name) { return HttpContext.Current.Session[name]; } private SValue() { } public static Guid? CD { get { return Cast.ToGuid(SValue.Get(ID.CD)); } set { HttpContext.Current.Session[ID.CD] = value; } } public static Guid? DiaryCD { get { return Cast.ToGuid(SValue.Get(ID.DiaryCD)); } set { HttpContext.Current.Session[ID.DiaryCD] = value; } } public static Guid? FolderCD { get { return Cast.ToGuid(SValue.Get(ID.FolderCD)); } set { HttpContext.Current.Session[ID.FolderCD] = value; } } public static Int32? Count { get { return Cast.ToInt32(SValue.Get(ID.Count)); } set { HttpContext.Current.Session[ID.Count] = value; } } public class ID { public const String CD = "CD"; public const String DiaryCD = "DiaryCD"; public const String FolderCD = "FolderCD"; public const String Count = "Count"; } } }
SValue
クラスはセッションへのデータの出し入れを管理するクラスです。
名前は「SessionValue」とするのが素直な命名規則なのですが、SessionValueとするとインテリセンスで選択するときに手間がかかるので私は「SValue」という名前にしています。
同様にクエリ文字列は「QValue」、クッキーは「CValue」、フォームパラメータは「PValue」、ビューステートは「VValue」にしています。
それではSValueを例にクラスのポイントを解説していきます。