R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

パーシャルクラスの使い道

最近、訳があって

パーシャルクラスの使い道

を考えています。

パーシャルクラスは、宣言を複数に分けて記述することができるクラスです。
一般的なクラスをパーシャルクラスにするためには、クラスの宣言を partial キーワードで修飾します。
パーシャルクラスは、宣言を複数に分けて記述することができるため、複数のファイルに分けてクラスを記述することができます。

今は、コードジェネレートした結果として使用されていることが多いように思いますが、本来は、自分でもパーシャルクラス化することが簡単にできるのです。

そこで、パーシャルクラスを、可変性の高いコードと、不変性の高いコードに分けてファイルに保存してはどうかと考えました。
可変性の高いものと、不変性の高いものを分離する方法は、ソースコードに限らず、一般的に行われていことです。

次に、何を持って可変性が高いと言えるのかを考えてみました。
開発環境の変化という見方もありますし、テーブルの論理設計の変化という見方もあります。

ならば、それらをすべて別のファイルに分けて、フォルダに分けて管理してはどうかと考えました。

構造化プログラミングが 1 次元的なコードの分類で、オブジェクト指向が 2 次元的なコードの分類だとすれば、パーシャルクラスによるファイルの分類は、3 次元的なコードの分類だと言えるのではないかと思ったのです。

ということで、取りあえずは、データモデルに関する部分だけを分離することから初めてみようかな。

投稿日時 : 2009年9月9日 14:35

Feedback

# パーシャルクラスに対する一抹の不安 2009/09/09 21:43 東方算程譚

パーシャルクラスに対する一抹の不安

# パーシャルクラスに対する一抹の不安 2009/09/09 21:46 東方算程譚

パーシャルクラスに対する一抹の不安

# re: パーシャルクラスの使い道 2009/09/09 23:05 やまだ

> 今は、コードジェネレートした結果として使用されていることが多いように思いますが、本来は、自分でもパーシャルクラス化することが簡単にできるのです。

ですね。

# re: パーシャルクラスの使い道 2009/09/09 23:12 HIRO

最近、自分も訳あって悩みました(同じ理由でしょうか?)。

VB.NETもパーシャルクラスが作れます。
しかし、クラスの実装コードが余りにも短い場合には、不必要なものですよね。

やはりRさんが仰るように
>可変性の高いコードと、不変性の高いコードに分けてファイルに保存してはどうかと考えました。
なるんじゃないでしょうか?

自分的には、クラスが別ファイル分かれて実装されるのは好きではないです。
やはり全体を1で見渡したいので...

# re: パーシャルクラスの使い道 2009/09/09 23:17 やまだ

あう、コメント途中で入っちゃった……orz

> 今は、コードジェネレートした結果として使用されていることが多いように思いますが、本来は、自分でもパーシャルクラス化することが簡単にできるのです。

ですね。

> そこで、パーシャルクラスを、可変性の高いコードと、不変性の高いコードに分けてファイルに保存してはどうかと考えました。

えと、開発者が直接書かなければいけないところと、自動生成の可能性があるところ、という解釈でOKでしょうか?
つまりはフレームワークとかMDAとかDSLとかってやってきたことのための実現技術として使えるのかと思ってますが。

すべてのコードを自動生成することは難しい。
ならば、どうしても開発者自身が書かなければいけないところだけを切り出す。
それ以外は、VisualStudioやUMLツールやExcelテンプレート、独自ツールなんでもいいのでモデルとして記述した表現からコードを吐き出す。
そうすれば、手書きのコード部分とツール生成部分を独立にメンテできる。
コードは必要最小限しか書かないので、その部分だけ理解できれば良い。全貌はツール上のモデル図で把握できればOK。

逆に、両方とも開発者自身がコードを書く、という前提だと、
・同じ開発者の場合→クラスをわける意味がない。
・異なる開発者の場合→インタフェースの切り方をきっちり定義しないと混乱のもと。
という気がします。

