Практика запроса зависимости в вызове при программировании интерфейсов? - PullRequest
0 голосов
/ 06 декабря 2010

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

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

Существует множество различных примеров. Это то, что пришло в голову первым:

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

interface DataAccess {

    // Note to callers: this init must be called first and only once.
    void InitSelf(); 

    // operation: get the record having the given id
    T Op_GetDataValue<T>(int id); 
    // operation: get a cound
    int Op_GetCountOfData(); 
    // operation: persist something to the data store        
    void Op_Persist(object o);         
    //etc.
}

Однако вызывающая сторона может предпочесть не вызывать метод инициализации первым.

В общем, мне интересно, есть ли лучшие способы для этой ситуации.

Ответы [ 3 ]

1 голос
/ 06 декабря 2010

Другие методы могут вызывать исключение, если объект не инициализирован, или вы можете использовать более строгий API.Это было бы более сложно реализовать, но, например, InitSelf () мог бы возвращать интерфейс, содержащий операции с данными:

interface DataAccess {
    DataOperations InitSelf();
}

interface DataOperations {
    T Op_GetDataValue<T>(int id);

    ...
}

Это бы потребовало инициализации потребителя перед выполнением операций, хотя это былоспособы обойти это.

0 голосов
/ 06 декабря 2010

Любая инициализация должна быть сделана в конструкторе. Клиенты интерфейса DataAccess не должны беспокоиться о деталях конструкции.

0 голосов
/ 06 декабря 2010

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

Я думаю, что присвоение имен InitXXX является хорошим признаком того, что это так.

Для более странных зависимостей (не для Init, что очень распространено), вероятно, было бы лучше не иметь зависимости.

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

Типичным примером является интерфейс базы данных. Вы вызываете соединение, оно возвращает соединение. Вы вызываете createStatement для соединения, он возвращает инструкцию. Вы вызываете setParam для оператора, вы вызываете runStatement для оператора, затем вы получаете результат и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...