質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

4回答

1916閲覧

静的なメソッド

TOEICengineer

総合スコア36

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2016/03/11 09:33

オブジェクト指向だと、静的変数や、メソッドは、使わないとよく本にあります。

インスタンス化すると、クラスにまとまった変数や関数がメモリ上に確保される。

静的なメソッドをまとめたクラスを一個つくってメモリ上においていておいて、
入力値をバリデーションするメソッド群をまとめたい場合は静的なメソッドでよいのでしょうか?

アドバイスよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

静的変数や静的メソッドを使うと、似たような機能を増やしてまとめることが難しくなり、機能を拡張する際に足かせになることがあります。
ただインスタンス化するのが常に良いかというと、そうでもなく、保持する変数の数が増えるとそれだけ状態の組み合わせの数が増えて複雑になります。
とくにテストが難しくなります。

そういったバランスを考慮して、インスタンスメソッドにするのか静的メソッドにするのかを決めていくことになります。

静的メソッドを関数オブジェクト化することができる言語なら、関数オブジェクト化して、そうでなければ、インスタンス化して、バリデーターをコレクションとして扱うという方法もありますが、フレームワークなどでそういう機能が提供されているのでなければ静的メソッドで良いと思います。

インスタンス化する場合でも、インスタンスに状態を持たせると厄介なこと(複数スレッドで使用する場合などに困る)になりますので、サブクラス化のためにのみインスタンス化します。

投稿2016/03/12 06:41

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは。

オブジェクト指向だと、静的変数や、メソッドは、使わないとよく本にあります。

「使わない」という記述は見たことないです。静的変数はあまり使わないとか、安易に使うべきでないと書かれているのではないでしょうか?
また、静的メソッドで済むものを理由もなくインスタンス用のメソッドで実装するのは優れたプログラムとは言えないですので、「一般的に」静的メソッドを使うなと書かれることもまずないと思います。

入力値をバリデーションするメソッド群をまとめたい場合は静的なメソッドでよいのでしょうか?

Validatorは可能なら静的メソッドが好ましいです。下手に永続的な変数を持っていると判定バグの原因になります。

Validatorをまとめて1つのクラスに入れるかどうかは、そのシステムの要件によります。
複数のクラス間にまたがって入力値のチェックをしないといけないようなケースでは、そのValidatorを統合的な別クラスに入れるのはありと思います。
「特定のクラスへの入力値をチェックするメソッド」をたくさん集めてきて1つのクラスにまとめるのは、褒められたことではないです。関係の強いものからわざわざ離して無関係なものの集合の中に入れると、メンテナンスはやりにくくなります。

投稿2016/03/11 12:04

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

>インスタンス化すると、クラスにまとまった変数や関数がメモリ上に確保される。

関数がメモリ上にインスタンス化した数だけ増殖配置されるという事は無いと思います。
インスタンス化した数だけメモリ上に確保されるのは変数の方ですね。
プログラム(関数、メソッド…呼び方は色々ありますが)の本体自体は1つです。
そのメソッドを呼び出す時に、引数に表示はされていないけど内部的にこっそりどのクラスかを
示すポインター的なデータも一緒に渡っていて、それを経由する事でどのクラスなのかを個体識別
してアクセスできている…的なイメージで考えればいいんじゃないかと思います。

投稿2016/03/11 10:06

HiroshiWatanabe

総合スコア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
bensky

総合スコア94

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問