Внедрение зависимости с Guice: Что-то, что не охвачено никаким учебным руководством

Коды в блоке операторов else будут выполняться, когда цикл for не был прерван.

for x in xrange(1,5):
    if x == 5:
        print 'find 5'
        break
else:
    print 'can not find 5!'
#can not find 5!

Из документов: операторы break и continue, а также предложения о циклах

Операторы цикла могут содержать предложение else; он выполняется, когда цикл завершается из-за исчерпания списка (с помощью for) или когда условие становится ложным (с помощью while), но не тогда, когда цикл завершается оператором break. Это иллюстрируется следующим циклом, который ищет простые числа:

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

(Да, это правильный код. Посмотрите внимательно: предложение else принадлежит циклу for, а не оператору if.)

При использовании с циклом предложение else имеет больше общего с предложением else оператора try, чем с инструкциями if: предложение else оператора try выполняется, когда не возникает исключение, и else цикла Предложение выполняется, когда не происходит перерыв. Подробнее об операторе try и исключениях см. Обработка исключений.

Оператор continue, также заимствованный из C, продолжает следующую итерацию цикла:

>>> for num in range(2, 10):
...     if num % 2 == 0:
...         print("Found an even number", num)
...         continue
...     print("Found a number", num)
Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9

8
задан Malax 10 September 2009 в 09:15
поделиться

3 ответа

Это может помочь разделить зависимости от данных .

  • Зависимости часто представляют собой службы: базы данных, часы и заглушки RPC. Плюс весь код приложения, размещенный на этих: UserAuthenticator , PaymentHandler и EmailGateway .
  • Данные только что: a Date , Map или даже Customer . Это простые объекты домена в памяти.

DI, естественно, лучше всего подходит для зависимостей. Вы должны продолжать использовать новый для своих классов модели данных.

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

Если вы создаете несколько экземпляров, таких как отдельные клиенты, нет смысла вводить их. имеет смысл создать CustomerFactory, который может быть областью @Singleton, который может создавать экземпляры Customer со всеми его зависимостями.

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

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

2
ответ дан 3 November 2019 в 14:20
поделиться
Другие вопросы по тегам:

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