2015-08-28 2 views
2

ради вопроса, скажем, у меня есть криптографический модуль opensslCryptographicModule, которые имеют следующие методы:зависимости остерегайтесь между модулями

public String encrypt(String content, String key); 
public String decrypt(String encrypted, String key); 

И в другой модуль, давайте назовем его MainModule, который нуждается в криптографический модуль для работы ,

Поскольку криптографический модуль используется в MainModule может измениться Я создал интерфейс следующим образом:

public interface CryptographicModule { 
    public String encrypt(String content, String key); 
    public String decrypt(String encrypted, String key); 
} 

И MainModule принимает CryptographicModule в конструктор.

Мой вопрос в том, как сохранить криптографический модуль полностью независимым?

Если я поместил интерфейс в MainModule, тогда opensslCryptographicModule должен будет реализовать интерфейс, объявленный в другом проекте, и поэтому будет зависеть от этого проекта.

Но если я поместил интерфейс в opensslCryptographicModule, тогда другим криптографическим модулям понадобится opensslCryptographicModule, чтобы получить интерфейс.

Единственное решение, которое я вижу, - это третий модуль, который сделает связь между обоими модулями.

Он реализует интерфейс (который будет в MainModule), используя шаблон адаптера для обеспечивает функциональные возможности криптографического модуля:

public class OpenSSLCryptographicModuleAdapter implements CryptographicModule { 

    private OpensslCryptographicModule module;  

    public OpenSSLCryptographicModuleAdapter(OpensslCryptographicModule module) { 
     this.module = module 
    } 

    @Override 
    public String encrypt(String content, String key) { 
     //... 
    } 

    @Override 
    public String decrypt(String encrypted, String key) { 
     //... 
    } 
} 

И MainModule будет опираться на третий модуль для работы.

Но я нахожу это немного излишним, особенно когда мы контролируем все модули. Эта схема дизайна великолепна при использовании сторонней библиотеки или если мы хотим работать с каким-то старым кодом, но не тогда, когда весь проект написан.

+2

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

+0

Да, это может быть решение, но я уже знаю, что у меня будет как минимум 2 реализации – darkheir

+0

По модулю, вы имеете в виду файл .java? – aglassman

ответ

2

Ваш анализ верен, включая часть, в которой вы заявляете, что это может быть излишним. Это фундаментальная часть «шаблонов дизайна», которые люди часто пропускают. Иногда преимущество применения шаблона (развязки и т. Д.) Не перевешивает стоимость (что часто бывает «сложностью»). Часть техники выясняет, стоит ли компромисс.
Три модуля могут быть хорошей идеей, или это может быть излишним для вашего дела; это действительно зависит от специфики вашего проекта. Может быть, неплохо начать с более простой настройки, а затем определить интерфейсы позже, так как вы обнаружите, где находятся соответствующие абстракции. Нельзя дать общее правило для чего-то подобного.

0

Вы можете сделать OpenSSLCryptographicModule и абстрактный класс и сделать шифрование и расшифровку абстрактных методов. Тогда у вас будет только один базовый абстрактный класс и еще один конкретный класс для каждой реализации.

Смежные вопросы