Аргументы ввода-вывода и отсутствие аргументов с побочными эффектами - PullRequest
3 голосов
/ 14 января 2011

Лучше ли писать методы, которые не принимают аргументов и имеют побочные эффекты, меняют состояние объекта или методы с одним аргументом, берущие аргумент и обрабатывающие его?Если вторая альтернатива предпочтительнее, лучше возвращать входной аргумент явным образом или просто обрабатывать его, так как предполагается, что вызывающая сторона имеет ссылку на него.

Если быть более точным: я обрабатываю XML и получаюпрочитайте первые главы Чистого кодового сборника Я пытаюсь разделить метод Большой Обработки на множество маленьких, чтобы этот метод можно было прочитать как историю, в следующих строках:

cleanHeader();

extractMetaInfo();

appendStuff();

и т. Д., Где все эти методы работают с XML-документом, хранящимся в качестве члена.

ИМХО, наилучшие практики сокращения количества параметров по сравнению с отсутствием побочных эффектов здесь, похоже, противоречат друг другу.Было бы лучше написать следующее?

doc = cleanHeader(doc);

doc = extractMetaInfo(doc);

doc = appendStuff(doc);

Есть ли определенное «право» в этом вопросе?От какого контекста зависит определенный ответ?Или есть третий вариант, о котором я не задумывался?

РЕДАКТИРОВАТЬ: нашел связанный вопрос с противоречивыми ответами.Хотите уточнить?

Ответы [ 2 ]

1 голос
/ 26 января 2011

Если ваш algothimen может использоваться несколькими потоками параллельно, то способ, рекомендованный в чистой кодовой книге (statfull, но без аргументов), не будет работать. В этом случае вы должны использовать параметр way!

0 голосов
/ 21 января 2011

Я бы поспорил с точки зрения дизайна ОО. Если у вас есть куча методов, которые работают с одним и тем же объектом, таким как doc, то вам, вероятно, нужен класс, который упаковывает этот объект и инкапсулирует поведение в bigProcessingMethod (), который вызывает меньшие методы обработки, которые вы хотите разбить на задачу далее .

публичный класс DocUtil { частная строка документа;

public DocUtil(String doc)
{
     this.doc = doc;
}

public bigProcessingMethod()
{
     cleanHeader(doc);

 extractMetaInfo(doc);

 appendStuff(doc);

}

// и т.д.. }

Я неправильно понял ваш вопрос. Я не осознавал, что вы уже были внутри класса-обёртки, такого как DocUtil.

Независимо от того, передаете ли вы переменную doc явно каждому из методов обработки или нет, вы выполняете работу над одним и тем же объектом в одной и той же ячейке памяти. Единственная причина, по которой я передаю его каждый раз, это то, что это методы, которые работают с переменной doc.

Это зависит от вас.

...