Скрыть реализацию служебной шины за интерфейсами

Для человека без comp-sci фона, что такое лямбда в мире компьютерных наук?

Я проиллюстрирую его интуитивно шаг за шагом в простой и понятной форме python.

Короче говоря, лямбда - это просто анонимная и встроенная функция.

Давайте начнем с назначения, чтобы понять lambdas как первокурсник с фоном базовой арифметики.

Схема присвоения - это «имя = значение», см.:

In [1]: x = 1
   ...: y = 'value'
In [2]: x
Out[2]: 1
In [3]: y
Out[3]: 'value'

«x», «y» - это имена и 1, «значение» - значения. Попробуйте функцию в математике

In [4]: m = n**2 + 2*n + 1
NameError: name 'n' is not defined

Отчеты об ошибках, вы не можете написать математику непосредственно в качестве кода, «n» должно быть определено или присвоено значению.

In [8]: n = 3.14
In [9]: m = n**2 + 2*n + 1
In [10]: m
Out[10]: 17.1396

Теперь он работает, что если вы настаиваете на объединении двух линий seperarte с одним. Наступает lambda

In [13]: j = lambda i: i**2 + 2*i + 1
In [14]: j
Out[14]: >

Не сообщалось об ошибках.

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

Мы увидим это позже.

Давайте продолжим углубляться в «присвоение».

Как показано выше, символ равенства = работает для простых данных (1 и «значение») и простого выражения (n ** 2 + 2 * n + 1).

Попробуйте следующее:

In [15]: x = print('This is a x')
This is a x
In [16]: x
In [17]: x = input('Enter a x: ')
Enter a x: x

Он работает для простых операторов, в python 7 имеется 11 типов. Простые инструкции - Документация Python 3.6.3

Как насчет составной инструкции,

In [18]: m = n**2 + 2*n + 1 if n > 0
SyntaxError: invalid syntax
#or
In [19]: m = n**2 + 2*n + 1, if n > 0
SyntaxError: invalid syntax

Наступает def включить ее работу

In [23]: def m(n):
    ...:     if n > 0:
    ...:         return n**2 + 2*n + 1
    ...:
In [24]: m(2)
Out[24]: 9

Tada, проанализируйте его, 'm' - это имя, 'n ** 2 + 2 * n + 1' является значением. : является вариантом '='.

Теперь вернемся к lambda, у нас есть функция с именем «m»

Попробуйте:

g23]

In [28]: m = m(3)
In [29]: m
Out[29]: 16

Здесь есть два имени «m», функция m уже имеет имя, дублируется.

Это форматирование:

In [27]: m = def m(n):
    ...:         if n > 0:
    ...:             return n**2 + 2*n + 1
    SyntaxError: invalid syntax

Это не умная стратегия, поэтому отчеты об ошибках

Мы должны удалить одну из них, установить функцию без имени.

m = lambda n:n**2 + 2*n + 1

Это называется «анонимная функция»

В заключение,

  1. lambda в встроенной функции, которая позволяет вам написать функцию в одной прямой так же, как в математике
  2. lambda, Аноним

Надеюсь, это поможет.

0
задан Logan K 17 January 2019 в 03:29
поделиться

1 ответ

Если я правильно понимаю, вы не хотите, чтобы ваш код был связан с NServiceBus или MassTransit, и вы не хотите показывать, какой из них вы используете.

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

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

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

Затем, скрывая, какая реализация используется:
Что касается не разоблачения, используете ли вы NServiceBus или MassTransit, вы не можете. Если кто-то ссылается на вашу библиотеку, и это зависит от одного из этих пакетов, ему также придется добавить этот пакет. Предполагая, что ваша библиотека упакована для NuGet, этот пакет покажет свои зависимости.

0
ответ дан Scott Hannen 17 January 2019 в 03:29
поделиться
Другие вопросы по тегам:

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