• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:3層構造アーキテクチャ)

3層構造アーキテクチャのクラス分類について

このQ&Aのポイント
  • 3層構造アーキテクチャにおいて、クライアントからAPサーバを介してSQLを発行する方式では、SQLを発行しているクラスはファンクション層に含まれますか?それともデータベース層に含まれますか?
  • また、クライアントからSQLを発行する方式では、SQLを発行しているクラスはデータベース層に含まれるか?ファンクション層に含まれるか?
  • 画面からローカルのcsvファイルを読み込む際、データを保持しておくクラスや、そのメンバーのgetter/setterを実行するクラスはデータベース層に含まれるか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Glory_777
  • ベストアンサー率50% (105/208)
回答No.1

質問者さんの言っている方式は、.NETアーキテクチャに近い思想でしょうか。 機能から、どこの階層であるかを判別するのこと自体が間違っています。 階層とは、簡単に言えば、どこの業界の責任であるかを問うための区分けです。 問題が起きた時、アプリケーション作成者が責任を取るという場合は、 よりローカルな表現である、ブロック、インタフェースと呼ぶのが良いでしょう。 またインタフェース群を取りまとめ、自分たちでメンテナンスしやすく設計する 場合は、設計上で名称以外にもIDをふり、独自のブロック化が必要になります。 この時の用語は、そのチーム内でしか通用しないもとなるでしょう。 なので、この機能は何のブロックに該当するのか、それは自明のはずです。 ソフトウェアの業界では、動作や機能に着目しますが、 大変狭義な分類学であり、 それより大きな分類学に当てはめることはできません。 システム全体の中では、常に、アプリケーション層であり、 ローカルな仕事をする、”その他大勢の人”と言うニュアンスで階層自体が扱われます。 例えば、 クライアントと言うのはクライアント・サーバ方式をさす、システムを分類する ための用語であり、ソフトウェアとは関係ない別の業界の用語です。 また、 通信だけに特化する場合は、ノードと呼ぶのが正しく、 この世界では、コンピュータもルータも同じものとして扱います。 ソフトウェアは、 こうした別の業界のユーザーであり、実際に”それ”を作った人ではありません。 そうした意味で、インタフェースと呼ぶが正しいでしょう。 また、そのインタフェースを提供しているミドルウェア製品や言語を使用した場合、 それらのユーザーであるプログラマは、 独自のファンクションを作っただけですから、全てがファンクションとなります。 ここからは言外に含むニュアンスです。 三層を定義しているジャンルは、それぞれのデファクトメーカーが違い、 言語や思想も異なるため、連携しやすいように、定義したものであり、 製品を作る他の業界やユーザであるプログラマを識別し、 連携できるようにしたものです。 コンピュータですから、やろうと思えば、質問者さんのいうように (1)~(3)のどの様な配置も実装も可能です。 しかし、問題が起きた時、通例の使用方法として違うとなれば、 これらのバグ情報は、他の業界で製品を作っているメーカーにとっては、 責任外と成ります。 これが嫌で、層が定義された場合、慣例としての使用の仕方を調査し、 それ以外の使用方法を行わないようにするのが常識とされています。 しかし、単なる分類学と勝手に誤解している人が多くあり、 勝手にプログラム上での機能を配置することは良くあります。 これをさせない管理体制を開発体制と言います。 どこのブロックからどのインタフェースを使用すべきかを検討できると、 上位工程に習熟しているとされます。 これは、問題が起きた時どこのメーカに話すことになり、 解決が早いか? と言う内容で選択されますので、 技術とは全く関係ない次元になります。 多くのプログラマが上位工程に進めない理由は、 技術的な観点でインタフェースが選択されていると誤解しているからです。 三層構造を採用すると、フリーを基本とした製品群が多くなり、 多様な専門技術者をバックヤードに抱えることになります。 ただし、技術者の数は多いです。メーカも多いですね。 それが故に、体制と言うのが大事になり、担当わけをすることになります。 このときは、コーダーと言う概念があり、この人はフローチャートや 関数仕様の様なものにしたがって、プログラム構造や使用する関数を指定 された上でコーディングします。 関数名や、ライン数も含めて指定されますので、誰が書いても同じです。 インタフェースにSQLを使用するか、どこで発行するかは、 外部設計や内部設計に関わりますが、実際のところは恒久メンテナンス、 顧客事情、セキュリティなど、あらゆる考慮が必要となり、 本来は要件定義やそれ以前の段階でSEとPMが判断します。 しかし、細かい設計上でのインタフェース指定や配置を設定するとコストが あがりますし、さきほど言ったようにトリッキーすぎると、メーカーが保障 しませんから、 「何々と言ったら、普通はこうする」 と言う一般概念を作ります。 けっして、キーワードからデータをアクセするのでデータアクセス層では ありません。またSQLを使うからとか、この関数を使うからではないです。 これでは連想ゲームです。 一般通念としての工法をさすので、逸脱した時は、 何物でもないとするのが正しいでしょう。 三層構造と言ったら、トリッキーなことをしないで、なるべく製品を買って 作るやり方と言うニュアンスです。 より、固い人達が使うという印象です。加えて先進的でない。 UNIX系のシステム管理者出身が好みます。 MVCと言ったら、開発環境の構築が面倒だけど、 顧客受けがよい見栄えや、少しくらい複雑な処理ができる安価なシステムを 場合のニュアンスです。 システム系の処理が地味であり、昨今の華やかなITとかけ離れているため、 ギャップを埋めたいと言う、古い業界の中での革新派と言う印象。 それ以外は、顧客ごとにシステム名が定義され、 中身が前述の三層構造であったり、MVCであったり、レガシーであったり、 問わず複合であると言う(大規模な)ニュアンスです。 なのでプログラマが勝手に関数発行場所やインタフェースを考えられる システム開発は存在しません。 概念としては自由に名前をつけてもいいのですが、 現実的にはそうした仕事が無いので、趣味としての範囲を超えません。 こうしたものをフレームワークと呼び、独自に作って、使ってもらって良いと しています。しかし、誰も使わないと思いますよ。 保守的な人が支配的です。 層と言う表現は、業界全体や学術ジャンルを指し、 「私たち、彼ら、それ以外の人」と言うときに使うニュアンスでしょう。 ちなみに、あまりにも強大な組織になると、多数の業界に進出しており、 垂直型に一社で全てをまかなえるようになります。 この場合は、業界として連携する必要が無く、独自に階層を定義できます。 Webアーキテクチャでは、三層構造とマイクロソフト構造の二種類に分類され、 マイクロソフトは一社で全ての階層をオールインワンで提供し、 クライアントやサーバ、データベースや言語と言う概念を消し去ろうとして います。ですので、彼らのアーキテクチャでは三層から派生した用語は使えません。 更に、さきほどの開発体制も、複数の業界が階層を無し、仕事やノウハウを分担して 連携を想定する(つまり多数のメーカーが責任を押し付けあう)ものを意識して 作り上げる体制ですから、一般的なIT業界の体制はマイクロソフトのアーキテクチャ を使用する場合は必要ありません。 よくご存知の.Netです。 .Netでは設計や思想のようなものを排除し、プログラマが全てを自由に、個人で出来る ようにする目的が強く、これらをサポートするための技術を集めているようです。 当然ながらSI業界との対立関係にあり、SI業界ではLinux文化の普及により、 抵抗しています。 コードをかけないおっさんは食べていけなくなるじゃないですか・・・。 つまり、”層”には、「慣例にあわせ、独自性をだしてはいけない」と言う思想を持つ場合 に使うと良いとおもいます。 発想の自由による、技術の良さを取りたい場合は、少なくても「.Net的ではあるが」 と前置きすると良いと思いますよ。 つまり、本来自由である社会の中で、仕事を済み分けるためにある言葉が多く、 そこからアカデミックな内容を想像すると、合理性がたもてず、 疑問に思うことが多いはずです。 ITやコンピュータの業界は、学術世界のように精錬されておらず、 デファクト(強い奴が)が正しい。 こうした力関係で言葉が使われているので、 これらの派閥と生い立ち、現状での勢い等を良く考えないと、正しくなくなるわけです。 としたばあい、無理に何かの概念にあわせず、 ローカルな設計書やブロック名、インタフェースのみを語るのが健全。 苦労して覚えた技術用語が単なる政治用語であるというのが多く、 IM●が、仕事をとれたようなので、いまはその概念用語は使わないことになった。 と言うこともあります。 覚えても覚えても、知識が増えないのが、IT用語でしょう。 以上、ご参考になれば

