改进PHP中的类结构而不是使用多重继承
我有一个设计问题,我的课程是这样设置的:改进PHP中的类结构而不是使用多重继承,php,oop,design-patterns,inheritance,Php,Oop,Design Patterns,Inheritance,我有一个设计问题,我的课程是这样设置的: abstract class Advertiser abstract class AdvertiserCampaign | | | | class AdvUno extends Advertiser class AdvUnoCampaign extends Advertiser
abstract class Advertiser abstract class AdvertiserCampaign
| |
| |
class AdvUno extends Advertiser class AdvUnoCampaign extends AdvertiserCampaign
class AdvDos extends Advertiser class AdvDosCampaign extends AdvertiserCampaign
class AdvTre extends Advertiser class AdvTreCampaign extends AdvertiserCampaign
问题在于AdvUno
和AdvUnoCampaign
都需要一种特殊的身份验证方法,而其他方法则不需要这种方法。现在我已经把它放在了AdvUno
中,但是同样地,AdvUnoCampaign
也需要它(以及其他一些以这种方式设置的类)
- 我不能让
extendAdvUnoCampaign
,因为PHP中没有多重继承,但也因为它通常不是一个好的、干净的设计实践AdvUno
- 如果我让
扩展广告客户活动
,那么下面的所有扩展类(广告客户
,AdvUnoCampaign
,等等)都必须实现一组与他们无关的抽象方法,并且这些方法已经在每个AdvDosCampaign
类中实现广告客户
AdvOne
类中。任何帮助或建议都将不胜感激。谢谢 被认为是一种代码味道,应该进行重构
Martin Fowler在“重构”中建议:
消除重复的一般策略是确保
层次结构指的是另一个层次结构的实例。如果使用移动方法和移动字段,则层次结构
在引用类上,引用类消失
但我认为你可以更进一步。我不知道,你的决定是基于什么为每个广告商和他们的活动制作子类,但我会质疑这个决定。要遵循的一个好习惯是
你可以这样开始:
class Advertiser
{
protected $authentication;
}
class AdvertiserCampaign
{
protected $authentication;
}
interface AdvertiserAuthentication
{
}
class SpecialAuthenticationForAdvertiserUno implements AdvertiserAuthentication
{
}
class NoSpecialAuthenticationForOtherAdvertisers implements AdvertiserAuthentication
{
}
现在,广告商之间的第一个区别被转移到另一个类别。继续进行其他差异,直到每个广告客户只是以不同方式组成的
广告客户的对象。竞选活动也是如此。我想说得更具体一些,但如前所述,我不知道为什么你们的广告商首先都有自己的课程。一般来说,为了解决与你们类似的问题,桥梁设计模式是常用的
DI浮现在脑海中。也许读一下这些线程:,,当然Fowler对模式总是很好:嗯,我知道并行类层次结构是一种气味。然而,在这种情况下,我这样做是因为“has-a”关系并不稳固。无论如何,这是一个复杂的案例。如果我现在的选择不太正确,我很乐意在路径变得更加清晰之后重构。现在,我做了一些与您建议的非常类似的事情,我创建了一个广告商身份验证
对象,该对象注入了所有必要的信息,每个“Uno”广告商对象都有一个。