- PR -

拡張クラスの命名規則

投稿者投稿内容
わんこ
常連さん
会議室デビュー日: 2003/04/30
投稿数: 46
投稿日時: 2008-04-11 11:45
こんにちは。

フレームワークの既存のクラスを継承してクラスを作成する場合、
皆さんはクラス名をどのように命名していますか?

色々あると思いますが、
例えば、今まで見たことがるのは
フレームワークのクラスをSample.javaとすると・・・

1)Sample.java
2)ExtendedSample.java
3)SampleEx.java
4)全く別の新しい名前


あきらかに、わかりやすい機能を追加することが目的な場合は、
全く別の名前をつけやすいのですが、
ほんの少し変える、というような場合の命名をどうしようか悩んでいます。

Springとかのprotectedメソッドをオーバーライドする場合とか。
しかもSpringの場合はBean定義ファイルのことを考えると、
スーパークラスとサブクラスの定義間違いとか発生しそうです。

皆さんはどのようにしていますか?
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-04-11 13:11
SpecialSample
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-04-11 13:23
SampleExtensions

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-04-11 13:59
そのクラスがどういう位置付けのクラスかを鑑みて命名しますね。
継承した、していないというようなことは大したことではなく、
出来上がったクラスが何者かが重要です。
わんこ
常連さん
会議室デビュー日: 2003/04/30
投稿数: 46
投稿日時: 2008-04-11 14:28

うーん、そういう意味でいうと、
今実際に悩んでいる場合というのは、

例えば、
DataAccessServiceインタフェースがあり、それのデフォルト具象クラスとして既に、FileAccessServiceImpl、JdbcServiceImplがある。
で、JdbcServiceImpl内部で発行されるSQLの条件文に少し付け加えたい場合、JdbcServiceImplの
一つのメソッドをオーバーライドすれば良い仕様になっている。
ここまでがフレームワークの仕様。

これでJdbcServcieImplをextendsする場合、悩みませんかね?
DataAccessServiceをimplementsするなら、明確なので命名しやすいと思うんですが。

クラスの役割としては別にJdbcServiceImplでいいし。
外からみた役割としては別にJdbcServiceImplなので、
ちょっと拡張してます、っていうことだけわかるようにしたいんです。

しかもこのようなパターンが増えてくると、
ある程度パターン化して、親クラスに何かくっつけたほうがわかりやすいかな、
と思ったんですがどうなんでしょうか

ご意見をお聞きしたいです

[ メッセージ編集済み 編集者: わんこ 編集日時 2008-04-11 14:30 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-04-11 18:15
引用:

わんこさんの書き込み (2008-04-11 14:28) より:
クラスの役割としては別にJdbcServiceImplでいいし。
外からみた役割としては別にJdbcServiceImplなので、
ちょっと拡張してます、っていうことだけわかるようにしたいんです。



その「ちょっと拡張」の内容をクラス名に差し挟みますね。
名付けられないような拡張ってことはないでしょう?
ほんの少し、何か意味のあることを追加しているハズ。

外から見たらJdbcServiceImplってのは単にポリモフィズムの話。
継承した場合に外から見て親と同様に扱えるってのは基本ですから命名とはあまり関係がない。
JdbcServiceImplの拡張であると主張した名前である必要はなく、
JdbcServiceの拡張であると主張する名前でありさえすればいい。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-04-11 18:20
というか、〜Implってのが、他に実装がない、
唯一無二の場合の省略名称なんですよね。
だから修飾子なしに、単に「実装」っていう名前でも困らない。
実装が複数になった時点で、「何の」という修飾がつく。

実情によりますけども、唯一無二の拡張でそういう名前で困らないなら
〜ImplExでもいいんじゃないの、と妥協しますね。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-04-11 18:43
引用:

わんこさんの書き込み (2008-04-11 14:28) より:
で、JdbcServiceImpl内部で発行されるSQLの条件文に少し付け加えたい場合、JdbcServiceImplの
一つのメソッドをオーバーライドすれば良い仕様になっている。
ここまでがフレームワークの仕様。

これでJdbcServcieImplをextendsする場合、悩みませんかね?
DataAccessServiceをimplementsするなら、明確なので命名しやすいと思うんですが。


そのフレームワークのようにメソッドをオーバーライドしてクラスをちょこちょこっと改造することを前提としたクラス設計は、運用上は大部分の人にに分かりやすく、使って便利かもしれませんが、泥臭いクラス設計だと思います。だからあまり拘ってもしかたがないかなともちょっと感じます。
私だったら JdbcServiceFooImpl, JdbcServiceBarImpl, ... みたいな感じにします。

Foo や Bar をクラス名のどこに挟み込むかは変数名の名づけ方と同じような問題は別にあるかもしれませんが。
なお、プリフィックス(前に付け足していく)にするよりはサフィックス(後ろに付け足していく)にするほうが、スーパータイプが埋もれなくて良いと思います。
と書いたのですが、う〜ん、これは迷います。サフィックスにするほうが、エクスプローラー形式のビューでソートしたときに同じグループが固まって使いやすいけど、それはツールの仕様がそうであるだけで、英語の形容詞的に使うとすればやっぱりプリフィックス形式のほうが自然かなとも思います。

引用:

わんこさんの書き込み (2008-04-11 14:28) より:
しかもこのようなパターンが増えてくると、
ある程度パターン化して、親クラスに何かくっつけたほうがわかりやすいかな、
と思ったんですがどうなんでしょうか


ここでの「親クラス」って FileAccessServiceImpl や JdbcServiceImpl のことでしょうか?クラスと書かれていることから考えると DataAccessService ではないのですよね?
だったら DataAccessService は考えなくて良いと思います。DataAccessService まで考えたほうが良いという場合は、クラス階層が先祖がえりになってしまっているのかもしれません。

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