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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

Q&A

解決済

1回答

784閲覧

DataAccessObjectとテーブル操作について

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

0グッド

2クリップ

投稿2018/10/04 08:09

編集2018/10/04 08:09

こんにちは。質問させていただきます。

前提

趣味と練習を兼ねてXamarinとC#でデータの保存/読出しを中心としたアプリを作成しており、今はDataAccessObject(DAO)まわりを作成しているところです。基本的なCRUDについてのインターフェースおよび実装は用意できました。

実現したいこと

CRUDについてはできたので、テーブル操作に関するメソッドを用意したいです。CRUD同様にDAOのインターフェースに用意していいものか、別に分けるべきか悩んでおり、またいずれにしてもどのように用意すればよいでしょうか、というのが質問です。関連する記事などを教えていただくだけるだけでもありがたいです。

試したこと(考えてみたこと)

始め考えたのは、アクセス先がDBだけれあればCRUDのメソッドと一緒にCreateTable、DeleteTableなどを用意すればいいかと思いました。しかし一部データについては、フォルダをテーブル、ファイルをレコードと見なして管理することを考えています。そこで、テーブル操作を抽象化した名前を考えるか(サンプルコード※1)、ファイルによる管理をテーブル操作とみなしてしまうか(サンプルコード※2)と考えましたが、どこかしっくりきません。そこで、DAOのインターフェースではないどこかに用意すべきか…?とも考え、悩んでいる状況です。

サンプルコード:

C#

1namespace MyApp.Services 2{ 3 // UserMetadataモデルのDAOのインタフェースです 4 public interface IUserMetadataDao 5 { 6 void CreateTable(); // (※1) 7 void CreateStore(); // (※2) 8 void Insert(UserMetadata item); // C 9 void Update(UserMetadata item); // U 10 void Delete(string id); // D 11 UserMetadata FindById(string id); // R 12 IEnumerable<UserMetadata> FindAll(); // R 13 } 14}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

今回はフォルダ・ファイル操作とデータベース操作を抽象化します。
そのため「フォルダをテーブル、ファイルをレコードと見なして管理すること」は従来のフォルダ・ファイル操作と共通する操作ではないので派生クラスの役割になります。

「作成する」という操作は共通の概念なので基底クラスにはCreateメソッドを宣言します。

C#

1public interface IUserMetadataDao 2{ 3 void Create(); 4 void Insert(UserObject userObject); 5 void Update(UserObject userObject); 6 void Delete(string id); 7 UserObject FindById(string id); 8 IEnumerable<UserObject> FindAll(); 9}

Data Access Object

投稿2018/10/08 00:15

kaneko.m

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/08 03:36 編集

回答いただきありがとうございます。待ちの間、いったん同様に実装していたのですが特に問題はなさそうでした。 ただ、コメントを書いている中で、どのDAOの解説も今回のようなその他の操作について言及していない点について気になり、今一度考え直してみました。 当時、テストやモックについても考えていたこともありその中で、ロジック(ビジネスロジック)は保存先の操作にも関心があると感じていました。しかし今、ロジックはデータアクセスに興味がある一方で その保存先については興味がないことが大半で、むしろロジックに意識させないべきじゃないかなという思いも抱き始めました(DAOと切り離すべきかも?)。 今の所感ですが、DAOのインタフェース(基底クラス)に保存先の操作を用意しても特に問題はない。しかし、実際にそれらを利用するロジックは、アプリ起動時のチェックロジック(?)のようなものに限られ、データアクセスではないこともありDAOとは切り離すべき ....かな?という感じです。 どうでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問