@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

NET のアーキテクチャへの理解について

投稿者投稿内容
会議室デビュー日: 2004/11/14
投稿数: 14
投稿日時: 2004-11-14 19:57
初めての参加です。お尋ねしたいことがあり、書き込ませて頂きます。
VC.NET を最近になってようやく学び始めている者です。
既出内容であれば是非ご容赦ください。

これまで Smalltalk の MVC、MFC(VC++6) のドキュメントビューアーキテクチャ
に慣れ親しんできました。

お尋ね内容:
・NET は、上記のようなアークテクチャに基づくクラス構成は、
 標準的には提供されない(プロジェクト新規作成により自動生成されない)
 と、最近気づいたのですが、この理解は正しいでしょうか。

・上に関係するところとして(少々長い前振りになりますが)、
 NET Windows フォームアプリケーションプロジェクトを新規生成したときには、
 Form1.cpp にて、_tWinMain関数から"Application::Run(new frmMain())"
 というコードが自動生成されます。アプリケーションのエントリポイントが
 Form1 にある、と表現したらよいのでしょうか、これについて今までの(前述の)
 アーキテクチャ感覚で捉えると、ずいぶんと Form1 が「格が上がった」ような
 印象を持ちました。
 Application::Run 以外で、アプリケーション起動を実現する他の方法があるのか
 ないのか、全く理解できておりませんが、このメソッドを使う限り、Form1 が
 まずは中心的に存在するということになるかと理解しました。
 Form1 は画面制御担当(?)ですから、データ処理には MFC でいう CDocument クラス
 に受け持たせたいと感じています。これをするならば、Form1 のメンバ変数として
 CDocument 相当のインスタンスを持たせて・・・といった格好になるのだろうかと、
 その方向性を模索しているところです。
 長くなりましたが、ここまでの理解について、見当違い・勉強不足など、
 あるかと思いますので、是非みなさまの知識ご見解をお聞かせ頂けませんでしょうか。

コーディング手法というよりも、設計方法論・アーキテクチャといった観点での
興味を抱いて、質問させて頂いている次第です。
長文失礼致します。ご教示頂けましたら幸いです。
以上、よろしくお願い申し上げます。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-11-15 09:21
引用:

・NET は、上記のようなアークテクチャに基づくクラス構成は、
 標準的には提供されない(プロジェクト新規作成により自動生成されない)
 と、最近気づいたのですが、この理解は正しいでしょうか。



正しいです。

[quote]
 Application::Run 以外で、アプリケーション起動を実現する他の方法があるのか
 ないのか、全く理解できておりませんが、このメソッドを使う限り、Form1 が
 まずは中心的に存在するということになるかと理解しました。
[quote]

それはちょっと早計では?

GUI アプリケーションが Application.Run() によって起動されるのは動かしがたい事実ですが、それが「Form1 に配置されなければならない」というルールはありません。

Vsual Studio 2005 では、Program クラスが導入され

コード:
class Program
{
  public static void Main()
  {
    Applicatin.Run (new Form1());
  }
}



のようになります。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-11-15 09:50
引用:

 その方向性を模索しているところです。



シナリオに応じて最適な手法を採用すればいいんじゃないでしょうか。

CWinApp と CMainFrame の役割を Form1 に持たせた方がいい場合もあるでしょうし、

コード:
class Form1 : System.Windows.Forms.Form
{
  public Program App;
  public Form1(Program app)
  {
     this.App = app;
  }
}

class Program
{
  public static void Main()
  {
    Application.Run(new Form1(this));
  }
}



のようにしても何も問題はありません。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
菊池
会議室デビュー日: 2004/11/15
投稿数: 19
投稿日時: 2004-11-15 10:03
Application.Run に渡すのは別にFormでなくても良いです。

ApplicationContextを実装するクラスを用意する事でMVCのようなアーキテクチャを実装する事ができます。
Formには単一フォームアプリケーションで利用可能なデフォルト実装があるだけだと理解すればよいでしょう。

_________________
Microsoft Valueable Professional C# 2004
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2004-11-15 11:02
直接の回答ではないです。

> コーディング手法というよりも、設計方法論・アーキテクチャといった観点
ということでしたら、ご存知かもしれませんが、
かなり業務向けで、必ずしも最良の選択ともいえないものなんですが、
マイクロソフトは以下のようなものも出してます。
思考のネタにはできますよ。

