web-dev-qa-db-ja.com

インターフェイスのシンプルさと実装のシンプルさを定義する

リチャード・ガブリエルの 「悪い方が良い」の台頭 で、彼はインターフェースの単純さと設計の実装の単純さについて話します。

私は彼が何を意味するのかを完全に理解することができず、答えをWebで検索しても、Javaのインターフェース(クラスの構造など)とJavaのメソッドおよびクラスのコードに関する情報しか得られませんでした。

彼はインターフェースと実装とはどういう意味ですか、そしてそれらのそれぞれにとって単純さはどういう意味ですか?

1
Drake Sobania

彼はインターフェースと実装とはどういう意味ですか、そしてそれらのそれぞれにとって単純さはどういう意味ですか?

それについてあまり考えないでください、それはただの英語です。

彼はあなたのコードの インターフェース (必ずしも インターフェース !)-人々があなたのコードをどのように扱うかを意味します。そして、コードの 実装 -コードが実際に必要なことをどのように実行するか。そして、シンプルは シンプル -あなたのものは扱いやすいです。

インターフェースのシンプルさは、あなたのものを使いやすいことを意味します。あなたの関数は、明らかなパラメーターといくつかの副作用を持つ良い名前を持っていますか?彼らはあなたのユーザーが必要とすることをしますか?あなたのクラスには明らかな機能を備えた良い名前がありますか?彼らはあなたのユーザーが必要とすることをしますか?あまり問題なく?

実装が単純であるということは、プログラマー(またはあなた)があなたのものを作業するのが簡単であることを意味します。コードを簡単に変更できますか?簡単にテストできますか?分かりますか?デバッグしますか?

単純な実装では単純なインターフェースが得られることがよくありますが、常にそうであるとは限りません。最良の設計のいくつかは、単純なインターフェースの背後にある必然的に複雑な実装のビットを分離します。同様に、最も簡単な実装がユーザーに必要なものではない場合、複雑なインターフェイスになってしまう可能性があります。

4
Telastyn

このページでは、特定のプログラミング構造を参照せずに、これらの用語を文字通り使用しているようです。したがって、定義するものは実際にはありません。代わりに、例を挙げてみます。

インターネットから物事を取得するクラスがあるとします。簡単なインターフェースバージョンは次のとおりです。

class Internet {
    int sendRequest(const std::string& url, std::string& response);
}

Internet::sendRequest(const std::string& url, std::string& response) {
    // parse the url into its various tokens
    m_protocol = /* first token, or https if not provided */
    m_domain = /* second token */
    while(...) { m_parameters.Push_back(/* another token */); }
    ...
    switch(m_protocol) {
        case HTTPS: HTTPSImpl.request(m_domain, ...); break;
        ...
    }
}

簡単な実装バージョンは次のとおりです。

class Internet {
    int setProtocol(Internet::Protocol protocol);
    int setDomain(const std::string& domain);
    int addParameter(...);
    ...
    int sendRequest(std::string& response);
}

Internet::request(std::string& response) {
    switch(protocol) {
        case HTTPS: HTTPSImpl.request(m_domain, ...); break;
        ...
    }
}

基本的に、これは、実装者に複雑さを処理させることと、インターフェイスユーザーを処理させることの間のトレードオフです。ほとんどの場合、ユーザーから複雑さを隠すことは良いことだと(当然のことながら)言われますが、Richard Gabrielのページでは、常にそうであるとは限らないと主張しています。

1
Ixrec