首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码重构帮助

代码重构帮助
EN

Stack Overflow用户
提问于 2010-10-19 07:59:17
回答 4查看 164关注 0票数 2

我有一个这样的例子

代码语言:javascript
复制
class A {

   A() {}
   public C createC () {
      ...
   }

} 

class B {

   B() {}
   public C createC () {

   }
}

A和B的对象是基于

代码语言:javascript
复制
public enum D { ii, jj };

我看到到处都是代码,比如

代码语言:javascript
复制
D d; 

switch (d) {
    case ii: (new A()).createC(); break;
    case jj: (new B()).createC(); break;
 };

我怎样才能避免到处都是开关的情况?我知道代码不是很清楚。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-19 10:30:08

我倾向于将create代码添加到枚举中。

代码语言:javascript
复制
enum D {
    ii {
        public void createC() { new A().createC(); }
    },
    jj {
        public void createC() { new B().createC(); }
    };

    public abstract void createC();
}

然后,您可以将开关替换为

代码语言:javascript
复制
d.createC();

话虽如此,我还会考虑使createC方法成为静态方法,或者将createC代码移到枚举中,而不是将其留在A和B类中。

如果将A和B中的createC方法设为静态,则枚举将如下所示

代码语言:javascript
复制
enum D {
    ii {
        public void createC() { A.createC(); }
    },
    jj {
        public void createC() { B.createC(); }
    };

    public abstract void createC();
}
票数 3
EN

Stack Overflow用户

发布于 2010-10-19 08:09:52

您可以只创建一个Factory类:

代码语言:javascript
复制
public class ClassFactory {

     public static C createC(D type) {
         C c = null;
         switch (type) {
              case ii: 
                  c = new A(); 
                  break;
              case jj: 
                  c = new B(); 
                  break;
         };

         return c;

     }
}

然后在你的代码中这样做:

代码语言:javascript
复制
C c = ClassFactory.createC(type);

Factory method pattern的维基词条对其PizzaFactory所做的非常相似。

票数 3
EN

Stack Overflow用户

发布于 2010-10-19 08:12:41

我在这里看不到重构的机会。

我认为有必要建一座工厂。查找“工厂”设计模式。

我看到到处都是代码,就像...(后面跟着一个条件,其中创建了一个特定的实例)_是一个巨大的提示。

基本上,你要做的就是把决定实例化哪个类的所有丑陋的事情都推到一个地方。首先,在您的示例中,A和B应该共享一个超类,或者更好地实现一个定义了public C createC()的接口。

工厂只不过是一个带有静态方法的类,它决定实例化哪个A或B。

代码语言:javascript
复制
    public class SomeFactory {
        public static YourInterface make(int someNumber) {
            switch (someNumber) {
                case 1: return new A();
                case 2: return new B();
                default:
                    throw new RuntimeException("unknown type");
                }
            }
        }

所以你要做的是:

代码语言:javascript
复制
YourInterface yi = SomeFactory.make(1);
C c = yi.createC();

代码语言:javascript
复制
C c = SomeFactory.make(1).createC();

现在你的代码已经很干净了。是否创建SomeInterface的新实现?没问题,将它的创建添加到工厂中,您的代码仍然可以工作。如果对于你的应用程序来说,make()是昂贵的,没有问题,只需制作一个并重复使用它。

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

https://stackoverflow.com/questions/3964419

复制
相关文章

相似问题

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