2016-08-07 2 views
1

Openerのクラスまたはインタフェース(問題ありません)は、public open(Openable<T> item)というメソッドがあります。 Bag,Window,DoorはすべてOpenableインターフェイスを実装しているため、すべて開くことができるためです。-ableで終わるインタフェースのメソッド命名規則

質問:Openableインターフェイスでメソッドをどのように指定する必要がありますか?私がそれをvoid open()と名づけば、これはOpenableである全てのオブジェクトが開けられることを暗示します。これは真実ではなく、OpenerだけがOpenableのオブジェクトを開くことができます。

+2

もし 'Openable'が単一の' open'メソッドを持つのと同じくらい簡単なら、なぜあなたは 'Opener'を必要としますか? –

+0

'オープナー'はオープンするために 'オープン 'とどうやりとりしますか? 'Openable'で' open'メソッドしか呼び出していない場合、なぜ 'Opener'が必要ですか? – plalx

答えて

2

インターフェイスは契約です。クラスがインターフェースを実装する場合、これはクラスがインターフェースに記述されているすべての操作を完全にサポートしていることを意味します。 (これはではありませんが、常にの場合です)。タイトルのステートメントについて:一般的に、名前が「-able」で終わるすべてのインターフェイスは、クラスを何かできることとしてマークします。例:Runnableを - run()、実行 -​​、同等 - compareTo()など

A)

public interface Openable { 
    void open(); 
} 

上記インタフェースが実際にそれを実装する任意のクラスを開くことができることを意味するものではないに関係なく、コールコンテキストの。それは必ずしもオブジェクトが開くことを意味するわけではありませんが、それはポイントではありません。

の@ sgj88_によって提案されているように、次のことを考えてみます。

B)

public interface Openable { 
    void open(Opener opener); 
} 

あなただけOpenerOpenableオブジェクトを開くことができると述べているので、理論的にはこれは良いオプションです。 (理想的には、オブジェクトは他のオブジェクトではなく自分の内部構造を変更するだけです)。しかし実際には、Openerは振る舞いを変更するオブジェクトのように振る舞います。

public interface Opener { 
    // or something similar 
    double fractionToOpen(); 

    Opener FULL_OPENER =() -> 1.0; 
    Opener HALF_OPENER =() -> 0.5; 
} 

この理由は、名前はそれがないことを示唆しながらOpenerは、その状態を変更するために、Openableの内部については何も知らないということです。 open()Openerにありません。最初はOpenerが必要ないためです。したがって、設計と実装のセマンティクスは一致しません。

C)

のみOpenerタイプは、それらを開くことができるので、open()にちょうど単一の呼び出しよりOpenableの状態を変更する複数の方法があると仮定することができます。 次に、Openableは、その内部状態を変更するためのより多くの方法を必要とする。

setOpenRate(), setOpenFraction()など

このケースではありませんし、質問には、すなわち、コール特権を参照している場合open()が使用できる単一のクラスOpenerが存在する場合、それはインタフェースであってはなりません。

おそらく、インターフェイスが設計されているいくつかのコンテキストがあれば、最適なオプションを特定するのに役立つでしょう。

+0

プログラミングでは、Openableのようなインターフェースは、それを実装するクラスが、私が理解したように、何かを開くことができることを意味します。英語では、オブジェクトを開くことができるという意味です。混乱を少なくするために、インタフェース名をOpenableからOpenerに変更する方が良いとは限りません。また、 'open'を呼び出すオブジェクトには、何かを開くことができるという明示的なインタフェースを持つ必要はなく、' open'メソッドの引数だけです。 –

+0

いいえ、あなたの最初の考えは正しいです。例、Window implements Openableは、window.open()を呼び出してウィンドウを開くことができることを意味します。 open()の呼び出しは、ウィンドウの内部状態を変更します。これは、open()がウィンドウによって実装されているためです。元のケースでは、クラスオープナーは、ウィンドウの内部状態を変更できることを暗に示していますが、実際にはそうではありません。したがって、技術的にクラスのオープナー(このケースでは)が多く指摘しているように、 – AlmasB

2

void openWithOpener()とします。 あなたは1つのOpenerに縛られておらず、Openableのオブジェクトを開くことができます。

+0

私は方法は誰が彼を呼び出すのか分からないので、良いとは思わない。しかし、今では、それだけで、「オープナー」だけが私に電話をかけることができます。 –

+0

あなたはそこにポイントを持っています。 'Openable'オブジェクトはオープンできますが、オープンすることはできません。' Openable#open() 'は' Openable'オブジェクトの 'オープン'ステータスを扱ってはいけませんか?言い換えれば、メソッドは 'boolean isOpen()'で、 'open'の名詞形式を扱い、 'Opener'に動詞を' open 'のままにしなければならないかもしれません。 –