Я не вижу никаких проблем с наличием метода, который выполняет обе функции - вам просто нужно правильно назвать его:
DemoOption demoOption = getDemoOption();
if (demoOption.wasSpecified()) {
int timeout = demoOption.getValue();
doDemoVersion(timeout);
}
else {
doRealVersion();
}
Вы можете даже упростить его, и метод вернет значение,или ноль, если опция не была установлена:
Integer demoTimeout = getDemoOptionIfSpecified();
if (demoTimeout != null) {
doDemoVersion(demoTimeout);
}
else {
doRealVersion();
}
А потом я бы сделал метод универсальным:
Integer demoTimeout = getOptionIfSpecified("demo", Integer.class);
if (demoTimeout != null) {
doDemoVersion(demoTimeout);
}
else {
doRealVersion();
}
Я не вижу в этом метода, которыйделает две вещи.Единственное, что он делает, это «получает значение опции, если она есть».Затем вы можете задать два вопроса о результате - есть ли один, и какова его ценность?- но это происходит в коде вызова.
Если вы настаиваете на том, чтобы не возвращать значение, пока оно не понадобится, как насчет его внедрения?
interface OptionHandler<T> {
public void specified(T optionValue);
public void notSpecified();
}
handleOptionIfSpecified("demo", new OptionHandler<Integer>() {
public void specified(Integer timeout) {
doDemoVersion(timeout);
}
public void notSpecified() {
doRealVersion();
}
});
А если серьезно, если я читал вашекода, и я увидел что-то кроме третьей версии, я бы увидел чрезмерное усложнение и начать рефакторинг.Фраза умозрительного получения значения и работы с нулевыми и ненулевыми случаями по-разному широко распространена (по крайней мере, в Java);никакая полезная цель не достигается, избегая ее в погоне за какой-то условной чистотой.