- - PR -
拡張クラスの命名規則
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-04-11 11:45
こんにちは。
フレームワークの既存のクラスを継承してクラスを作成する場合、 皆さんはクラス名をどのように命名していますか? 色々あると思いますが、 例えば、今まで見たことがるのは フレームワークのクラスをSample.javaとすると・・・ 1)Sample.java 2)ExtendedSample.java 3)SampleEx.java 4)全く別の新しい名前 あきらかに、わかりやすい機能を追加することが目的な場合は、 全く別の名前をつけやすいのですが、 ほんの少し変える、というような場合の命名をどうしようか悩んでいます。 Springとかのprotectedメソッドをオーバーライドする場合とか。 しかもSpringの場合はBean定義ファイルのことを考えると、 スーパークラスとサブクラスの定義間違いとか発生しそうです。 皆さんはどのようにしていますか? | ||||||||
|
投稿日時: 2008-04-11 13:11
SpecialSample
| ||||||||
|
投稿日時: 2008-04-11 13:23
SampleExtensions
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2008-04-11 13:59
そのクラスがどういう位置付けのクラスかを鑑みて命名しますね。
継承した、していないというようなことは大したことではなく、 出来上がったクラスが何者かが重要です。 | ||||||||
|
投稿日時: 2008-04-11 14:28
うーん、そういう意味でいうと、 今実際に悩んでいる場合というのは、 例えば、 DataAccessServiceインタフェースがあり、それのデフォルト具象クラスとして既に、FileAccessServiceImpl、JdbcServiceImplがある。 で、JdbcServiceImpl内部で発行されるSQLの条件文に少し付け加えたい場合、JdbcServiceImplの 一つのメソッドをオーバーライドすれば良い仕様になっている。 ここまでがフレームワークの仕様。 これでJdbcServcieImplをextendsする場合、悩みませんかね? ![]() DataAccessServiceをimplementsするなら、明確なので命名しやすいと思うんですが。 クラスの役割としては別にJdbcServiceImplでいいし。 外からみた役割としては別にJdbcServiceImplなので、 ちょっと拡張してます、っていうことだけわかるようにしたいんです。 しかもこのようなパターンが増えてくると、 ある程度パターン化して、親クラスに何かくっつけたほうがわかりやすいかな、 と思ったんですがどうなんでしょうか ご意見をお聞きしたいです ![]() [ メッセージ編集済み 編集者: わんこ 編集日時 2008-04-11 14:30 ] | ||||||||
|
投稿日時: 2008-04-11 18:15
その「ちょっと拡張」の内容をクラス名に差し挟みますね。 名付けられないような拡張ってことはないでしょう? ほんの少し、何か意味のあることを追加しているハズ。 外から見たらJdbcServiceImplってのは単にポリモフィズムの話。 継承した場合に外から見て親と同様に扱えるってのは基本ですから命名とはあまり関係がない。 JdbcServiceImplの拡張であると主張した名前である必要はなく、 JdbcServiceの拡張であると主張する名前でありさえすればいい。 | ||||||||
|
投稿日時: 2008-04-11 18:20
というか、〜Implってのが、他に実装がない、
唯一無二の場合の省略名称なんですよね。 だから修飾子なしに、単に「実装」っていう名前でも困らない。 実装が複数になった時点で、「何の」という修飾がつく。 実情によりますけども、唯一無二の拡張でそういう名前で困らないなら 〜ImplExでもいいんじゃないの、と妥協しますね。 | ||||||||
|
投稿日時: 2008-04-11 18:43
そのフレームワークのようにメソッドをオーバーライドしてクラスをちょこちょこっと改造することを前提としたクラス設計は、運用上は大部分の人にに分かりやすく、使って便利かもしれませんが、泥臭いクラス設計だと思います。だからあまり拘ってもしかたがないかなともちょっと感じます。 私だったら JdbcServiceFooImpl, JdbcServiceBarImpl, ... みたいな感じにします。 Foo や Bar をクラス名のどこに挟み込むかは変数名の名づけ方と同じような問題は別にあるかもしれませんが。 なお、プリフィックス(前に付け足していく)にするよりはサフィックス(後ろに付け足していく)にするほうが、スーパータイプが埋もれなくて良いと思います。 と書いたのですが、う〜ん、これは迷います。サフィックスにするほうが、エクスプローラー形式のビューでソートしたときに同じグループが固まって使いやすいけど、それはツールの仕様がそうであるだけで、英語の形容詞的に使うとすればやっぱりプリフィックス形式のほうが自然かなとも思います。
ここでの「親クラス」って FileAccessServiceImpl や JdbcServiceImpl のことでしょうか?クラスと書かれていることから考えると DataAccessService ではないのですよね? だったら DataAccessService は考えなくて良いと思います。DataAccessService まで考えたほうが良いという場合は、クラス階層が先祖がえりになってしまっているのかもしれません。 |
1|2|3
次のページへ»