オブジェクト指向だと、静的変数や、メソッドは、使わないとよく本にあります。
インスタンス化すると、クラスにまとまった変数や関数がメモリ上に確保される。
静的なメソッドをまとめたクラスを一個つくってメモリ上においていておいて、
入力値をバリデーションするメソッド群をまとめたい場合は静的なメソッドでよいのでしょうか?
アドバイスよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
静的変数や静的メソッドを使うと、似たような機能を増やしてまとめることが難しくなり、機能を拡張する際に足かせになることがあります。
ただインスタンス化するのが常に良いかというと、そうでもなく、保持する変数の数が増えるとそれだけ状態の組み合わせの数が増えて複雑になります。
とくにテストが難しくなります。
そういったバランスを考慮して、インスタンスメソッドにするのか静的メソッドにするのかを決めていくことになります。
静的メソッドを関数オブジェクト化することができる言語なら、関数オブジェクト化して、そうでなければ、インスタンス化して、バリデーターをコレクションとして扱うという方法もありますが、フレームワークなどでそういう機能が提供されているのでなければ静的メソッドで良いと思います。
インスタンス化する場合でも、インスタンスに状態を持たせると厄介なこと(複数スレッドで使用する場合などに困る)になりますので、サブクラス化のためにのみインスタンス化します。
投稿2016/03/12 06:41
総合スコア9388
0
ベストアンサー
こんにちは。
オブジェクト指向だと、静的変数や、メソッドは、使わないとよく本にあります。
「使わない」という記述は見たことないです。静的変数はあまり使わないとか、安易に使うべきでないと書かれているのではないでしょうか?
また、静的メソッドで済むものを理由もなくインスタンス用のメソッドで実装するのは優れたプログラムとは言えないですので、「一般的に」静的メソッドを使うなと書かれることもまずないと思います。
入力値をバリデーションするメソッド群をまとめたい場合は静的なメソッドでよいのでしょうか?
Validatorは可能なら静的メソッドが好ましいです。下手に永続的な変数を持っていると判定バグの原因になります。
Validatorをまとめて1つのクラスに入れるかどうかは、そのシステムの要件によります。
複数のクラス間にまたがって入力値のチェックをしないといけないようなケースでは、そのValidatorを統合的な別クラスに入れるのはありと思います。
「特定のクラスへの入力値をチェックするメソッド」をたくさん集めてきて1つのクラスにまとめるのは、褒められたことではないです。関係の強いものからわざわざ離して無関係なものの集合の中に入れると、メンテナンスはやりにくくなります。
投稿2016/03/11 12:04
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
>インスタンス化すると、クラスにまとまった変数や関数がメモリ上に確保される。
関数がメモリ上にインスタンス化した数だけ増殖配置されるという事は無いと思います。
インスタンス化した数だけメモリ上に確保されるのは変数の方ですね。
プログラム(関数、メソッド…呼び方は色々ありますが)の本体自体は1つです。
そのメソッドを呼び出す時に、引数に表示はされていないけど内部的にこっそりどのクラスかを
示すポインター的なデータも一緒に渡っていて、それを経由する事でどのクラスなのかを個体識別
してアクセスできている…的なイメージで考えればいいんじゃないかと思います。
投稿2016/03/11 10:06
総合スコア2160
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
入力値をバリデーションするメソッド群をまとめたい場合は静的なメソッドでよいのでしょうか?
そうですね。
できれば、もっと汎用的に使えるメソッド(例: 全角・半角・改行を取り除く、 とか)を用意し、
ユーティリティクラスとして用意すると便利になると思います。(私も現場でも、そういった方法はよくします。)
例:php
class ValidationUtility { public static function deleteSpace($str) { return preg_replace('/(\s| )/', '' ,$str); } public static function deleteLineBreak($str) { return preg_replace('/(\n|\r|\r\n)/', '' ,$str); } }
あんまり参考にならなかったら、ゴメンなさい。
投稿2016/03/11 11:06
編集2016/03/11 11:08総合スコア94
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。