……釈迦に説法?

# re: パーシャルクラスの使い道 2009/09/09 23:25 T.Hirase

不変性うんぬんで切り分けるのは、
そのソースが、いつまでも不変とは限らないのでやらない方が良いかと思います。
自分が思ったのは、目的によってソースを切り分けることができるかなと。
たとえば、
・公開/非公開
・public/private/protected
・入れ子型
・デザイナのための拡張クラスなど

ま、region/endregionでくくっちゃえば、同じ効果を得られますが。
どうでしょ?

# re: パーシャルクラスの使い道 2009/09/09 23:27 T.Hirase

自己レスですが、
>・公開/非公開
は、ソースコードの公開/非公開です。public/privateの話じゃありません。

# re: パーシャルクラスの使い道 2009/09/10 13:07 よこけん

必ずしもそうとは限らないかもですが、
可変性の高い箇所と低い箇所があって、ファイルを分けた方が見やすくなる、ということは、
単一責任の原則に従って新しいクラスに分けた方が良い、というサインではないかなぁと思います。

僕の場合、入れ子型を別ファイルに書くのはよくやります。
Strategy パターン・State パターンを適用すると入れ子型が多くなるんで。
後、自分のコードからは使用しないけれどフレームワークの制約上必要なメンバー (例えば NHibernate だと Model にデフォルトコンストラクタを用意しなければいけない) を別ファイルにしたりしますね。

# re: パーシャルクラスの使い道 2009/09/10 13:34 R・田中一郎

もう少し言及したいので、突っ込んだ話は(その2)に書きますね。

--------------------------------------------------

HIRO さん

>最近、自分も訳あって悩みました(同じ理由でしょうか?)。

おそらくw

--------------------------------------------------
やまだ さん

>つまりはフレームワークとかMDAとかDSLとかってやってきたことのための実現技術として使えるのかと思ってますが。

MDA や DSL がやっていることは、結果的にクラスを役割によって分けていることになる訳ですよね。
つまり MDA や DSL が先ではなくて、分類した結果としてツールによる管理があると考えることはできないでしょうか。

--------------------------------------------------
T.Hirase さん

>不変性うんぬんで切り分けるのは、
>そのソースが、いつまでも不変とは限らないのでやらない方が良いかと思います。

「不変性が高い」は、固定的であるという意味ではなく、あくまでも、ある視点から見たとき、可変性が高いかどうかの分類です。
ある視点から見た時、可変性が高い物のみを抽出するという手法は、設計の基本ではないかと思います。

>自分が思ったのは、目的によってソースを切り分けることができるかなと。
>たとえば、

デザイナのための拡張クラスを除いて、パーシャルクラスにする理由が見受けられないように思います。
パーシャルクラスにすることは、リスクを伴います。
ですから、パーシャルクラス化によって得られるメリットと、リスクをトレードオフすることによって、メリットが得られると判断した場合に限ってパーシャルクラス化するべきだと思うのです。

--------------------------------------------------
よこけん さん

>単一責任の原則に従って新しいクラスに分けた方が良い、というサインではないかなぁと思います。

メソッドに対する単一責任の原則は重要だと思います。
しかし、クラスに対しては単なる処理のグループ化にすぎないと思うのです。

>僕の場合、入れ子型を別ファイルに書くのはよくやります。
>Strategy パターン・State パターンを適用すると入れ子型が多くなるんで。
>後、自分のコードからは使用しないけれどフレームワークの制約上必要なメンバー (例えば NHibernate だと Model にデフォルトコンストラクタを用意しなければいけない) を別ファイルにしたりしますね。

実施に、パーシャルクラスを活用されているのですね。
参考になります。

# re: パーシャルクラスの使い道 2009/09/11 18:29 Jitta

デジャブ
以前、「メリットがわからない」とか、エントリしていませんでした?

