2012-02-23 88 views
1

这是我当前类我应该如何避免代码冗余,在多个类别

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等的功能可能改变。

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

+0

http://stackoverflow.com/a/2994767/259457 – Travesty3 2012-02-23 17:25:13

+0

退房工厂模式:HTTP://en.wikipedia。org/wiki/Factory_object – 2012-02-23 17:27:30

回答

3

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

这就是inheriance­Docs是:

您定义Templates型每它interface­Docs

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

您创建一个基本的模板(我称之为TemplatesBase)是Templates型的每接口的实现。你可以开始编写实际的代码在这里进入功能:

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.'); 
     } 
} 
+2

您也许希望将'TemplatesBase'定义为'abstract'。取决于基础模板是否可以在没有由子类提供的更多特定功能的情况下使用。 – Vitamin 2012-02-23 17:46:31

+0

您可以更清楚一点为什么您选择抽象类而不是基类 – Tarun 2012-02-23 19:23:23

+0

抽象允许更多地控制从它扩展的类,但是您不需要使基类抽象化。你可以完全自己决定。通常这样做很常见,所以它仍然是一个永远不能直接实例化的基本类型。这通常是需要的那种控制。很明显这是一个基础,显然它在那里用于扩展,所以很明显它包含基本代码,如* template *。这也是一种模式:[模板方法模式](http://en.wikipedia.org/wiki/Template_method_pattern) – hakre 2012-02-23 19:41:10

0

与其他编程语言一样。如果在整个程序中多次使用完全相同的代码块,则将其置于其自身的功能中。

+0

如果我在所有这些类中创建函数,它将导致代码冗余 – Tarun 2012-02-23 17:22:54

0

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

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

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

0

使用继承。

创建一个BaseTemplate类。实现该基类中的公共逻辑(即冗余方法)。所有其他模板应该扩展BaseTemplate类。

0

你要求的是继承和功能覆盖的原因。没有必要过分复杂的事情:

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 
    } 
}