リチャード・ガブリエルの 「悪い方が良い」の台頭 で、彼はインターフェースの単純さと設計の実装の単純さについて話します。
私は彼が何を意味するのかを完全に理解することができず、答えをWebで検索しても、Javaのインターフェース(クラスの構造など)とJavaのメソッドおよびクラスのコードに関する情報しか得られませんでした。
彼はインターフェースと実装とはどういう意味ですか、そしてそれらのそれぞれにとって単純さはどういう意味ですか?
彼はインターフェースと実装とはどういう意味ですか、そしてそれらのそれぞれにとって単純さはどういう意味ですか?
それについてあまり考えないでください、それはただの英語です。
彼はあなたのコードの インターフェース (必ずしも インターフェース !)-人々があなたのコードをどのように扱うかを意味します。そして、コードの 実装 -コードが実際に必要なことをどのように実行するか。そして、シンプルは シンプル -あなたのものは扱いやすいです。
インターフェースのシンプルさは、あなたのものを使いやすいことを意味します。あなたの関数は、明らかなパラメーターといくつかの副作用を持つ良い名前を持っていますか?彼らはあなたのユーザーが必要とすることをしますか?あなたのクラスには明らかな機能を備えた良い名前がありますか?彼らはあなたのユーザーが必要とすることをしますか?あまり問題なく?
実装が単純であるということは、プログラマー(またはあなた)があなたのものを作業するのが簡単であることを意味します。コードを簡単に変更できますか?簡単にテストできますか?分かりますか?デバッグしますか?
単純な実装では単純なインターフェースが得られることがよくありますが、常にそうであるとは限りません。最良の設計のいくつかは、単純なインターフェースの背後にある必然的に複雑な実装のビットを分離します。同様に、最も簡単な実装がユーザーに必要なものではない場合、複雑なインターフェイスになってしまう可能性があります。
このページでは、特定のプログラミング構造を参照せずに、これらの用語を文字通り使用しているようです。したがって、定義するものは実際にはありません。代わりに、例を挙げてみます。
インターネットから物事を取得するクラスがあるとします。簡単なインターフェースバージョンは次のとおりです。
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のページでは、常にそうであるとは限らないと主張しています。