- PR -

ファイルのテンプレート作成

投稿者投稿内容
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2002-11-03 06:34
過去ログを検索したのですがどうも思ったものが見当たらなかったので
質問させてください。

VB6のときは予めフォームに共通するコントロールやコードを書いておいた
フォームをテンプレートとして登録し、新規フォームを作成するときに
そのテンプレートフォームを指定することにより共通するコーディングや
コントロールの登録などの手間を減らすことが可能でした。

これってVB.NETやC#でも可能なんでしょうか。

例えば、あるインターフェースクラスを継承し、かつそのクラス中の
abstract(VBの場合MustInherits)指定のプロシージャの雛型を予め
登録しておいたクラスをテンプレートクラスとして、クラスファイルを
追加する際にそのテンプレートファイルを指定してやったり、
同じように共通したWebページデザインをもつWebFormの
テンプレートを登録するなどです(スタイルシートで登録できる以上の
内容、例えば共通するメニューボタンの配置およびそのクリックイベントの
処理など)。

ご存知の方がおられましたらどうか情報ください
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-11-05 08:26
こんにちは。

>>そのテンプレートフォームを指定することにより共通するコーディングや
>>コントロールの登録などの手間を減らすことが可能でした。

 オブジェクト指向の「継承」という機能を使います。

 具体的には、テンプレート化したいフォームを、アプリケーションではなく、「Windowsコントロールライブラリ」で作成します。すると、そのプロジェクトをビルドするとDLLファイルが作成されます。次に、新しいプロジェクトを作成し、「参照」で先ほど作成したDLLを登録します。そしてクラスを、「inherits(VB)」や「:(C#)」を使って作成すればOK。
 この場合、新しいクラスはフォームそのものではないので、フォームの上に貼り付けてやる必要があります。

 もしかすると、Windowsアプリケーションで作ったEXEででも、同じようにできるかもしれません。
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2002-11-05 14:32
Jittaさん、返信感謝します。

ただ、私がしたかったのは
1.ASP.NET上での開発
2.継承では同一デザインのページを作成するのに毎回手作業が入るため
 テンプレートファイルを用いたい
になるので、ご教授いただいた内容が当てはまらないように感じました。

私が知らないことがまだあるためなのかもしれませんが、
例えばクラスAを親クラスとして、いくつかのサブクラスを作成する際
現時点ではサブクラスで共通して記述するプロシージャなどを手作業で
毎回記述しています(MustoInheritsで記述しているプロシージャーなど)。
しかし、定数定義などの一部を除けば全く同じコードを延々とカッペして
いる状態でして(無論クラス独自の機能に関してはカッペできませんが)、
なんとかこの手間を省きたいのです。
あと、WebFormを作る際、定位置に必ずくるタイトル表示やいくつかの
ボタンなど、アプリケーションページにおいて統一されたデザインと
機能(ボタンに割り当てる同じ機能の処理など)が必要な場合、
手作業でデザインを配置したり同じプロシージャを手作業で生成するので
無く、なんとかテンプレートファイルが使えたらというのが考えです。
継承でできれば無論それに越したことはないのですが、ページデザインは
継承できないようでしたのでテンプレートファイルという考えに至った
のですが、なんか良い方法はないものでしょうか。

確かに量としてはたいした量ではないかもしれません。しかし、
レベルがばらつくチームで開発しているためテンプレートを利用する
ことにより、コードを含めて一定の統一を図りたい、ばらつきを防ぎたい
という意図があります。

なにか良い方法はないのでしょうか
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-11-05 15:35
引用:

べーちゃんさんの書き込み (2002-11-05 14:32) より:

ただ、私がしたかったのは
1.ASP.NET上での開発
2.継承では同一デザインのページを作成するのに毎回手作業が入るため
 テンプレートファイルを用いたい
になるので、ご教授いただいた内容が当てはまらないように感じました。

私が知らないことがまだあるためなのかもしれませんが、
例えばクラスAを親クラスとして、いくつかのサブクラスを作成する際
現時点ではサブクラスで共通して記述するプロシージャなどを手作業で
毎回記述しています(MustoInheritsで記述しているプロシージャーなど)。
しかし、定数定義などの一部を除けば全く同じコードを延々とカッペして
いる状態でして(無論クラス独自の機能に関してはカッペできませんが)、
なんとかこの手間を省きたいのです。
あと、WebFormを作る際、定位置に必ずくるタイトル表示やいくつかの
ボタンなど、アプリケーションページにおいて統一されたデザインと
機能(ボタンに割り当てる同じ機能の処理など)が必要な場合、
手作業でデザインを配置したり同じプロシージャを手作業で生成するので
無く、なんとかテンプレートファイルが使えたらというのが考えです。
継承でできれば無論それに越したことはないのですが、ページデザインは
継承できないようでしたのでテンプレートファイルという考えに至った
のですが、なんか良い方法はないものでしょうか。


 いえいえ、その「カッペ」を省くために、「継承」するんです。

 元となる実態を持ったクラス(BaseClass)をひとつ作っておき、それを継承すれば、BaseClassでMustOverrideなどと記述したものをのぞいて、継承先で再定義しなければならないものはないはずです。VB6ではオブジェクト指向が中途半端なため、継承がないのでテンプレートという考え方だったと思います。
例:
コード:
public mustinherits class A
  protected sub CommonSubrutine()
    ' カッペしているコード
  end sub
  abstruct protected sub Subrutine()
  end class

class A-Dash
 inherits A
  protected override sub Subrutine()
    MyBase.CommonSubrutine()
    ' その他の処理
  end sub
end class


継承しなければならないからと言って、すべての関数を抽象型にしなければならない訳ではないので、いくつも使うようなものは実態を持たせます。オーバーライドした関数で必ず呼ぶようにしておけば、カッペするのは1行ですむでしょ?それに、必ず決まったコードを実行するなら、abstruct宣言する必要はないと思いますが?
#とはいうものの、私の場合はC++がメインなので、
#VB.NETでは、抽象クラスはすべて抽象メソッドなのでしょうか?

 Webページの方は、すみません、詳しくはないです。が、結局オブジェクトの宣言ですよね?C言語で言うところのincludeみたいなことはできないのでしょうか。それとかスタイルシートとか、処理なんかも一緒ならキャプションをXMLなどで埋め込むとか、PHPなどのようにページを動的に作るとか、etc...
未記入
ベテラン
会議室デビュー日: 2002/09/10
投稿数: 68
投稿日時: 2002-11-05 15:52
>あと、WebFormを作る際、定位置に必ずくるタイトル表示やいくつかの
>ボタンなど、アプリケーションページにおいて統一されたデザインと
>機能(ボタンに割り当てる同じ機能の処理など)が必要な場合、

共通の部分をユーザーコントロールとして作成し、
各ページでそれを読み込めばよいのではないでしょうか。

インターフェース云々については、
インターフェースを実装し、共通の処理を定義する親クラスと、
それぞれ異なる部分のみ記述するサブクラスとにわけるようにします。
「だいたい同じだけどちょっと違う」というようなメソッドは共通な部分と
そうでない部分に分割します。
ちなみに定数定義しか差異がないのであれば、
インスタンスで差異を吸収できないか検討する必要があるような気がします。


[ メッセージ編集済み 編集者: 通常の名無しさんの3倍 編集日時 2002-11-05 15:53 ]
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2002-11-06 08:10
Jittaさん、通常の名無しさんの3倍さん回答ありがとうございます。

>元となる実態を持ったクラス(BaseClass)をひとつ作っておき、
>それを継承すれば、BaseClassでMustOverrideなどと記述したものを
>のぞいて、継承先で再定義しなければならないものはないはずです。

はい、最初から一応そのようにして全てをMustoverrideで定義しては
いません。ただ、今回はポリモーフィズムをいくつかもちいるため、
そのためのメソッド群をMustOverrideで定義しています。


>継承しなければならないからと言って、すべての関数を抽象型に
>しなければならない訳ではないので、いくつも使うようなものは
>実態を持たせます。オーバーライドした関数で必ず呼ぶように
>しておけば、カッペするのは1行ですむでしょ?

確かに親で実装している関数を実装するに当たってはカッペは1行だけ
なのですが、前述のようにポリモーフィズムを使っているのですが、
親では実装できないそのメソッド内の処理の流れ自体を統一するために
予め概要だけのスケルトンを作成したいというのが目的でして、
そうなるとカッペは1行では済まず、ポリモーフィズムを使う
全てのメソッドをカッペすることになります。


>#とはいうものの、私の場合はC++がメインなので、
>#VB.NETでは、抽象クラスはすべて抽象メソッドなのでしょうか?

いえC++と同じく全てを抽象メソッドにする必要はありません。


>共通の部分をユーザーコントロールとして作成し、
>各ページでそれを読み込めばよいのではないでしょうか。

はい、ただそのユーザーコントロールを最初から乗ったスケルトンの
ページをテンプレートとして作成したいのです。


意図がうまく伝わらず申し訳ありませんが、そもそも今回の主な
動機は予めスケルトンを作成して、それを元に肉付けしていく
ことにあります。

というのも、開発メンバーのレベルが揃わないためスケルトンを
用いて予め処理の流れを決めてやらないと、処理にばらつきが
でてしまうこと、そして、VS.NETの場合常にメソッドなどの
プロシージャが追加の形をとるため開発者がメソッドを実装する
順番によって各クラスのメソッドの実装位置がばらばらになって
しまいます(VB6はアルファベット順に実装されますよね)。
これでは変更が入ったり、他の人が担当したコードをデバッグする
ときに手間がかかります。
スケルトンを用いて全ての共通するメソッド類を全く同じ順番で
先頭のほうに固めておくと、その部分に関しては誰が作った
クラスであっても一目で位置関係や構造を把握できます。
ページに配置するコントロールの場合、同じコントロールでも
人によっては違う名称を割り当てる人もいます(最初から
指定していても実際には発生するものです)。
予め決まっているコントロールが登録されているテンプレートを
用いればそのようなことは、余程のことがなければ発生しません。
それを改善するための方法なのです。
決してご提案いただいた「継承」を軽視してのことではないのですが、
トンチンカンな考えなんでしょうか。
未記入
ベテラン
会議室デビュー日: 2002/09/10
投稿数: 68
投稿日時: 2002-11-06 09:27
処理の流れが統一されているならば
TemplateMethodパターンで親クラスに流れを定義できませんか

後ろのほうの話は、言語というより
コミュニケーションの問題のように僕には感じられます。
コーディング標準を策定するとか、
そういった解決策もあるのではないでしょうか
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2002-11-06 09:48
そう思います。それほど本質的な問題ではないと思う。 VBのときはこうだった とか
いうのは 手放したほうがいいです。

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