- PR -

オブジェクト指向プログラミングのセオリーについて

投稿者投稿内容
葉瀬崎浩樹
大ベテラン
会議室デビュー日: 2005/06/28
投稿数: 115
お住まい・勤務地: 兵庫県
投稿日時: 2005-10-20 16:42
横槍です。ごめんなさい。

引用:
taaさんの書き込み (2005-10-20 16:11) より:
目的や処理毎にまとめるということはとてもわかりやすいのですが
実際にプログラミングをすると、同じような定義をそれぞれのクラス
へ記述しなければならないからちょっと面倒ですね。
また、共通で使用したい定数等はクラス毎に分けるとメンテナンスが
面倒そうなのでどうなのかなぁと思いました。


ん?誤解してませんか。

引用:
クラスを作っていくと、アプリケーション全体で共通の定数というのは、
ほとんど無い状態になるはずです。


こう書かれてますよね。
クラス毎に書くというのは、同じものをクラス毎にゴリゴリ書くという意味ではありません。
同じような定義を各クラスに書く状況自体、おかしいですよね。
それぞれのクラスは、1つのclassかInterfaceでまとめるか、
あるいは、定義をまとめたクラスを保持すれば良いのでは?
具体的な例は、また後で投稿します。

引用:
VB.NETでプログラミングをしていく中で、それぞれのクラスで
共通的に使用する定数や構造体を、C言語でいうヘッダーファイルのように、
まとめたいと思っているのですが、ソース形式をモジュールやクラスなど、
どの形式で作成した方が良いのか分からず、クラス形式の事を「共通のクラス」
と表現していました。



Constクラスとかを定義して、
そこに共通定数をぶち込むようなことをおっしゃってますか?
そういうのはお薦めしません。
理由としては、
・定数を利用するプログラマーの、脳の負荷が増加する。
・プロジェクトの規模が大きくなると、
 同名異義語や異名同義語が増えてくるため、管理が大変。

名前空間やクラス、列挙体を利用するなどして、意味単位でまとめるようにしましょう。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-10-20 16:46
引用:

共通となる定義 (定数) などは、それはそれで共通となるクラスに分類して、
public なアクセス修飾子にしておけば問題ないと思います。


この「共通」の判断がオブジェクト指向を触り始めた人に曲者のようですね。
#グローバルでなぜいけない?という人たち
例えば、ActionプロパティがAdd,Copy,Move,Removeという列挙である場合
それを「共通」としてひとつにするか、それぞれのクラスの列挙とするか
とか。
#なんかいい例えになってないような。。。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-10-20 16:54
私への質問があったようですが、すでに解決してるみたいですね。


メンテナンス時もプログラミング時も、キーボードを押す回数を減らす、という
省力化よりも、考える量を減らす、という省力化の方が価値があります。
価値があるならば、面倒でもいっぱいキーを打ちましょう。

_________________
たつごろー
codeseek
こみゅぷらす
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-20 17:20
引用:

まどかさんの書き込み (2005-10-20 16:46) より:

この「共通」の判断がオブジェクト指向を触り始めた人に曲者のようですね。


あらら、安易に「共通」と書いては誤解をされちゃいますね。

引用:

例えば、ActionプロパティがAdd,Copy,Move,Removeという列挙である場合
それを「共通」としてひとつにするか、それぞれのクラスの列挙とするか
とか。


この例で話そうとすると...
Action のメンバに変更があった場合の対応の話になりますね。
とあるクラスで固有に変更があった場合と、全体で変更があった場合です。

うーん...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
葉瀬崎浩樹
大ベテラン
会議室デビュー日: 2005/06/28
投稿数: 115
お住まい・勤務地: 兵庫県
投稿日時: 2005-10-20 17:20
たとえば、WindowFormから派生したFormA,FormBがあります。
それぞれのフォームからは、
共通で使用したい定数 constX,ConstY があったとします。
こういう場面を想定して、定数をどこに書くか考えてみました。

