我只是在重构时偶然发现了一段奇怪的代码.它似乎是一个候选因素,用于分解两个readString() - 方法的共同部分,只是它似乎是不可能的(这对我来说是一个令人讨厌的脑筋急转弯):
private final StringBuilder readStringBuilder = new StringBuilder(128);
@Override
public String readString() throws IOException {
final int l = readInt();
if (l <= 0) {
switch (l) {
case -1: return null;
case 0: return "";
default: throw new IOException("invalid string length encoding: " + l);
}
}
readStringBuilder.setLength(0);
for (int i=0; i<l; ++i) {
readStringBuilder.append(readChar());
}
return readStringBuilder.toString();
}
@Override
public String readString(final StringCache cache) throws IOException {
final int l = readInt();
if (l <= 0) {
switch (l) {
case -1: return null;
case 0: return "";
default: throw new IOException("invalid string length encoding: " + l);
}
}
readStringBuilder.setLength(0);
for (int i=0; i<l; ++i) {
readStringBuilder.append(readChar());
}
return cache.get(readStringBuilder, readStringBuilder);
}
Run Code Online (Sandbox Code Playgroud)
您会看到两个方法几乎完全相同,方法体完全相同,但return语句除外.但由于有早期终止退出,我找不到可以占用主体的方法签名 - 自然返回类型将是StringBuilder,只有在早期终止的情况下它才是String ...
任何想法如何将身体分解为一个单独的方法?(并注意空StringBuilder上的toString()会创建一个新的String,而不是返回一个常量字符串文字)
编辑:StringCache的定义是:
public interface StringCache {
public String get(final CharSequence charSeq, final CharSequence notFoundResult);
}
Run Code Online (Sandbox Code Playgroud)
你不能只创建一个readStringBuilder适当填充的私有方法吗?
然后两种readString()方法都使用它,并get()在缓存上执行a ,或者toString()在readStringBuilder?
根据Composed Method重构,值得考虑这一点,其原则是:
组合方法说每个方法应该只做一件事
当你遵守这一点时,你的方法通常会变得可重用(可组合).
通过这次重构练习我取得了什么成果?....现在我有了小的构建块,方法重用变得更容易,因为现在我可以混合和匹配它们
见尼尔·福特的文章组合方法重构这里.另见Martin Fowler的' extractMethod '重构.