我有一组继承功能的类,具体取决于它们的功能。它们是屏幕元素:
一些例子是:
ScreenElement_Text_Area extends ScreenElement_Text extends ScreenElement
ScreenElement_Text_Text extends ScreenElement_Text extends ScreenElement
ScreenElement_Date_ddmmyyyyhhmm extends ScreenElement_Date extends ScreenElement
继承使我能够指定不同的行为(HTML代码,样式,验证)而无需重复自己。琐碎的例子:
ScreenElement::getTitle()
ScreenElement::getValue()
ScreenElement_Text::getMaxChars()
ScreenElement_Text_Money::getCurrency()
问题是这些类现在被用于不同于它们最初预期的上下文中(它描述了表单的一部分):例如,作为表中的列或描述出现在日历中的信息。每个上下文都为其他用法不需要的类添加方法和属性。例如:
在表格中使用时:getFormElement()
在表格中使用时:calculateColumnWidth()
在日历中使用时:getStartTime()
我现在问自己如何减少日益增加的复杂性!我喜欢更小,更专业的课程,但不想增加课程数量,也不想重复代码,但我无法理解这一点。
答案 0 :(得分:2)
避免操纵过于复杂的结构的解决方案可能是使用Facade pattern。也就是说,例如:添加接口IScreenElement_Text_Area_Form
,IScreenElement_Text_Area_Table
和IScreenElement_Text_Area_Calendar
。
让ScreenElement_Text_Area
实现这3个接口,但只在给定的上下文中使用最相关的接口。
这样,表单只会通过ScreenElement_Text_Area
操纵IScreenElement_Text_Area_Form
,因此它只能访问getFormElement()
,而不能访问其他两种方法。
话虽如此,这只是一种可能的解决方案。例如,您也可以查看composition over inheritance。