避免重复代码的好策略

假设我有以下情况:

public class A { public String createString(final String value){ if (value == null){ throw new NullPointerException("value must NOT be null."); } final StringBuffer sb = new StringBuffer(); sb.append("A"); sb.append("B"); sb.append("C"); if (value.length() > 3){ sb.append("D"); sb.append("E"); } sb.append("Z"); return sb.toString(); } } 

另一个类应该做类似的任务:

 public class B { public String createString(final String value){ if (value == null){ throw new NullPointerException("value must NOT be null."); } final StringBuffer sb = new StringBuffer(); sb.append("A"); sb.append("B"); sb.append("C"); sb.append("Z"); return sb.toString(); } } 

什么是避免重复代码的好策略? 到目前为止我想到的是B类具有A的子集function,因此应该从A类扩展并且相同的任务应该重构为受保护的方法(假设它们在同一个包中)。 这就是它的样子:

 public class A { public String createString(final String value){ final StringBuffer sb = createTheFirstPart(value); if (value.length() > 3){ sb.append("D"); sb.append("E"); } createTheLastPart(sb); return sb.toString(); } protected void createTheLastPart(final StringBuffer sb) { sb.append("Z"); } protected StringBuffer createTheFirstPart(final String value) { if (value == null){ throw new NullPointerException("value must NOT be null."); } final StringBuffer sb = new StringBuffer(); sb.append("A"); sb.append("B"); sb.append("C"); return sb; } } 

而Bclass:

 public class B extends A { public String createString(final String value){ final StringBuffer sb = createTheFirstPart(value); createTheLastPart(sb); return sb.toString(); } } 

另一种可能的解决方案是这样的:

 public class A { public String createString(final String value){ if (value == null){ throw new NullPointerException("value must NOT be null."); } final StringBuffer sb = new StringBuffer(); sb.append("A"); sb.append("B"); sb.append("C"); addSomeSpecialThings(value, sb); sb.append("Z"); return sb.toString(); } protected void addSomeSpecialThings(final String value, final StringBuffer sb) { if (value.length() > 3){ sb.append("D"); sb.append("E"); } } } 

和B级:

 public class B extends A { public String createString(final String value){ return super.createString(value); } protected void addSomeSpecialThings(final String value, final StringBuffer sb) { // do nothing } } 

显然这不是那么好,因为B有空的impl。 addSomeSpecialThings。 这个例子也很简单。 例如,方法中可能存在更多差异,因此提取相同的function并不容易。

我的解决方案都是关于inheritance的,也许最好用组合来做这件事。 我还认为这可能是战略模式的一个因素。

那么这种问题的最佳方法是什么? 在此先感谢您的帮助。

裤裤。

我会将共享代码放在A和B的超类中:

 public abstract class SomeName { public final String createString(final String value){ if (value == null){ throw new NullPointerException("value must NOT be null."); } final StringBuffer sb = new StringBuffer(); sb.append("A"); sb.append("B"); sb.append("C"); addSomeSpecialThings(value, sb); sb.append("Z"); return sb.toString(); } protected abstract void addSomeSpecialThings(final String value, final StringBuffer sb); } 

然后B看起来像这样:

 public class B extends SomeName { protected void addSomeSpecialThings(final String value, final StringBuffer sb) {} } 

这将是A:

 public class A extends SomeName { protected void addSomeSpecialThings(final String value, final StringBuffer sb) { if (value.length() > 3){ sb.append("D"); sb.append("E"); } } } 

所描述的情况相当简单。 我认为inheritance在这里是可以的,但我建议创建一个带有空实现的addSomeSpecialThings的基类,然后inheritance两个类A和B,并覆盖该方法。

策略模式是合适的,但不是在这种简单的情况下。 对于实现模式所需的开销,有两种情况太少。

在这种简单的代码中,没有必要考虑因素而牺牲可读性。 组合与inheritance选择只会与更现实的例子有关,也更明显。