# re: パーシャルクラスの使い道 2009/09/14 14:05 R・田中一郎

エントリした記憶はありますが、ここ最近再考する機会がありました。
もう少し言及しようと思っているのですが、時間がなくてまとめられません。

# re: パーシャルクラスの使い道 2009/09/21 10:58 kogetsu

インプリしたインターフェースの実装としてClassName_InterfaceName.csみたいな使い方をするときがあります。
とくに~ableで終わる名前のインタフェースのときなど、メインのクラスの責務に何か機能を加えたときや、インプリしたインタフェースの実装コードが委譲ばかりで、情報量が少ないわりにコード量が増えるものを中心に分割します。

# re: パーシャルクラスの使い道 2009/09/21 13:21 R・田中一郎

なるほど。
分類の方法は、やはりいろいろありますよね。
ある視点からみた場合に、可変性は変わってきますよね。
上記は、インターフェイスから見た場合の、可変性による分類ということになると思います。

・・・というようなことを書こうと思っている訳です orz

# Pretty! This has been a really wonderful post. Thanks for supplying these details. 2019/04/11 0:22 Pretty! This has been a really wonderful post. Tha

Pretty! This has been a really wonderful post.
Thanks for supplying these details.

# What a stuff of un-ambiguity and preserveness of precious experience concerning unpredicted emotions. 2019/05/08 1:35 What a stuff of un-ambiguity and preserveness of p

What a stuff of un-ambiguity and preserveness of precious experience
concerning unpredicted emotions.

# It's very simple to find out any matter on web as compared to books, as I found this piece of writing at this web page. 2019/05/12 0:05 It's very simple to find out any matter on web as

It's very simple to find out any matter on web as compared to books, as I found this piece of writing at
this web page.

# We are a bunch of volunteers and starting a brand new scheme in our community. Your web site offered us with useful info to work on. You have done an impressive process and our entire group can be grateful to you. 2019/05/14 19:02 We are a bunch of volunteers and starting a brand

We are a bunch of volunteers and starting a brand new scheme in our
community. Your web site offered us with useful info to work
on. You have done an impressive process and our entire group
can be grateful to you.

# I am genuinely thankful to the owner of this site who has shared this fantastic article at at this place. 2019/06/01 2:55 I am genuinely thankful to the owner of this site

I am genuinely thankful to the owner of this site who has shared this fantastic article
at at this place.

# I just like the helpful info you provide on your articles. I'll bookmark your weblog and test again here frequently. I'm quite certain I'll be told a lot of new stuff right right here! Good luck for the next! 2019/06/05 5:39 I just like the helpful info you provide on your a

I just like the helpful info you provide on your articles.

I'll bookmark your weblog and test again here frequently.
I'm quite certain I'll be told a lot of new stuff right right here!
Good luck for the next!

# Hurrah, that's what I was looking for, what a stuff! existing here at this website, thanks admin of this web site. 2019/06/05 21:40 Hurrah, that's what I was looking for, what a stuf

Hurrah, that's what I was looking for, what a stuff!
existing here at this website, thanks admin of this web site.

# Heya i'm for the first time here. I came across this board and I find It truly useful & it helped me out a lot. I hope to give something back and aid others like you aided me. 2019/09/08 14:23 Heya i'm for the first time here. I came across th

Heya i'm for the first time here. I came across this board and I find It truly useful
& it helped me out a lot. I hope to give something back and aid others like you
aided me.

# DExytfWlObsUQXNrBM 2021/07/03 2:58 https://amzn.to/365xyVY

Im thankful for the blog article.Thanks Again. Want more.

# RBQXwYlVxZvFzzKMZyE 2021/07/03 4:29 https://www.blogger.com/profile/060647091882378654

It is actually a great and useful piece of info. I am happy that you shared this useful info with us. Please keep us up to date like this. Thanks for sharing.

タイトル
名前
Url
コメント