Microsoft patterns and practices for Application Architecture and Design

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/Anch_EntDevAppArchPatPrac.asp

_________________
たつごろー
codeseek
こみゅぷらす
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2004-11-15 11:14
Application.Run()についての理解を深めるのに、私の場合
次の記事(書籍からの抜粋)が役に立ちました。

http://www.microsoft.com/japan/msdn/net/books/ProgWinCsharp/chapter2.asp

まずは読んでみてはどうでしょうか。
会議室デビュー日: 2004/11/14
投稿数: 14
投稿日時: 2004-11-15 13:10
皆様、ご回答ありがとうございました。
皆様ご指摘により、かなりすっきりとして参りました。

渋木様のご指摘:
Program クラスの話は、これまでのクラスアーキテクチャ的発想に近いものを感じ、
今後の NET 2005 がどのようなものか、どうなっていくのか注視したいと思います。

ご指摘頂きました、
> CWinApp と CMainFrame の役割を Form1 に持たせた方がいい場合もあるでしょうし

は、いまや凝り固まってしまった発想からは、そのようには戻せない感覚が自分には
あると感じ、反面、NET でのクラス構成に沿う形で、柔軟な捉え方が必要なので
あろうと感じた次第です。


ただ菊地様のご指摘、
> ApplicationContextを実装するクラスを用意する事で (以下略)

は、相当な違和感を感じてしまっています。
ApplicationContext については、Application.Run のヘルプから承知しておりましたが、
このクラスがどうやらメッセージループのカスタマイズ目的で用いる様子であること
からしますと、確かに MVC 的実装が可能かもしれませんが、クラスの意義を大きく
逸脱してしまう気が致しました。C++ 登場以前より、長くオブジェクト指向に浸かって
きた身として、クラス設計に“やいのやいの”と申し上げる性分が災いしているのか
と思います。


たつごろー様のご指摘、
これだ!と思いました。ご紹介頂き、大変有難く思っています。
英文は大好きなので、このページは必ずや読破するつもりです。

その中に、User interface components:
...
Have a reference to a current user process component ...
とありますね。
斜め読みしただけですが、Form1->m_document といったところでしょうか...
(読み切るにはあまりに長大な文章ですので、真意がまだ分かりませんが)
ただ、もしそうだとするとちょっと... と思ってしまいます。
やはり Program クラスの方がすっきりしている気がします。


小野@どっとねっとふぁん様のご指摘ページも、
一読すべき様子とお見受け致しました。しっかりと読んでおきたいと思います。


かくも有用な情報を数々頂戴でき、大変感謝致しております。
ありがとうございました。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2004-11-15 14:23
> たつごろー様のご指摘、
> これだ!と思いました。ご紹介頂き、大変有難く思っています。
> 英文は大好きなので、このページは必ずや読破するつもりです。

私は英文だめです。
四苦八苦して読んでます。

一部日本語化されてます。
http://www.microsoft.com/japan/msdn/architecture/default.aspx
ほんの一部...
http://www.microsoft.com/japan/resources/practices/


> その中に、User interface components:
> ...
> Have a reference to a current user process component ...
> とありますね。
> 斜め読みしただけですが、Form1->m_document といったところでしょうか...

その文章は見つけられなかったんで、前後関係がよくわからないんだけど、
Application BlockのUser Interface Processに書いてあったのなら、
これはForm1->mdocumentというつくりではなかったはず。
よいかどうかは別として、もっと込み入ってる。
間違ってるかもしれないけど、

ポストバックされたらControllerに飛んで
業務処理をして
次に表示するview(WebFormとWinForm)はどれかをControllerと業務処理で判断して
xmlに入っている次に表示すべきviewをロードして
レンダリングさせてたはず。

WebFormやWinFormでポストバックのときにFormのイベントが走るので、一時
的にそのような親子関係はできたかもしれない。
今使ってるPCに入ってないんで確認できないです。

Application Blocksは改良中らしいです。
現時点のはちょっと複雑なんでお勧めできない。
勉強にはなりますよ。


_________________
たつごろー
MCSD.NET、MCDBA、MCSA、MCAD
Oracle Master Platinum 9i、Oracle Master Linux+

[ メッセージ編集済み 編集者: たつごろー 編集日時 2004-11-15 14:31 ]

スキルアップ/キャリアアップ(JOB@IT)