OOP内聚/耦合混淆

时间:2012-07-20 14:39:12

标签: php oop

我对分割物体的正确方法有疑问。

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

Tool
private id;
private title;

Technology
private id;
private title;
private tools;

您是否可以简单地概述如何将对象相互关联?乍一看似乎对我来说没问题,但是对于一个Technology对象来说,使用getter / setter方法来添加工具是否真的合适?

4 个答案:

答案 0 :(得分:3)

如果Technology需要Tool个对象,保留它们没有任何问题。

如果ToolTechnology对象状态相关,则应将其包含在其中。

相关可能的方法:

public addTool(Tool $tool);
public removeTool(Tool $tool);
public removeToolByIndex($index);
public getToolFromIndex($index);

答案 1 :(得分:1)

我绝不是OOP的专家,但我会说这取决于你的域名。如果您的域正在处理技术,而这些技术又处理工具,那么我会说在工具中使用工具阵列是可以的。我要做的是让每个工具对象都符合相同的界面,这样任何技术都可以拥有任何工具。

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

如果您正在为一个实体依赖另一个实体的域建模,那么这些对象也将相互依赖(如果没有它的工具,技术是无用的,那么它取决于它们)。要采用常见的汽车/车轮/驾驶员示例,汽车在现实世界中依赖于车轮和驾驶员,所以对象将会,因为如果它们丢失则完全没用。

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

答案 2 :(得分:0)

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

下面是示例代码,可以在代码中进行一些改进 1.实施Tool& amp; getter setter技术并使变量变得私密。 2.使用接口代替类直接用于工具和工具。技术。 3.在对类中使用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'));

答案 3 :(得分:0)

您应该看看工具和技术之间的行为和交互,而不仅仅是数据。这决定了如何在OOP中建模。您目前正在进行数据建模,面向对象应该可以提供更好的模块化。您可能希望从测试中推动设计,显示它们的使用方式。