- - PR -
VB.NETとオブジェクト指向
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-09-16 10:59
どもです。がるです。
むぅ申し訳ない。特に「批判されている」って感じてるわけでは ないです(苦笑 批判云々を書いたのは、稀に「学校でOOやってそれだけ」って タイプの方がそういう話をするので(実体験あり)軽いジャブ的に 書いてただけです(苦笑
ふむり。確かに、いわゆる「OOのメッセージのやり取り」という観点に 根ざした状態で、あの二つのクラス間には「関連がない」です。 ただ、ちょっと冷静に設計を考えてみたのですが。 支店と社員の間には元々「メッセージをやり取りするという意味合いにおける」 関連ってあんまりないんじゃないかなぁと思うのですがどうでしょうか? 例えば、ケースとして「A支店の全員の**ステータスをインクリメントする」 とかいう業務要求があれば、コードとして当然
とかいうメソッドが存在し、恐らくは内部において
とかいう処理が走るんでしょうが…これをもって「メッセージをやり取りしてる」 とか「関連がある」とか言われると、OO的には確かに違和感だろうなぁと 思うです(笑 そういう意味では「「支店マスタ」「社員マスタ」の間にリレーションシップが張られている」 こと自体が「リレーションのためにやむをえない実装として」なのかなぁ、と。
なるほど。おっしゃってる内容は納得です。 ただまぁ、そういった溝を「上から塗りつぶせる」のもまた、実装的OOの 便利な特徴なのかなぁと(笑 …お気楽に考えすぎかなぁ? < おいら | ||||||||||||||||||||
|
投稿日時: 2005-09-16 14:20
そう、結局データベースを更新しなければならないし、更新すればそれで良いわけですからわざわざ一旦メモリ上にオブジェクトを作らなくても、 "SQL文をポ〜ンと実行" すれば良いと考えてしまうわけですよね。 >そこに、商品クラスというのはどんな『振る舞い』があるでしょうか? 商品というのが商品仕様(商品の種類)でなく、実際のモノだとすれば、 get格納してある倉庫() とか 小分け() なんてのがあるかもしれませんが、特になくても問題ありません。 分析された業務の問題領域が表現できていることが重要なのです。 そうなっていればどこで何をしているかが分かりやすくなり、変更などにも強いプログラムができるのではないでしょうか。 それはコンピュータから見れば非効率なことは間違いありません。コンピュータから離れ、人間に近い位置でプログラムを作るということですからね。 データベースは業務の問題領域をアプリケーションとして働かせるための一補助部品以上のものではありません。 ・・・・・という理想
アレですよ、ほんとに。 VB.NETって、コードを書く時にC#よりも知識や神経を使うんですけど。 フォームクラス.Show()って・・・・ MicrosoftはVB.NETユーザーに恨みでもあるのかな。わざわざオブジェクト指向的な考えを得る機会を失わせるような作りをして。 | ||||||||||||||||||||
|
投稿日時: 2005-09-16 15:56
勉強不足@いげ太です。
そうかっ!こういう事を言ってたのか!! 非常によくまとめられた記事をおぎわらさんの Blog で発見したので貼っておきます。 .NETでDBを扱う場合の考え方 | ||||||||||||||||||||
|
投稿日時: 2005-09-16 16:59
いげ太様、たしかにこの記事は分かりやすくまとめられていますね。 この「TechEDフォローアップセミナー」とかいうセミナーの分類によると 1.トランザクション スクリプト 2.ドメイン モデル 3.テーブル モジュール 私が今まで設計/開発してきたアプローチ方法(このスレでも書き込んでますが)は 「3.テーブル モジュール 」のパターンに当てはまりますね。 | ||||||||||||||||||||
|
投稿日時: 2005-09-16 22:01
こんにちわ。
お勧め書籍。 マーチン・ファウラー 著「エンタープライズ アプリケーションアーキテクチャパターン」 #もうスレッド中に紹介されたかな とりあえず、ドメインモデルから入ってしまう…。 | ||||||||||||||||||||
|
投稿日時: 2005-09-16 23:09
ん〜、、、それ以外、無いです(苦笑) 私は、Nxx-BASCI, Z80, FORTRAN, COBOL, ANSI C, Borland C++, VBA, VB6, C++.NET, VB.NET, C# とさわってきたのですが(研修だけ、実験的使用含む)、VBA, VB.NET は、使いにくいです。 # ANSI C は、MS-C と区別するため # Borland C++ は、Visual C++ と区別するため 何が使いにくいって、やはり、Nxx-BASIC と同じようにできるところです。 プログラミング初心者にとって、「何でもあり」的なところは入りやすい部分ではありますが、システム開発の業務では、あまり使いたくありません。バグを作り込む要素が多すぎます。 一郎さん: > アレですよ、ほんとに。 > VB.NETって、コードを書く時にC#よりも知識や神経を使うんですけど。 わはは。 だから、開発者が VB を使うのが、間違っていると思います。 適材適所、っていうじゃないですか。 「適所」を考えたときに、objectさんのおっしゃることも、クリアされるかと。VB.NET は、オブジェクト指向を完全にサポートする(準拠する、かな?)ことを目標とはしていない。それは、「オブジェクト指向」を知らない人、開発が業務というわけではない人、初めてプログラミングにふれる人、趣味でプログラミングを始めてみようという人、etc...言語というものを知らなくても、プログラムしている感じが味わえればいい人たち(すみません、ちっと言いすぎです)が、販売対象として存在していると考えると、"無理して"オブジェクト指向に沿った言語仕様にする必要はない、と思います。 # C#3.0 の、ローカル変数の宣言が型を指定しなくてよくなる、というのが、気になる [ メッセージ編集済み 編集者: Jitta 編集日時 2005-09-16 23:10 ] | ||||||||||||||||||||
|
投稿日時: 2005-09-17 01:55
なぜ主従が勝手に決まるのでしょう? お客さんがしたいのは"在庫管理"でしょう。テーブルを作りたいわけでも、クラスが使いたいわけでもないのだから、クラスが主、テーブルが従とは言えません。 クラス(オブジェクト)は、実際のモノを表現しているので「主(根源)」だと考えるかもしれませんが、テーブルというのも業務で使われる帳簿やリストに似ていて扱いやすく十分に「主(原本)」と言えます。たとえば出荷指示なんてものは倉庫で現物見てやるわけじゃなく、倉庫とは別の部屋で受注票と在庫表を見ながら出荷伝票書いて在庫表を減じたりするわけです。この在庫表を減じるという操作がテーブルを更新することと直感的に結び付く顧客が多いのです。
最近こういう人多いですね。データベースを永続化ストレージとしてしか捉えていないという。OO至上主義、とくに O/R マッピング崇拝の弊害だと私は思っています。 そもそも言語の分類が違うんじゃないですか。OOP と SQL では。OOP とはいっても従来の多くのプログラミング言語と同じく「手続き型」言語なんですよね。問題の解法(アルゴリズム)を記述して答えを出す。それに対し、SQL は問題の解法を記述するのではなく、問題自体を定義すれば答えが出る。「定義型」とか「関数型」と呼ばれる言語に近いのではないかと思います。 この全く異なる言語 OOP と SQL の違いを意識させずに透過的に扱えるようにしよう、という発想自体がナンセンス。インピーダンスミスマッチが起こって当たり前。なんで、O/R マッピングなんてものが流行っているのか全く理解できません。
コンピュータの実行効率の問題だけでなく、SQL のような定義型の言語の方が人間に近い位置でプログラムを作れることも多いのです。実際、顧客の要求自体が SQL になっていることさえあるのです。 「2ヶ月連続で自振引き落しできなかった顧客のリストを作れないか?」 こんなのは、そのまま SQL に翻訳して問題として定義できるわけです。とても人間に近い位置でプログラムが作れます。それに対して手続き型言語(OOPでさえも!)の場合は、コンピュータよりの立場でアルゴリズムに書き下していかなければならないはずです。 そもそも、OO は現実世界を表現するというのが理想論・・・というかズレている。多くの業務は現物主義ではないのです。実際の業務は現物とは関係なく伝票と帳簿で進んでいきます。商品入り数を確認するのに、その商品の梱包ケースを見にいくと本当に思いますか? コンピュータシステム化する前の時代から、そのようなものは帳簿にまとめられていて机上ですばやく調べられるようになっているのです。業務を進める上での現物は帳簿や伝票、つまりテーブルの方が現実に近いわけですね。 OOP が必ずしも人間に近い位置でプログラムを記述できる言語だとは言えません。データベースを永続化ストレージとしてしか使っていないプログラマはこの事実に気づかないかもしれませんけどね。 | ||||||||||||||||||||
|
投稿日時: 2005-09-17 09:34
こんにちわ。
C++で業務アプリを開発者として、思っていたことをいくつか述べさせていただきます。 業務アプリは、確実かつ軽快に動くことが最重視されます。 これを実現するためには、重要な要素がいくつかあるのですが、DBのパフォーマンスは重要トピックの一つです。 OOPを使ってDBの存在を隠蔽することは可能ですが、パフォーマンスの低下も隠蔽されがちです。 むしろ、DBの存在をハッキリ意識した上で、アプリを組むことが重要だと考えます。 ですので私は、DOA(データ中心アプローチ)を基本として設計し、OOPはツールとして利用するスタンスを取っています。 「3.テーブル モジュール 」のパターンに当てはまりますね。 イロイロ試行錯誤した結果、安定堅牢な業務アプリを開発する上では、この方法が最適だと判断しています。 まあ、学術分野でのOOPからみたら、かなり汚くて邪道な使い方かもしれませんが。 |