首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >希望重构objective-c UIViewController iPad/iPhone

希望重构objective-c UIViewController iPad/iPhone
EN

Stack Overflow用户
提问于 2012-08-01 11:37:42
回答 1查看 467关注 0票数 0

我继承了一个长期维护代码库,它有两个截然不同的iPhone和iPad视图。这创建了一个大的UIViewController类,它已经膨胀到超过1k行代码,是ISIPAD语句、私有变量、属性、iBOutlet/动作的混搭,例如,对一个实现使用UITableView,对另一个实现使用完全不同的东西。

更糟糕的是,当前的软件模式依赖于子类化。

目前我们看起来是这样的:

代码语言:javascript
复制
ParentVC (both iphone/ipad God class also has xib(xib~ipad) + iboutlets/actions)
      |         |            |
    ChildA    ChildB       ChildC

我最初的想法是把ParentVC分成专门的iPhone/iPad类

代码语言:javascript
复制
               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架构师必须在某个时间点处理这个问题,或者他们可能会如何处理它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-01 12:13:28

这不是一个特定于iOS的问题,而是一个面向对象的设计问题。

你一定要避免代码重复。重复是万恶之源。

通常,您要做的是避免在设计类时受到继承限制的限制。你想要转向的是类的组合。

因此,您可以使用bridge pattern进行如下所示的设计

代码语言:javascript
复制
  ParentVC           --->             ImplementationA
   |    |                               |            |
ChildA ChildB                 Implementation_iPhone Implementation_iPad

在这里,ParentVC具有与上面相同的类层次结构,但它使用一个单独的类层次结构ImplementationA来实现。这个类层次结构分为iPhone和iPad两个版本。类ImplementationA包含了ParentVC中的实现的核心。

继承是一种设计模式,但它只是众多模式中的一个。如果你只坚持使用一个模式,你就会陷入糟糕的设计中。您需要组合模式来正确地对系统进行建模。

当然,请确保尽可能多地使用单元测试,以确保在进行这些更改时不会破坏任何内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11752240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档