创建包含私有方法的多个类似公共方法是不好的做法?

时间:2014-08-13 14:29:30

标签: php class oop object architecture

我有这个类通过接收某些域对象来执行带副作用的子程序。

这些域对象是不同的类,但它们有一些相似之处。我想知道如何在制作许多公共方法的过程中构建服务,这些公共方法使用参数包装私有方法,或者只使用一个带有更多参数的公共方法。

案例一:

class MyService {
     private MethodWithManyParameters($a, $b, $c, $d, $similarParameterA, $similarParameterB)   {
          // do things
          if ($similarParameterA == $objectTypeA) {
               // code
          }
          else if ($similarParameterB == $objectTypeB) {
               // other really similar code
          }

     }


     public DoThingsWithObjectA($a, $b, $c, $d) {
          // $this->MethodWithManyParameters($a, $b, $c, $d, $objectTypeA, $variableA);
     }

     public DoThingsWithObjectB($a, $b, $c, $d) {
          // $this->MethodWithManyParameters($a, $b, $c, $d, $objectTypeB, $variableB);
     }
}

// application code
MyService->DoThingsWithObjectA(...);
MyService->DoThingsWithObjectB(...);

案例二

class MyService {
     public DoThingsWithObject($a, $b, $c, $d, $similarParameterA, $similarParameterB)   {
          // do things
          if ($similarParameterA == $objectTypeA) {
               // code
          }
          else if ($similarParameterB == $objectTypeB) {
               // other really similar code
          }
     }
 }

 // application code
 MyService->DoThingsWithObject(........); // this one has a bigger argument list

我正在考虑两种方法的利弊。

第一种方法:

优点:   - 简化的应用程序代码,在使用大量参数的情况下,它可以删除一些

缺点:   - 引入了更多耦合,因为如果引入了objectC,那么还必须更改MyService以适应它

第二种方法:

优点:   - 使用较少方法的简化类   - 更灵活

缺点:   - 当你必须处理对象之间的差异时,参数列表可能会更大

现在似乎只有一个公共函数是好的,但第二种方法起初看起来更干净,因为它更抽象地处理事情。

有什么我想念的吗?

2 个答案:

答案 0 :(得分:1)

突出的主要问题是在任何一种情况下都使用if, elseif。在面向对象的设计中,这几乎总是抽象出代码的情况:

abstract class MyService
{
    abstract public function doThingsWithObject($a, $b, $c, $d);
}

class ObjectA extends MyService
{
    public function doThingsWithObject($a, $b, $c, $d)
    {
        print "Implementation for ObjectA";
    }
}

class ObjectB extends MyService
{
    public function doThingsWithObject($a, $b, $c, $d)
    {
        print "Implementation for ObjectB";
    }
}

然后使用代码:

$objectA = new ObjectA();
$objectB = new ObjectB();

$objectA->doThingsWithObject($a, $b, $c, $d); // Implementation for ObjectA
$objectB->doThingsWithObject($a, $b, $c, $d); // Implementation for ObjectB

答案 1 :(得分:1)

没有。事实并非如此。

检查一个非常常见的案例:

class ConsoleClass {

     protected /* void */ InternalWrite(/* string */ $SomeValue)   {
          // do things
     } // void InternalWrite(...)

     public /* void */ WriteStr(/* string */ $SomeValue) {
          InternalWrite($SomeValue);
     }

     public /* void */ WriteInt(/* int */ $SomeValue) {
          $SomeString = (string)$SomeValue;
          InternalWrite($SomeString);
     }

     public /* void */ WriteArray(/* array */ $SomeValue) {
          $SomeString = "";

          $SomeString .= "[";
          foreach ($SomeValue as $index => $value)
          {
            $SomeString .= (string)$value;
            $SomeString .= ",";
          } // foreach
          $SomeString .= "[";

          InternalWrite($SomeString);
     }

} // class

// application code
$Console = new ConsoleClass()

$Console->WriteStr("Hello World");
$Console->WriteInt(5);
$Console->WriteArray(array(1, 2, 3, 4, 5));

只需2美分。

[更新:]已更改"私人"到"受保护"。