我继承了一个长期维护代码库,它有两个截然不同的iPhone和iPad视图。这创建了一个大的UIViewController类,它已经膨胀到超过1k行代码,是ISIPAD语句、私有变量、属性、iBOutlet/动作的混搭,例如,对一个实现使用UITableView,对另一个实现使用完全不同的东西。
更糟糕的是,当前的软件模式依赖于子类化。
目前我们看起来是这样的:
ParentVC (both iphone/ipad God class also has xib(xib~ipad) + iboutlets/actions)
| | |
ChildA ChildB ChildC我最初的想法是把ParentVC分成专门的iPhone/iPad类
ParentVCBase
| |
ParentVC_iPad(xib~ipad) ParentVC_iPhone(xib)
| |
ChildA/B/C_iPad ChildA/B/C_iPhone并通过工厂调用输出正确的子类。
我遇到的问题是,每个子类重写了几个ParentVC方法调用,并实现了它自己的功能特定的方法,这些方法不是特定于设备的(请记住,原始子类化的主要目标是共享视图布局)。只有当我为ChildA_iPhone和ChildB_iPad复制代码时,这种设计模式才会起作用。我宁愿避免这种情况,因为我已经用一种反模式换了另一种。
我有点不知所措。我几乎考虑过在运行时创建Child类(objc/runtime.h),从引用Child类中替换所需的Child方法,但这看起来并不比我们现在的混乱。为了简单的清理,我还考虑保留ParentVC头(以及它的IBOUTlets、属性等的大列表),并将设备特定的方法分类,以便至少在需要真正重构的那一天之前将功能分开。
很好奇是否有iOS架构师必须在某个时间点处理这个问题,或者他们可能会如何处理它。
发布于 2012-08-01 12:13:28
这不是一个特定于iOS的问题,而是一个面向对象的设计问题。
你一定要避免代码重复。重复是万恶之源。
通常,您要做的是避免在设计类时受到继承限制的限制。你想要转向的是类的组合。
因此,您可以使用bridge pattern进行如下所示的设计
ParentVC ---> ImplementationA
| | | |
ChildA ChildB Implementation_iPhone Implementation_iPad在这里,ParentVC具有与上面相同的类层次结构,但它使用一个单独的类层次结构ImplementationA来实现。这个类层次结构分为iPhone和iPad两个版本。类ImplementationA包含了ParentVC中的实现的核心。
继承是一种设计模式,但它只是众多模式中的一个。如果你只坚持使用一个模式,你就会陷入糟糕的设计中。您需要组合模式来正确地对系统进行建模。
当然,请确保尽可能多地使用单元测试,以确保在进行这些更改时不会破坏任何内容。
https://stackoverflow.com/questions/11752240
复制相似问题