コード:
■継承関係に含めても問題が無い場合
      ┌──────┐
      |WindowForm |
      └──────┘
      △
      |
      ┌─────┐
      |FormBase |中間的なクラスを作成し、
      ├─────┤定数を記述する
      │#constX  |
      │#constY  |
      └─────┘
    △   △
    |   |
┌─────┐┌─────┐
| FormA   || FormB   |
└─────┘└─────┘

※注意:定数の共有を目的として継承を使うのはNGです。
あくまで、FormBaseに、constXとConstYがあるのが自然な場合です。
手元に環境が無いので未確認ですけど、Interfaceでも記述できたような気がします。


■定数の目的が、FormAとFormBとは直接的な関係が無い場合。
┌─────┐
| FormA   |◇─┐
└─────┘┌─────┐
       |AB定数    │クラス名はちょっとアレですけど、
       ├─────┤constXとConstYのグループ名を命名します。
       │+constX  |
       │+constY  |
┌─────┐└─────┘
| FormB   |◇─┘
└─────┘



私の場合、こんな感じで定義します。
#「いや、それはおかしい」という所があれば、ご指摘くださいm( _ _)m
餅宮餅吉
ベテラン
会議室デビュー日: 2005/03/04
投稿数: 57
お住まい・勤務地: 月餅のうまい店の隣
投稿日時: 2005-10-20 18:15
こんばんわ、餅宮です。

引用:

taaさんの書き込み (2005-10-20 16:11) より:
また、共通で使用したい定数等はクラス毎に分けるとメンテナンスが
面倒そうなのでどうなのかなぁと思いました。


 誠に申し訳ないですが、ここでいわれている「共通で使用したい定数等」の、
使用方法と範囲が、どのように想定されている定数か分りません。
具体的にはどのようなものでしょうか?

#色々考えたですけど、関数の戻り値として定数を使用することはありませんし、
#クラスに属する値なら、そのクラスに定義しますから。
葉瀬崎浩樹
大ベテラン
会議室デビュー日: 2005/06/28
投稿数: 115
お住まい・勤務地: 兵庫県
投稿日時: 2005-10-20 18:16
引用:
じゃんぬねっとさんの書き込み (2005-10-20 17:20) より:
Action のメンバに変更があった場合の対応の話になりますね。
とあるクラスで固有に変更があった場合と、全体で変更があった場合です。

うーん...

そんなときは、Obsolete属性で時間をかせぎつつリファクタリングを。
#いや、半分冗談です。

結局、直値よりは定数、定数よりは列挙体やメタデータを使いましょう。
メタで抽象化していって、保守性を高くしましょうということと、根は一緒かも知れません。
オブジェクト指向よりも、ADTとして考えた方が理解しやすいかも知れませんね。
taa
常連さん
会議室デビュー日: 2005/08/29
投稿数: 44
投稿日時: 2005-10-20 18:48
たくさんの返答ありがとうございます。

皆さんの説明から恐らくこんな感じであろうというのは
わかってきました。
しかし、そのイメージを文章にするのはちょっと時間をください。
ちょっと知恵熱が出てきました・・・。

また、即答できるとりあえずの返答のみ行います。

引用:

また、共通で使用したい定数等はクラス毎に分けるとメンテナンスが
面倒そうなのでどうなのかなぁと思いました。


共通で使用したい定数とは、複数のForm上で使用するある領域の最大値サイズ
などです。
ただ、共通で使用したい定数を1つのクラスやモジュールへぶち込んだ方が
わかりやすいと思っていましたが、名前空間やクラス、列挙体を利用するなど
して、意味単位でまとめるようにします。
主な方法として意味単位で1つのプロジェクトを作成し、名前空間をそれぞれ作成して、
定数は"Public Module"、構造体は"Public Structure"、などとまとめていこうかと
思っています。

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