新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。もう新人じゃないかも…

学習記録:.NET、参加記録:CODE FESTIVAL 2014予選A

[学習記録] .NET

第3章:データアクセス技術

.NET Frameworkのデータアクセス技術
  • ADO.NET
    • .NET Frameworkのデータアクセステクノロジで中核を担う
    • OLE DBやODBCSQL ServerXMLなどのデータソースに一貫性を持ったアクセス機能を提供
    • .NET初期から導入され、最も低レベルのAPIになる
  • ADO.NET Entity Framework
    • ADO.NETの上位似存在
    • .NET Framework 3.5 SPIで追加されたデータアクセス技術
    • リレーショナルスキーマではなく、概念モデルに対してプログラミングを行う
    • アプリケーションに必要なコード量と保守作業の量を減らす
  • LINQ
    • .NET Framework 3.5 で追加
    • あらゆる情報リソースに対して一貫したプログラミングモデルでデータアクセスを実現できる言語技術
3階層のアプリケーションアーキテクチャ
階層 役割
プレゼンテーション層 アプリケーションのUIを実装
ビジネス層 ビジネス機能を実装、ドメイン層とも言う
データ層 データベースやその他の外部システムへのアクセスを実装

ビジネス層の設計は他の2つの層の実装に大きく影響

  • PoEAAにおけるビジネス層のロジックの構築3パターン
パターン名 内容
トランザクションスクリプト 機能に従った一連の手続き(プロシージャ)で構築。プレゼンテーション層からの要求に対して手続きを呼び出しデータ層を介してDBを呼び出す
テーブルモジュール リレーショナルDBのテーブルの形でステートを実装し、振る舞いとしてビジネスロジックをパッケージングする
ドメインモデル オブジェクト指向で使用できる継承やポリモーフィズムなどを利用した表現を用いてモデルに落とし込みビジネス要件を実装する
  • .NET Frameworkに実装されるデータアクセス技術は、この3つのパターンに対応
ADO.NET 接続型
  • .NET Frameworkデータプロバイダを直接参照
    • Connectionオブジェクトを使用してDBとの接続を開き、CommandオブジェクトによりDBコマンドにアクセス
    • データの取得はDataReaderオブジェクトをフェッチ
  • 欠点
    • データへのリクエストが大量の場合など、パフォーマンスやサーバリソースの消費といった問題が発生
    • ビジネスロジックが複雑になるにつれて、設計や保守が困難に
ADO.NET 非接続型
  • 上記の接続型の問題を解決するために用意
    • 直接DBへの接続を開かず、DataSetと呼ばれるインメモリオブジェクト内にデータをバッファリングするときのみ接続を開く
    • データの充填が終わると接続を閉じる
    • DataSet中にはDataaTableクラスが存在し、リレーショナルスキーマと似た形でクラスの宣言が行われている
    • DataSetは単なるオブジェクトというよりインメモリデータベースの実装と言える
  • 長所と欠点
    • サーバへの接続を閉じた状態でデータ操作を行えるため、サーバリソースを効率的に運用可能
    • 実際に使用するデータはDataSetなので、データソースの多様化に対応可能
    • 多層階層のアプリケーションではDTOとして利用できる
    • 逆に、更新処理は少し面倒
  • テーブルモジュールパターン
    • レンタカー予約システムで考える。会員テーブル・レンタカーテーブル・予約テーブルが定義されているとする
    • 各テーブルに対応するDataTableクラスと、各クラスに密接に関連したビジネスロジックが存在
    • 会員クラス:会員チェック、予約クラス:予約実行など
    • ビジネスロジックはテーブルの形を意識した実装を考えることになる
    • テーブルもしくはビューなどをオブジェクトとして実装し、そのオブジェクトに振る舞いをパッケージングする
ドメインモデルの考慮
  • レンタカー予約について、会員が通常会員とゴールド会員に分かれている場合を考える
    • ゴールド会員のみ適用される特典や機能がある場合、DataSetによるビジネス層での状態管理は不都合
    • 各オブジェクトについて通常会員とゴールド会員が混在するため
    • こうしたケースでは、ビジネス層でDB状態を保持するクラスには、必ずしもテーブルの形と1対1にならない
  • この場合、会員クラスを親として通常会員とゴールド会員クラスを継承して作るのが自然
    • PoEAAにおけるドメインモデルパターンを意識して設計されているのが、ADO.NET Entity Framework
ADO.NET Entity Framework
  • 概念モデル(Entity Data Model、EDM)
    • リレーショナルモデルのER(エンティティ関係)から独立してモデル化を可能
    • 開発者はEDMで定義されたエンティティに対して開発を進める
  • EDMの3つの層
    • 概念:CSDL(Conceptual Schema Definition Language)
    • 論理:SSDL(Store ...)
    • 上記の2つを結びつける:MSL(Mapping...)
  • 先ほどのレンタカーの例で言うと、
    • CSDLで会員クラスを実装し、派生クラスとして通常会員とゴールド会員を実装
    • 通常会員とゴールド会員はSSDLで定義された会員テーブルにマッピングされる
  • 利点と欠点
    • 継承の他にも、多対多の関連や1つのEntityを複数テーブルにマッピング(またはその逆)など、多彩な表現が可能
    • 開発者は実際に扱うのはEDMに実装されたエンティティとなり、LINQを使用することで生産性や保守性を向上
    • 中間層にEDMが介在するテーブルアクセスになるため、純粋なパフォーマンスでは従来のADO.NETに劣る可能性
LINQ
  • .NET Frameworkの言語環境において使用できる言語に統合されたデータクエリ技術
    • 従来はデータソースが異なれば書かなければならないコードや使用する技術は大きく異なっていた
    • LINQでは統一された手法と言語で複数のデータソースを同じように扱うことが可能

[参加記録] CODE FESTIVAL 2014予選A

コンテストページ


Welcome to CODE FESTIVAL 2014 予選A - CODE FESTIVAL 2014 予選A | AtCoder

結果

  • A, B, C問題:100点、D問題:30点の計330点
    • D問題で100点が取れなかったのが残念。
    • D問題:K種類の数字しか打てない電卓で、整数Aに最も近い数字を入力したときのAとの差を求める
  • とりあえず全探索
    • 整数Aの一番上の桁から、0〜9を入れていってその中で一番近い数字との差
    • さすがに時間が掛かりすぎたので、その桁の数字と+-1の数字で調べる
    • 整数Aが10000でKが1の場合、9999が最も近い数字になるようなケースも考慮
  • 上の方法では時間が足りず
    • 解説を見ると、下の方の桁については(その数字が使えなければ)同じ数字になるらしい
    • Aが12XXXでKが2の場合、Aに最も近くなる数字は12111か12222になる
    • 上の方の桁から数を埋めていき、後は使える数字の中で最小か最大を指向するしかないため