Смысл и разделение в рефакторинге

У меня был этот код в моем классе

IAdInfo adInfo;
......
// ad unit ID
String adUnitId = null;
if (!StringUtils.isEmpty(adInfo.getHost()) && !StringUtils.isEmpty(adInfo.getZoneId())) {
    adUnitId = adInfo.getHost() + "," + adInfo.getZoneId();
} else if (!StringUtils.isEmpty(adInfo.getAdUnitId())) {
    adUnitId = adInfo.getAdUnitId();
}

проблема в том, что IAdInfo больше не содержит getHost() и getZoneId(), поскольку они были перемещены в соответствующий интерфейс IAudioAdInfo.

Поэтому я изменил его на это:

// ad unit ID
String adUnitId = null;
if (adInfo instanceof IAudioAdInfo) {
    IAudioAdInfo audioAdInfo = (IAudioAdInfo) adInfo;
    if (!StringUtils.isEmpty(audioAdInfo.getHost()) && !StringUtils.isEmpty(audioAdInfo.getZoneId())) {
        adUnitId = audioAdInfo.getHost() + "," + audioAdInfo.getZoneId();
    } else if (!StringUtils.isEmpty(adInfo.getAdUnitId())) {
        adUnitId = adInfo.getAdUnitId();
    }
} else {
    if (!StringUtils.isEmpty(adInfo.getAdUnitId())) {
        adUnitId = adInfo.getAdUnitId();
    }
}

Но это было слишком коряво, поэтому я создал локальные переменные, чтобы сделать его более читабельным:

// ad unit ID
String adUnitId = null;
if (adInfo instanceof IAudioAdInfo) {
    IAudioAdInfo audioAdInfo = (IAudioAdInfo) adInfo;
    String host = audioAdInfo.getHost();
    String zoneId = audioAdInfo.getZoneId();

    if (!StringUtils.isEmpty(host) && !StringUtils.isEmpty(zoneId)) {
        adUnitId = host + "," + zoneId;
    } else if (!StringUtils.isEmpty(adInfo.getAdUnitId())) {
        adUnitId = adInfo.getAdUnitId();
    }
} else {
    if (!StringUtils.isEmpty(adInfo.getAdUnitId())) {
        adUnitId = adInfo.getAdUnitId();
    }
}

И тут я понял, что на самом деле нужно предоставить только adUnitId и я могу перенести его в реализацию интерфейса.

Вот что я получил в своем первоначальном классе:

String adUnitId = null;
if (!StringUtils.isEmpty(adInfo.getAdUnitId())) {
    adUnitId = adInfo.getAdUnitId();
}

И в моей реализации интерфейса IAudioAdInfo:

@Override
public String getAdUnitId() {
    if (!StringUtils.isEmpty(mHost) && StringUtils.isEmpty(mZoneId)) {
        return mHost + "," + mZoneId;
    } else {
        return super.getAdUnitId();
    }
}

Несколькими строками ниже я увидел, что уже есть проверка на пустое значение adUnitId, поэтому я упростил ее:

String adUnitId = adInfo.getAdUnitId();

if (StringUtils.isEmpty(adUnitId)) {
    LogHelper.e(LogHelper.TAG, "AdReporter: no host/zoneId or adUnitId, can't report");
    return;
}

Надеюсь, это поможет вам в рефакторинге и написании лучшего кода.