0

PHPで記述されたDroidAPIの設計と実装を手伝いました。それは問題なく動作しますが、私は常にコードをリファクタリングしようとしています。

共通の祖先を持つ他のオブジェクト内にオブジェクトを持っていても大丈夫ですか?

これは初歩的な質問かもしれませんが、これが悪い習慣であるかどうかを裏付ける情報を見つけることができないようです。

目標は、クラスfooにすべての人に共通の定数とメソッドを提供させることです。

例:

            abstract class foo {
             //constants
             //common methods to all
            }

            class bar extends foo{
             //represents something
            }

            class widget extends foo {
             //represents something else
            }

            class controller extends foo{
                //controls flow
                public function __construct(){
                    $this->my_bar= new bar();
                    $this->my_widget= new widget();
             }
            }

クラスバーとウィジェットはfooを拡張する必要がない場合がありますが、これらのオブジェクト内のメソッドは、パラメーターを送信せずにfooが知っている一般的なことを認識しません。

ベストプラクティスを探しているだけで、冗長性が多すぎるようです。

4

2 に答える 2

1

アプリケーションにとって意味がある場合は、問題はありません。

例として、これはまさにPHPのDOMライブラリの構造です。ドキュメント、要素、属性、文字データなど、ほとんどすべてがノードです。DOMNodeそれらはすべて、互いにネストされていても、祖先を共有します。

したがって、それが本当に理にかなっている場合(抽象的な例ではわかりにくい)、そうしない理由はまったくありません。実際、さまざまなオブジェクトが機能を共有している場合、それはおそらく「ベストプラクティス」になります。

于 2012-06-21T18:16:51.467 に答える
1

フレームワークを作成するには、転倒して立ち直るまでの多くの試行が必要です。

あなたの質問について最も重要なことは、リスコフの置換原則が説明する罠に陥らないようにすることです。

「それがアヒルのように鳴き、アヒルのように見えるが電池が必要な場合、それはアヒルである可能性がありますが、おそらくそうではありません。」</ p>

リスコフの原則は単純です。何かを拡張するときに、クラスの契約を変更しないようにしてください。クラスが関数で何かを返すために使用され、それを拡張して根本的に異なるものを返す場合、ユーザーはどのように適応するかを知ることができますか?拡張する基本クラスとして識別するクラスを提供しているため、再利用性の目的を無効にしていますが、機能が追加された基本クラスのようには動作しません。

私が最も提案するのは、クラス階層を可能な限り現実的にしようとすることですが、常にSOLIDの原則を覚えておいてください。SOLIDの詳細については、次のブログをご覧ください。

http://crazycoders.net/2012/03/confoo-2012-make-your-project-solid/

幸運を

于 2012-06-21T18:20:36.913 に答える