web-dev-qa-db-ja.com

オブジェクト指向の「プライベート」メソッドが必要なのはなぜですか?

私はそれがおっとの非常に基本的な概念であることを理解しています。しかし、それでも頭を動かすことはできません。メンバー変数がプライベートである理由を理解したので、クラスユーザーは無効な値を設定して悪用することはできません。

しかし、これはメソッドにどのように適用できますか?

44

たくさんの良い答えがありますが、多分、独学で教えたJavaプログラマーが苦労して自分ですべてを行ったので、;)

内部的に見えるものではなく、外部から見えるものとしてクラスを考えてください。クラスを外部から見ると、何が見えますか?

時計をもう一度例に取ると、時計は現在の時刻についての情報を与えるであり、正しい時刻を表示するために設定することができます

したがって、外部から物事を見ると、時計はこれら2つのことを実行できるマシンです。それらを呼び出すpublicメソッド

しかし、この時計のコンストラクターとして、時間操作の前にディスプレイで23から11に切り替える必要があることを知っています(その種類の時計です)。そのためには、内部で少し変更する必要があります。 23から11に変更することは、どちらの場合でもうまく機能します-クロックを設定し、現在の時刻を表示します-しかし、ユーザーが知る必要がないので"side the side"を行います複雑な数学について。これらはプライベートメソッドです!

したがって、Clockクラスには、2つの publicメソッドshowTimeおよびsetTime)を含めることができます。これらはすべてユーザーwantsと、これらの publicメソッドに機能を提供するプライベートメソッド(recountTime)そして、ユーザーが見たくない.

したがって、一方で、プライベートは、が再実装されず、将来のプログラマーによってアクセスされないことを覚えておく必要がありますあなたのコードを使用します(上記の回答で指摘したように)。ただし、プライベートとは側で行われることも意味するため、ユーザーには見えません。そのため、パブリックメソッドを public interface と呼びます。ユーザーが外部から見るのはそれだけです。

私にとっては、(私が独学しているので、あまり人気のある方法ではないかもしれません...)ユーザー(実際のユーザーと他のクラス)が私のクラス(パブリックメソッドだけのパブリックインターフェイス)で行うすべてを書き留めておくと便利です'署名)、 I-the-implementer がユーザーに提供することを約束した公共の目標を達成するために使用するプライベートメソッドの署名を記述し、それをコードで実行する。

古いCルールはまだ有効であることに注意してください( 97すべてのプログラマが知っておくべきこと ):関数/メソッドはほんの数行の長さである必要があります! !

97
trzewiczek

プライベートメソッドは、タスクをより小さな部分に分割したり、クラス内の他のメソッドで頻繁に必要とされるがそのクラスの外部で呼び出されるべきではないコードの重複を防ぐのに役立ちます。

27
uckelman

メソッドは(また)コードを構造化するために使用され、実装の内部構造がインターフェースを介して漏洩することは望ましくありません。多くの場合、外部には単一のタスクを実行するように見えるメソッドがありますが、実際にはいくつかの小さなタスクを実行する必要があります。このような場合、サブタスクごとに1つの小さなプライベートメソッドを作成し、公開されているメソッドから呼び出します。

9
Thomas Lötzer

まったく同じ理由で、一部のメソッドはクラス内での使用のみを目的としており、クラス以外のオブジェクトによる使用は悪用されます。クラスのオブジェクトカウントをインクリメントおよびデクリメントするメソッドを考えてください。これらはクラスのコンストラクタまたはデストラクタからのみ呼び出す必要があり、プライベートである必要があります。

6
anon

プライベートなメソッドは、同じクラス内または同じ「モジュール」内のメソッドによってのみ呼び出すことができます。メソッドは一般にプライベートになりません。通常、子供たちがそれらを呼び出すことができるように保護されているか、他のコードがそれらを呼び出すことができるように公開されています。

場合によっては、メソッドを使用するその特定のクラスのみを使用して、他のクラスで使用されないように保護することもできます。

使用方法を示すための単なる例:

クラスClockがあり、それが実行され、時刻と日付を追跡して実行されます。パブリックメソッドを使用して、時刻または日付を取得できます。しかし、時計は正確でなければなりません。そのため、クラス外から時刻や日付を調整することはできません。ただし、時計自体は時刻を調整できる必要があります(たとえば夏時間)

この場合、Clockには時刻を調整するプライベートメソッドがあります。

また、追加のproがあります。これは、コードの構造化です。コードを構造化する小さなプライベートメソッドにコードを分割できますが、クラスの外部で使用されることはできません。

3
S.Hoekstra

他のすべての答えを念頭に置いて。プライベートメソッドは、多くの言語のプログラマにとってtipにすぎないことを覚えておく価値があります。ほとんどの場合、引き続きプライベートメソッドを使用できます。たとえば、プライベートメソッドを持つオブジェクトから継承し、そのメソッドを新しいパブリックメソッドでオーバーライドするオブジェクトを作成します。

一部の現代の高度なオブジェクト指向言語では、プライベートメソッドは慣例によってのみ存在します。先頭に「_」が付いているメソッドはプライベートであると見なされます。

1
smentek