2

我对拆分对象的正确方法有疑问。

假设我有两个对象,例如工具和技术。一个技术可以有多个与之关联的工具对象,但它是否被认为是低内聚/紧密耦合让技术直接了解一个工具?让 Technology 对象包含一组 Tool 对象是不好的做法,还是应该有某种第三类将它们联系在一起?

Tool
private id;
private title;

Technology
private id;
private title;
private tools;

您能否提供一个简单的概述,说明如何最好地将这些对象相互关联?乍一看,这对我来说似乎没问题,但是技术对象具有用于添加工具的 getter/setter 方法真的合适吗?

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 方面的专家,但我会说这取决于您的领域。如果您的领域正在处理技术而反过来处理工具,那么我会说在技术中拥有一个工具阵列是可以的。我要做的是让每个工具对象都符合相同的接口,这样任何技术都可以拥有任何工具。

此外,根据我所学到的,我认为当你跨越层(域、持久性、服务层......)时,解耦很重要。所以一个层不应该依赖于另一个层,但是你的领域对象可以相互依赖。

如果您正在对一个实体依赖于另一个实体的域进行建模,那么对象也将相互依赖(如果一项技术没有工具就毫无用处,那么它就依赖于它们)。以常见的 Car/Wheel/Driver 为例,在现实世界中,汽车同时依赖于车轮和驾驶员,因此对象也会如此,因为如果它们丢失了,它就完全没用了。

我希望这是有道理的,如果我弄错了,那么我也会从别人那里学到一些东西。

于 2012-07-20T14:50:05.217 回答
0

您给出的示例是多对多关联,因此最好使用 3d 对象来表示关联。如果它在路上(一对多),那么你提到的简单组合就可以了。

下面是示例代码,可以在代码 1 中进行一些改进。为工具和技术实现 getter setter 并将变量设为私有。2. 直接为工具和技术使用接口而不是类。3.在pair类中使用2个不同的索引(数组)来提高get函数的性能,如果不关心性能,那么你可以只使用一个数组。

<?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 回答