Побочные эффекты в итераторе, который рассматривают вредным?

Хорошо, так что я нашел решение. Инструкция по применению - pmullw. Инструкция pmullw mm0, mm1 вычислит произведение 4 слов в регистрах по порядку и сохранит их в mm0. А что касается проблемы printf, я просто нажал другой регистр, rdx, прежде чем вызывать его, и теперь он работает. Я предполагаю, что это как-то связано с упомянутым смещением стека. Если бы кто-то мог объяснить мне более подробно, как это работает, было бы здорово.

5
задан skaffman 20 March 2012 в 14:21
поделиться

8 ответов

Итераторы с побочными эффектами являются ПЛОХИМ mkay?:)

Если у Вас есть последовательность, содержащая все файлы, у Вас может быть что-то выход посетителя, который посещает все объекты и вызывает функцию для каждого случая. Дискриминация в посетителе может быть или как предикат, который можно предоставить, или внутренний в посетителе.

Так, я не говорю C#, но что-то вроде этого псевдо код:

good_handler = new FileHandler() {
  handle(File f) { print "Yay!"; }
}

bad_handler = new FileHandler() {
  handle(File f) { print "Nay!"; }
}

files = YourFileSequence();
visitor = new Visitor(good_handler, bad_handler);
visitor.visit(files);
4
ответ дан 14 December 2019 в 01:20
поделиться

Я сказал бы, что это обычно - плохая идея иметь побочные эффекты в итераторе, но это не полное нет - нет. Если у Вас есть побочные эффекты, это делает твердым/невозможным для вызывающих сторон работать чисто функциональным способом. Это может или не может быть проблемой в зависимости от Вашего варианта использования.

Я предлагаю, чтобы у Вас было два способа получить итератор - тот, который имеет побочный эффект (который является, по-видимому, оптимизацией, в основном), и тот, который не делает (медленнее, но более простой рассуждать о). Это могло просто быть путем передачи флага в метод или именования двух методов по-другому.

3
ответ дан 14 December 2019 в 01:20
поделиться

Мое эмпирическое правило - то, если я выполняю итерации по набору, нет. Но в Python, для цикла часто используется идиоматически для выполнения кода определенное количество раз, в этом случае у меня нет проблемы с помощью него с побочными эффектами.

0
ответ дан 14 December 2019 в 01:20
поделиться

Итераторы, которые являются логически перечислениями по наборам, не должны иметь побочных эффектов, нет. В частности, они не будут идемпотентом при перезапуске с IEnumerator. Сброс () метод.

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

1
ответ дан 14 December 2019 в 01:20
поделиться

Я думаю, что существует на самом деле более непосредственное беспокойство, чем то, что Ваш итератор скрыл побочные эффекты. Который является: Вы изменяете членство набора, которого оно выполняет итерации. Даже если бы побочные эффекты не имели плохого запаха кода, то это было бы чем-то, относительно чего необходимо было бы быть осторожны. Существуют способы, которыми Вы могли реализовать это, которое могло бы казаться разумным (кэшируйте список файлов и снова используйте его при сбросе итератора, скажите), что повреждение при удалении вещей из набора.

0
ответ дан 14 December 2019 в 01:20
поделиться

Спасибо люди - и вот это да! быстрые ответы!

Я должен согласиться, что побочные эффекты в итераторе являются плохой идеей. То, что я должен был спросить, указывает на запах. Должен был слушать мой spidey-смысл.

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

Кроме того, я думаю, что объединил идею посетителя с итератором, который является также не хорошей идеей.

Я с тех пор изменил свою реализацию для создания 2 последовательностей из моей исходной последовательности всех файлов - одна хорошая, одна плохая. Я могу теперь обработать их более очевидным и интуитивным способом. Ура.

Так, я все еще не использовал итератор в Реальном мире. О, хорошо.

Спасибо! Матовый

0
ответ дан 14 December 2019 в 01:20
поделиться

Я не прокомментирую общий случай, но в Вашем случае, я думаю, что это опасно. Хорошая метрика по интерфейсному качеству - то, как легкий это должно использовать интерфейс правильно и как трудно это должно использовать его неправильно.

Применяя ту метрику, Ваши очки дизайна довольно низко, потому что это невероятно просто в использовании это неправильно: просто выполните итерации по нему дважды.

Я на самом деле пошел бы далее, чем Jon и сказал бы: даже не предлагайте опцию. Это могло бы быть полезно, но цена потенциального использования этой несправедливости могла бы быть слишком высокой. С другой стороны, можно было утверждать, что, если пользователь намеренно делает выбор, он должен иметь дело с последствиями.

0
ответ дан 14 December 2019 в 01:20
поделиться

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

В этом случае Вы перемещаете плохие файлы из папки и чего-то еще в хорошие файлы. Разделение этих операций позволяет Вам перемещать плохие файлы, не выбирая хорошие или позволяет Вам воздействовать на хорошие файлы (те, которые считают их), не перемещая плохие. Ваш код будет также более разделен так, будет легче оптимизировать одну из этих операций, должен Вы нуждаться к.

0
ответ дан 14 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: