0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: интерфейс, go, golang</p>
1
<p>Теги: интерфейс, go, golang</p>
2
<p>Когда тип существует лишь для реализации интерфейса (он никогда не станет экспортировать методы за пределы этого интерфейса), то отпадает надобность в том, чтобы экспортировать сам тип. Если же экспортировать только интерфейс, это даст понять, что у значения отсутствует какое-нибудь поведение кроме того, что описано в интерфейсе. Вдобавок к вышесказанному, исчезает необходимость в повторении документации на каждый случай общего метода.</p>
2
<p>Когда тип существует лишь для реализации интерфейса (он никогда не станет экспортировать методы за пределы этого интерфейса), то отпадает надобность в том, чтобы экспортировать сам тип. Если же экспортировать только интерфейс, это даст понять, что у значения отсутствует какое-нибудь поведение кроме того, что описано в интерфейсе. Вдобавок к вышесказанному, исчезает необходимость в повторении документации на каждый случай общего метода.</p>
3
<p>В ситуации, описанной выше,<strong>конструктор обязан возвращать не тип реализации, а значение интерфейса</strong>. В качестве примера можно привести то, что в хэш-библиотеках<strong>adler32.New</strong>и<strong>crc32.NewIEEE</strong>возвращают тип интерфейса<strong>hash.Hash32</strong>. Таким образом, подстановка алгоритма<strong>CRC-32</strong>для Adler-32 в Golang-программе потребует лишь изменения вызова конструктора, так как остальная часть кода является независимой от изменения алгоритма.</p>
3
<p>В ситуации, описанной выше,<strong>конструктор обязан возвращать не тип реализации, а значение интерфейса</strong>. В качестве примера можно привести то, что в хэш-библиотеках<strong>adler32.New</strong>и<strong>crc32.NewIEEE</strong>возвращают тип интерфейса<strong>hash.Hash32</strong>. Таким образом, подстановка алгоритма<strong>CRC-32</strong>для Adler-32 в Golang-программе потребует лишь изменения вызова конструктора, так как остальная часть кода является независимой от изменения алгоритма.</p>
4
<p>Такой подход дает возможность алгоритмам потокового шифра в разных пакетах<strong>crypto</strong>быть отделенными от блочных шифров, которые они объединяют в единое целое. При этом интерфейс<strong>Block</strong>в crypto/cipher-пакете указывает поведение блочного шифра, обеспечивающего шифрование одного блока данных. Далее, по аналогии с bufio-пакетом, пакеты шифров, реализующие данный интерфейс, смогут использоваться в целях построения потоковых шифров, которые представлены посредством интерфейса Stream, то есть без детальных знаний блока шифрования.</p>
4
<p>Такой подход дает возможность алгоритмам потокового шифра в разных пакетах<strong>crypto</strong>быть отделенными от блочных шифров, которые они объединяют в единое целое. При этом интерфейс<strong>Block</strong>в crypto/cipher-пакете указывает поведение блочного шифра, обеспечивающего шифрование одного блока данных. Далее, по аналогии с bufio-пакетом, пакеты шифров, реализующие данный интерфейс, смогут использоваться в целях построения потоковых шифров, которые представлены посредством интерфейса Stream, то есть без детальных знаний блока шифрования.</p>
5
<p>Давайте теперь посмотрим, как выглядят<strong>crypto/cipher</strong>-интерфейсы:</p>
5
<p>Давайте теперь посмотрим, как выглядят<strong>crypto/cipher</strong>-интерфейсы:</p>
6
<p>Ниже -- определение потока в режиме CTR-счетчика, превращающего блочный шифр в потоковый шифр. Важно отметить, что детали блочного шифра являются абстрагированными:</p>
6
<p>Ниже -- определение потока в режиме CTR-счетчика, превращающего блочный шифр в потоковый шифр. Важно отметить, что детали блочного шифра являются абстрагированными:</p>
7
<p>Итак,<strong>NewCTR</strong>используется не только и не столько для одного конкретного алгоритма шифрования и источника данных, сколько для любой реализация Block-интерфейса, да и любого Stream. А так как они возвращают значения интерфейса, то замена CTR-шифрования иными режимами шифрования будет считаться локализованным изменением. При этом вызовы конструктора следует отредактировать, но так как окружающий код обязан обрабатывать результат лишь как Stream, то и разница замечена не будет.</p>
7
<p>Итак,<strong>NewCTR</strong>используется не только и не столько для одного конкретного алгоритма шифрования и источника данных, сколько для любой реализация Block-интерфейса, да и любого Stream. А так как они возвращают значения интерфейса, то замена CTR-шифрования иными режимами шифрования будет считаться локализованным изменением. При этом вызовы конструктора следует отредактировать, но так как окружающий код обязан обрабатывать результат лишь как Stream, то и разница замечена не будет.</p>
8
<p><em>По материалам https://golang-blog.blogspot.com/.</em></p>
8
<p><em>По материалам https://golang-blog.blogspot.com/.</em></p>
9
9