2

オブジェクトを分割する正しい方法について質問があります。

Tool と Technology などの 2 つのオブジェクトがあるとします。テクノロジーはそれに関連付けられた複数のツール オブジェクトを持つことができますが、テクノロジーがツールについて直接知ることは、凝集度が低い/緊密な結合と見なされますか? Technology オブジェクトに Tool オブジェクトの配列を含めるのは悪い習慣ですか、それともそれらを結び付ける何らかの種類の第 3 クラスが必要ですか?

Tool
private id;
private title;

Technology
private id;
private title;
private tools;

オブジェクト同士を関連付けるのに最適な方法について、簡単な概要を説明していただけますか? 一見、私には問題ないように思えますが、Tools を追加するための getter/setter メソッドを Technology オブジェクトに持たせることは本当に適切でしょうか?

4

4 に答える 4

3

オブジェクトがTechnology必要な場合は、それらを保持しても問題はありません。Tool

Tools がオブジェクトの状態に関連している場合Technologyは、その中にそれらを含める必要があります。

関連する可能な方法:

public addTool(Tool $tool);
public removeTool(Tool $tool);
public removeToolByIndex($index);
public getToolFromIndex($index);
于 2012-07-20T14:47:54.750 に答える
1

私は決して OOP の専門家ではありませんが、それはドメインに依存していると言えます。あなたのドメインがテクノロジーを扱っていて、それがツールを扱っている場合、テクノロジーにツールの配列があっても問題ないと思います。私がしたいことは、すべてのツール オブジェクトが同じインターフェイスに準拠するようにすることです。これにより、どのテクノロジでも任意のツールを使用できるようになります。

また、私が学んだことから、レイヤー(ドメイン、永続性、サービスレイヤー...)をまたいでいる場合、デカップリングが重要であると思います。したがって、レイヤーは別のレイヤーに依存するべきではありませんが、ドメイン オブジェクトは相互に依存できます。

エンティティが別のエンティティに依存するドメインをモデル化している場合、オブジェクトも互いに依存します (テクノロジーがツールなしでは役に立たない場合、それはそれらに依存します)。一般的な車/ホイール/ドライバーの例を挙げると、車は実世界のホイールとドライバーの両方に依存しているため、オブジェクトが欠落しているとまったく役に立たないため、オブジェクトはそうします。

これが理にかなっているといいのですが、間違っていた場合は、他の人からも何かを学びます.

于 2012-07-20T14:50:05.217 に答える
0

あなたが与えた例は多対多の関連付けであるため、3d オブジェクトを使用して関連付けを表す方が適切です。進行中の場合(1対多)、あなたが述べたように単純な構成で問題ありません。

以下はサンプル コードです。コードで行うことができるいくつかの改善点 1. ツールとテクノロジのゲッター セッターを実装し、変数を非公開にします。2. Tools & Technology のクラスではなくインターフェイスを直接使用します。3. ペア クラスで 2 つの異なるインデックス (配列) を使用して、get 関数のパフォーマンスを向上させました。パフォーマンスが問題にならない場合は、1 つの配列を使用できます。

<?php
class Technology{
    public  $id;
    public  $title;

    public function __construct($id, $title){
        $this->id = $id;
        $this->title = $title;
    }
}

class Tool{
    public $id;
    public $title;

    public function __construct($id, $title){
        $this->id = $id;
        $this->title = $title;
    }
}

class TechnologyToolPair{
    private $techIndex = array();
    private $toolIndex = array();

    //Index by id, you can replace title if u maily search by title
    public function addPair($tech, $tool){
        $this->techIndex[$tech->id]['technology'] = $tech;
        $this->techIndex[$tech->id]['tool'][] = $tool;

        $this->toolIndex[$tool->id]['tool'] = $tool;
        $this->toolIndex[$tool->id]['technology'][] = $tech;
    }

    public function getByTechnologyId($id){
        return $this->techIndex[$id];
    }

    public function getByToolId($id){
        return $this->toolIndex[$id];
    }

    public function getByTechnologyName($name){
        foreach($this->techIndex as $index => $value){
            if(!strcmp($name, $value['technology']->title)){
                return $value;
            }
        }
    }
}


$tech1 = new Technology(1, 'php');
$tech2 = new Technology(2, 'java');

$tool1 = new Tool(1, 'eclipse');
$tool2 = new Tool(2, 'apache');
$tool3 = new Tool(3, 'tomcat');

$pair = new TechnologyToolPair();
$pair->addPair($tech1, $tool1);
$pair->addPair($tech1, $tool2);
$pair->addPair($tech2, $tool1);
$pair->addPair($tech2, $tool3);

var_dump($pair->getByToolId(1));
var_dump($pair->getByTechnologyId(2));
var_dump($pair->getByTechnologyName('java'));
于 2012-07-21T07:49:26.900 に答える
0

データだけでなく、ツールとテクノロジーの間の動作と相互作用に注目する必要があります。これにより、OOP でモデル化する方法が決まります。あなたは現在データモデリングを行っており、オブジェクト指向はより良いモジュール化を提供するはずです。テストから設計を推進し、それらがどのように使用されているかを示すことができます。

于 2013-11-05T15:11:29.773 に答える