【问题标题】:How should I avoid code redundancy with in multiple classes我应该如何避免多个类中的代码冗余
【发布时间】:2012-02-23 17:18:04
【问题描述】:

这是我当前班级的骨架

class JokeTemplates
{
      public function CheckTemplateCategory()
      {
      }

      public function SubmitUserTemplates()
      {
      }

      Public function ShowUserUploadedTemplates()
      {

      }

      public function ShowUSerFOrwardedTemplates()
      {
      }

      public function ShowAllTemplates()
      {
      }
}

将来我可能需要设计很多这样的类,比如 LoveTemplates、FriendshipTemplates、BirthdayTemplates..etc 其中 SubmitUserTemplates、ShowUserUploadedTemplates、ShowUSerFOrwardedTemplates 等一些函数可能保持不变,而 ShowAllTemplates、CheckTemplateCategory 等一些函数的功能可能会发生变化。

如果我在所有类中创建所有函数(复制粘贴),这将导致大量代码冗余。 我应该如何设计我的代码以减少冗余。

【问题讨论】:

标签: php dry


【解决方案1】:

如果我在所有类中创建所有函数(复制粘贴),则会导致大量代码冗余。我应该如何设计我的代码以减少冗余。

这就是inheriance­Docs 的用途:

您根据 interface­Docs 定义 Templates 类型:

Interface Templates
{
      public function CheckTemplateCategory();
      public function SubmitUserTemplates();
      Public function ShowUserUploadedTemplates();
      public function ShowUSerFOrwardedTemplates();
      public function ShowAllTemplates();
}

您根据接口的实现创建一个类型为Templates 的基本模板(我称之为TemplatesBase)。您可以在此处开始将实际代码写入函数:

class TemplatesBase implements Templates

或者with abstraction­Docs:

abstract class TemplatesBase implements Templates
{
      public function CheckTemplateCategory()
      {
          ...
      }

      public function SubmitUserTemplates()
      {
      }

      Public function ShowUserUploadedTemplates()
      {
      }

      public function ShowUSerFOrwardedTemplates()
      {
      }

      public function ShowAllTemplates()
      {
      }
}

最后你可以从那个类扩展,只添加你需要的功能:

class JokesTemplates extends TemplatesBase
{

      public function ShowUSerFOrwardedTemplates()
      {
          throw new TemplatesException('Jokes Templates don't support USerFOrwardedTemplates.');
      }
}

【讨论】:

  • 您可能希望将TemplatesBase 定义为abstract。取决于是否可以在没有子类提供的更具体功能的情况下使用基本模板。
  • 能否请您更清楚地说明为什么选择抽象类而不是基类
  • Abstract 允许对从它扩展的类进行更多控制,但您不需要使基类抽象。您可以完全自行决定。通常这样做很常见,因此它仍然是永远不能直接实例化的基本类型。这通常是我们想要的那种控制。很明显它是一个基础,很明显它是用于扩展的,所以很明显它包含像 template 这样的基本代码。这也是一种模式:Template method pattern
  • 非常感谢,但最后一个问题是,如果我的笑话模板类正在扩展另一个名为 Model 的类。
  • PHP 只支持单继承。如果模板也是Model,那么您需要创建一个扩展Model 以及class TemplatesModelBase extends Model implements Templates 的基类。但是正如您所看到的,扩展可能会使事情变得不安。您可能正在寻找像Decorator Pattern 这样更松散的耦合,最好在使用extend 之前三思而后行:模板真的需要成为模型吗?为什么呢?你可能不想要任何Models 但ValueObjects 你可以传递... ;)
【解决方案2】:

与任何其他编程语言一样。如果在整个程序中多次使用完全相同的代码块,请将其放入自己的函数中。

【讨论】:

  • 同样的代码块也在所有其他类中重复,如果我在所有这些类中创建函数,将导致代码冗余
【解决方案3】:

如果你使用它作为主类。并使用其他类来扩展它。除非它们自己定义,否则它将使用主类中的函数。

例如如果您将 ShowallTempates() 放入扩展示例的类中,它将使用该类而不是示例中的类。如果您不定义它将使用您示例中的那个。

如果他们必须定义这些字段,请使用抽象类。

【讨论】:

    【解决方案4】:

    使用继承。

    创建一个 BaseTemplate 类。在这个基类中实现通用逻辑(即冗余方法)。所有其他模板都应该扩展 BaseTemplate 类。

    【讨论】:

      【解决方案5】:

      您所要求的正是继承和函数覆盖的原因。无需将事情过度复杂化:

      class TemplatesBase
      {
          public function checkTemplateCategory()
          {
              return "Base";
          }
      
          public function submitUserTemplates()
          {
              // ...
          }
      
          public function showUserUploadedTemplates()
          {
              // ...
          }
      
          public function showUserForwardedTemplates()
          {
              // ...
          }
      
          public function showAllTemplates()
          {
              // show all templates
          }
      }
      
      class JokeTemplates extends TemplatesBase
      {
          public function checkTemplateCategory()
          {
              return "Jokes";
          }
      
          public function showAllTemplates()
          {
              // show all joke templates
          }
      }
      
      class LoveTemplates extends TemplatesBase
      {
          public function checkTemplateCategory()
          {
              return "Love";
          }
      
          public function showAllTemplates()
          {
              // show all love templates
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多