代码之家  ›  专栏  ›  技术社区  ›  karanatwal.github.io

类扩展中的If条件

  •  1
  • karanatwal.github.io  · 技术社区  · 6 年前

    在Android应用程序中。我有一个要求 HomeActivity (有18000行代码)如果我的设备支持 ARCore ,我想要 家庭活动 延伸 ARBaseACtivity 如果设备不支持 阿科尔 那么我需要它来扩展 NonARBaseActivity .

    我在启动屏幕上检查这个情况。

    现在,有一种方法首先是我做两个活动,一个是 家庭活动 但我想知道有没有更好的办法。因为我不想每次在 家庭活动 .

    失望的选民请在下面发表评论,这样我就能改进我的错误。谢谢!!

    2 回复  |  直到 6 年前
        1
  •  6
  •   GhostCat    6 年前

    技术上的答案是: 可能的。

    在Java中,继承结构是固定的。一个C类不可能在一个上下文中扩展A类,而在另一个上下文中扩展B类。当你想这样做的时候,你会有两个类,C1和C2。

    当然,真正的答案是:你必须退后一步,清楚地 建筑师 你的全部解决方案。只有18K线 无论什么迹象表明这里出了严重的问题。有人会提到老好人 FCoI 原理,但是:18K行代码意味着很多代码和特性。在stackoverflow上,一个答案就不可能给你正确的指导。

    所以,固执己见:你应该退后一步,找一些(架构)专家谈谈。然后和他们坐下来(可能几个小时,甚至几天),看看你有什么,你想去哪里。然后一起走上这条路。其他什么都不是,只是把创可贴的症状。当然,如果你不那样做什么都不会坏。但是每向前一步都会增加 混乱 混乱 使每一步都更加昂贵。迟早,改变你的巨石将变得几乎不可能,每个人都会要求“扔掉它,从头开始”。

        2
  •  2
  •   davidxxx    6 年前

    作为对鬼猫优秀答案的补充,我将在OOP中给您一个非常重要的提示:增强 运行时 对象的行为,装饰模式通常是一种考虑的方式。

    在这里 HomeActivity 作为装饰和 ARBaseACtivity NonARBaseActivity 以装饰者的身份出现。
    你应该定义一个 MyActivity 接口,它是装饰对象和装饰对象的基类。

    所以事情并不简单,因为你必须重构许多代码行,但是它会使你的设计更灵活,并且具有一致的职责的类,而不是有神对象作为活动。

    最后,在启动屏幕中,您可以定义一个方法,该方法返回一个修饰 家庭活动 根据检测到的客户资料:

    public MyActivity computeHomeActivity(){
    
        HomeActivity activity = new HomeActivity();
    
        if (isSupportARCore()){
           return new ARBaseACtivity(activity);
        }
        return new NonARBaseActivity(activity);
    
    }