TeferiMage
質問者

お礼

ありがとうございます。 自分の見えていない世界・視点が見えるようになったと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ActionとActionFormの記述

    strutsを使用してデータベース接続を行っています。 ActionFormにはgetter、setterのみを記述、 Actionにはデータベース接続の確立、SQL文の取得、などを記述、 ActionFormにはgetter、setter、データベース接続の確立などを記述、 ActionにはfindForwardのみを記述、 現在、上記2通りの記述方法を使用しています。 そこで疑問なのですが、このまま2通りの記述方法を 使用するか、一つにするかを考えています。 特に、使用感に問題も無いのですが少々気になりました。 好みの問題等もあるのでしょうか。 よろしくお願い致します

    • ベストアンサー
    • Java
  • JAVAのスレッドセーフとは

    スレッドセーフについて質問です。 インスタンス変数はヒープ領域に保持されるのでスレッドセーフではないという説明は分かりました。 しかし、そうするとDTOのようにgetterとsetterを持ってるクラスはインスタンス変数ばかりなので、スレッドセーフではないということになるのでしょうか? スレッドセーフなDTOを作りたいときは、どのようにすれば良いのでしょうか?

  • データベース(テーブル情報)操作方法に関して

    まだJAVAを初めて1ヶ月ちょいの初心者です。ぜひ教えて頂きたいことがあります。 データベースのテーブル操作に関してなんですが、どうコーディングしたら効率のよいプログラムになるのか検討段階でつまずいています。 今考えているのが、スーパークラスにてテーブルの各カラム変数を宣言し、そのサブクラスにてテーブル操作毎のSQL発行(スーパークラスから継承した抽象メソッドを用いて)をしたほうがいいのかなと考えてます。 つまり・・・ ----<<super class(抽象クラス)>>----- public abstract class InfoTable { private String name; private int age; : public String getName() { return Staff_ID; } public String setName(String name){ this.name = name } //抽象クラス(SQLを発行しテーブルを操 //作する抽象メソッド) public abstract boolean exec(); } とし、サブクラスにて継承&実装すればよいのかと・・・。 実際にテーブルのカラムが多くなれば、setter・getterを多く繰り替えし処理をしなければならなくなり、それは大変だし、プログラム的にもよくないんじゃないかと考えています。実際にサブクラスはサーブレットからデータを取得してから処理を行う予定なので、Vectorを使えばいいのかなとは思いますが、どう使ったらよいのか検討がつきません。 長々と書いてしまい申し訳ございません。 どなたか良い知恵をお貸し下さい!

    • ベストアンサー
    • Java
  • javascriptのコードについて

    以下のコードなのですが、 エンクロージャー関数の ローカル変数hogeをさらに、エンクロージャー内部で定義された 関数ででクロージャーとして保持させたいメソッドのコードですが var Method = function (){ var hoge = "初期値"; var getter = function (){ return hoge; } var setter = function (param){ hoge = param; return hoge; } return {"set" : setter,"get" : getter} } var obj = Method(); console.log(obj); console.log(obj . get()); obj.set("初期値変更"); console.log(obj.get()); obj . set("更に変更"); console.log(obj.get()); この場合、メソッドの返り値として、一般的な文献に乗っている関数(関数オブジェクト)を返すのではなく オブジェクトリテラルとして返しています。 この場合でも、動きとしてはクロージャーの動きをしているのでhogeという変数の保持はできているっぽいんですが クロージャーって関数内で定義された関数であれば、どういう返り値の返し方でも クロージャーになるのですかね? また、この方法は、一般的にjsで関数コンストラクタ呼び出しをしてインスタンスを作る際privateメンバを実現する方法として紹介されていますが、 これはクロージャーとして生成するたんびに内部の変数を保持するためメモリ食い虫になるらしいのですが まず間違いなく、このクラス(便宜上そう呼びます)のインスタンスはひとつしかつくることはない!!という仕様だとしても いけないのでしょうか? というかもう現状javascripのバッドノウハウ的なものになっているのでしょうか?

  • データベースの内容をCSVへ出力。

    VB2005環境、DBはOracle10gです。 データベースから取得したテーブルの内容を、CSVとして 出力する機能をサービスアプリに付け足したいと考えています。 データベースから値を取得する方法についていろいろと調べては みたのですが、VB2005環境では、Windowsアプリケーションとして 作成する方法しか見つからず(コントロールを配置する際に デザイナを使う方法)、クラスライブラリに機能としてSQL発行から CSVとしてデータを出力するまでの処理をどうしたらいいのか わからず困っています。 基本的なところから勉強できるサイトがありましたらご教授 願えないでしょうか? よろしくお願いします。

  • C#での開発環境について教えてください。

    初めて質問します。 最近、まったくの未経験からプログラマとして働き始めました。 それにあたり、今回、開発に携わることになりましたが、 アプリケーションの環境?構成?が APサーバー、WEBサーバー、DB、クライアントというものを使用して 開発するということですが、まだ、よく意味が分かりません。 とりあえず、イメージとしては、 クライアントからWebサーバーを使用して、APサーバーを呼び出して、 APサーバーからSQL文(DBに登録されているSTPの実行命令みたいな)をDBに投げる。 DBからの結果を逆のルートでクライアントへ返す。 といった解釈です。 色々調べてみたのですが、WebサーバーとApサーバーを分けるメリットと、 違いがよく分かりません。 どなたか、初心者にもわかるように教えていただきたいと思っております。 ちなみに使用しているのは VisualStudio 2008とSQLServer2005です。 つたない説明ですが、よろしくお願いいたします。

  • 「BEGIN」などの使い方について

    データベースで「BEGIN」、「CREATE_FUNCTION」おかあると思いますが何ができるのでしょうか? SQLファイルとかに記述するような感じですか? 例えば上記のものを使ってシステム日付を取得してSQLを発行して得たデータのファイル名に日付を持たすなんていうこともできますでしょうか?

  • CSVファイルを読み込んで計算するには、構造体か?

    はじめまして。C++プログラミングの質問です。 初心者レベルの質問で申し訳ないのですが、お付き合いください。 CSVファイルを読み込んで、書かれている値を使ってある計算を行う、 ということをしたいのですが、処理方法をどうするか悩んでいます。 CSVファイルに書かれる最大行86400行、最大列6000列です。 また、開発環境はLinuxとなります。 私は「CSVファイルの項目を構造体に格納するクラス」と、「構造体の値を使って計算 するクラス」を考えました。 しかし、構造体ですと最大86400行のものを格納するのは、メモリを食うだけで無駄だという 指摘を受けました。 直接ファイルから値をとってきて、計算クラスに処理させるほうが無難と言われましたが、 「CSVファイルの項目を構造体に格納するクラス=データベース」と考えており、 後々拡張する場合に融通が利くのではないでしょうか。 経験が浅いので、断固たる主張ができないのですが・・・ 構造体に入れることばかり考えていたので、開発のボリュームを抑え、かつ、メモリを食わない 方法を全く思いつきません。 有識者の方へアドバイスを受けたいのですが、 ・大量のデータを読み込む場合、構造体等に格納する方が後ほど助かるか、 それとも、直接ファイル読み込みした方がよいか ・構造体格納のほかに相応しいやり方はないか この2点をメインにお答えいただけないでしょうか。 何か良いやりかたがありましたら教えていただきたいです。 よろしくお願い致します。

  • 二、三層アーキテクチャー(構造技術)

    .情報の勉強超初心者です。 クライアントサーバーシステムの分散処理の形態の 二層、三層の説明を読んだのですがいまいちぴんときません。・ 実際の開発現場でも これは2層、これは3層というふうに この用語を用いているのでしょうか。 2. どちらがどういう場合に使われるのか どちらが主流なのでしょうか。教科書をよむと三層ほうが開発生産性や保守、運用面で三層がすぐれているので 三層のほうを採用するほうがよいように思えるのですが 3.二層の説明をよむと 処理能力面、保守面に問題多く 二層をとりいれる意味がないように思えるのですが 具体的にわかりやすくご説明いただきますと幸いです。 現場を経験していないので実態どうなっているかぜひ知りたいです。

  • ソリューションエクスプローラの用途と使い方

    当方のスキルはACCESSからSQLに移行しようと学習中のレベルです。 Management Studioのソリューションエクスプローラについて教えて下さい。 新しく作ったクエリーを保存するようなときに使うんだと思いますが、 いまいち用途と使い方が解りません。 私の環境はサーバーはサーバールームにあり、クライアントから SQL Server Management Studioを起動して開発しています。 開発するクライアントも二拠点あります。 現状、保存先がクライアントのローカルホルダーになっています、 これをサーバーの共有ホルダーにしてもいいのでしょうか? データベースごとに保存先を別にして作るものなのでしょうか? ここで保存したクエリーをテーブル値関数などにすることは できるのでしょうか?