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

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

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

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

Q&A

解決済

1回答

858閲覧

C#で、DBへのクエリ発行用メソッドはどう管理するべきでしょうか

grantsdale

総合スコア1

C#

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

0グッド

0クリップ

投稿2020/10/18 11:45

前提・実現したいこと

クエリ発行用メソッドを分かりやすく管理したいのですが、
どうやって管理するのが一般的または王道なのでしょうか。

発生している問題

現在、以下のようにフォームやクラスごとに、それぞれが使用するクエリをまとめたクラスを作っています。

class MyForm : Form { public void Method() { MyFormQueries.InsertSomething() } } //MyFormで使うクエリは全部MyFormQueriesクラスに記述 class MyFormQueries { public static void InsertSomething() { //クエリ発行 } } class MyClass { public void Method() { MyClassQueries.InsertSomething() } } //MyClassで使うクエリは全部MyClassQueriesクラスに記述 class MyClassQueries{ public static void InsertSomething() { //クエリ発行 } }

問題点

得られたメリットは、各フォーム・クラスから送るクエリを変えたい時に、該当のフォーム・クラス名を見ればすぐにクエリが見つかり、
そのクエリを変えても他のフォーム・クラスに影響を与えない点です。

デメリットは、色々なクラスに、全く同じや似たようなクエリメソッドが出来てしまいました。
また、テーブル設計変更があった場合、該当のテーブルにアクセスするクエリが分散しすぎて、把握出来なくなりそうな点です。

試したこと

テーブル単位で、そのテーブル宛に発行するクエリを集中管理するクラスを作り、そこにクエリを全部入れました。

class MyForm : Form { public void Method() { UserDataTableQueries.InsertSomething() } } class MyClass { public void Method() { UserDataTableQueries.SelectSomething() } } //UserDataテーブルのデータにアクセスするクエリは全部ここに登録 class UserDataTableQueries { public static void InsertSomething() { //クエリ発行 } public static IEnumerable SelectSomething() { //クエリ発行 } //大量のクエリメソッド }

問題点

得られたメリットは、テーブル設計変更しても、そのテーブルにアクセスするクエリ用メソッドを容易に探せることです。
※JOINするクエリの場合は少し気を使いますが・・・

デメリットは、1つのクラスに(事実上、多数のフォーム・クラス固有の)メソッドが集中しすぎて見辛くなり、
使うクエリと使わないクエリが分かり難くなりました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず「どう管理すべき」という問いに対して正解はありません。

あなたのプロダクトが最も保守しやすく、無駄を減らしてバグを発生させないように作れるのであれば、それが「あなたにとっての正解」でしょうけど。

そもそもプロダクトの特性によって最適な構造は変わってくるでしょう。
データの入出力の単位が画面と完全に1:1になるようなアプリケーションであれば、1画面ごとに1つのデータアクセスモジュールを作成するのは良い方法かもしれません。

ただ、複数の画面から同じリソースを参照・更新するようなアプリケーションの場合は、リソース単位でデータアクセスモジュールが別れている方が明らかに重複を減らせます。

また、データアクセスモジュールとテーブルを1:1にするかどうかも、正規化されたデータとアプリケーションが利用したいデータが1:1であればそれでいいでしょうけど、そうでない場合は無駄が多くなるでしょう。

その場合、データベース構造とは切り離してもう1段階抽象化したアプリケーションの扱うリソースの単位でデータアクセスモジュールを作成した方が良いでしょう。

繰り返しますが、こういったアプリケーションの構造設計は「これが正解」というのはないので、あなたが判断して最適な構造を設計してくださいという回答になります。

投稿2020/10/18 14:32

gentaro

総合スコア8949

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問